mirror of
https://github.com/cyberarm/i-mic-rts.git
synced 2025-12-13 06:52:33 +00:00
Updated lobby to show map preview, misc.
This commit is contained in:
@@ -16,7 +16,7 @@ class IMICRTS
|
||||
raise "Failed to find entity: #{data[:entity].inspect}" unless ent
|
||||
|
||||
action.label = ent.name.to_s.split("_").map{ |s| s.capitalize }.join(" ")
|
||||
action.description = "Cost: #{ent.cost}\n#{ent.description}"
|
||||
action.description = "#{action.label}\nCost: #{ent.cost}\n#{ent.description}"
|
||||
action.block = proc do
|
||||
@parent.director.schedule_order(IMICRTS::Order::BUILD_UNIT, @parent.player.id, @parent.id, data[:entity])
|
||||
end
|
||||
@@ -26,7 +26,7 @@ class IMICRTS
|
||||
raise "Failed to find entity: #{data[:entity].inspect}" unless ent
|
||||
|
||||
action.label = ent.name.to_s.split("_").map { |s| s.capitalize }.join(" ")
|
||||
action.description = "Cost: #{ent.cost}\n#{ent.description}"
|
||||
action.description = "#{action.label}\nCost: #{ent.cost}\n#{ent.description}"
|
||||
action.block = proc { @parent.director.game.set_tool(data[:tool], data) }
|
||||
|
||||
else
|
||||
|
||||
24
lib/map.rb
24
lib/map.rb
@@ -4,7 +4,8 @@ class IMICRTS
|
||||
def initialize(map_file:)
|
||||
@tiled_map = TiledMap.new(map_file)
|
||||
|
||||
@width, @height = @tiled_map.width, @tiled_map.height
|
||||
@width = @tiled_map.width
|
||||
@height = @tiled_map.height
|
||||
@tile_size = @tiled_map.tile_size
|
||||
|
||||
@tiles = {}
|
||||
@@ -62,6 +63,27 @@ class IMICRTS
|
||||
end
|
||||
end
|
||||
|
||||
def render_preview
|
||||
Gosu.render(1024, 1024, retro: true) do
|
||||
Gosu.scale(1024 / (@width.to_f * @tile_size), 1024 / (@height.to_f * @tile_size)) do
|
||||
@height.times do |y|
|
||||
@width.times do |x|
|
||||
tile = tile_at(x, y)
|
||||
ore = ore_at(x, y)
|
||||
|
||||
tile.image.draw(tile.position.x, tile.position.y, tile.position.z) if tile
|
||||
ore.image.draw(ore.position.x, ore.position.y, ore.position.z) if ore
|
||||
end
|
||||
end
|
||||
|
||||
@spawnpoints.each do |spawnpoint|
|
||||
Gosu.draw_circle(spawnpoint.x, spawnpoint.y, @tile_size.to_f / 4 * 3, 36, Gosu::Color::BLACK, Float::INFINITY)
|
||||
Gosu.draw_circle(spawnpoint.x, spawnpoint.y, @tile_size.to_f / 2, 36, Gosu::Color::GRAY, Float::INFINITY)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def visible_tiles(camera)
|
||||
_tiles = []
|
||||
|
||||
|
||||
@@ -8,12 +8,11 @@ class IMICRTS
|
||||
stack(width: IMICRTS::MENU_WIDTH, height: 1.0, padding: IMICRTS::MENU_PADDING) do
|
||||
background [0xff555555, Gosu::Color::GRAY]
|
||||
label IMICRTS::NAME, text_size: 78, margin: 20
|
||||
button("Campaign", width: 1.0, enabled: false) do
|
||||
button("Campaign", width: 1.0, enabled: false, tip: "No campaign available, yet...") do
|
||||
push_state(CampaignMenu)
|
||||
end
|
||||
|
||||
button("Skirmish", width: 1.0) do
|
||||
# push_state(SoloPlayMenu)
|
||||
push_state(SoloLobbyMenu)
|
||||
end
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ class IMICRTS
|
||||
def setup
|
||||
background [0xff7b6ead, 0xff7a0d71, 0xff7a0d71, 0xff7b6ead]
|
||||
|
||||
stack(width: 0.5, min_width: 720, height: 1.0, padding: IMICRTS::MENU_PADDING) do
|
||||
stack(width: 1.0, height: 1.0, padding: IMICRTS::MENU_PADDING) do
|
||||
background [0xff555555, Gosu::Color::GRAY]
|
||||
|
||||
label "Lobby", text_size: 78, margin: 20
|
||||
@@ -51,7 +51,12 @@ class IMICRTS
|
||||
# TODO: Show preview image
|
||||
label "Map"
|
||||
@map_name = list_box items: [:test_map], choose: :test_map, width: 1.0
|
||||
image "#{GAME_ROOT_PATH}/assets/logo.png", width: 1.0
|
||||
@map_name.subscribe(:changed) do |sender, value|
|
||||
map = Map.new(map_file: "maps/#{value}.tmx")
|
||||
@map_preview.instance_variable_set(:"@image", map.render_preview)
|
||||
@map_preview.recalculate
|
||||
end
|
||||
@map_preview = image "#{GAME_ROOT_PATH}/assets/logo.png", width: 1.0, border_thickness: 2, border_color: Gosu::Color::BLACK, background: Gosu::Color::GRAY
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
class IMICRTS
|
||||
class TiledMap
|
||||
attr_reader :width, :height, :tile_size
|
||||
attr_reader :layers, :tilesets, :spawnpoints
|
||||
attr_reader :width, :height, :tile_size, :layers, :tilesets, :spawnpoints
|
||||
|
||||
def initialize(map_file)
|
||||
@xml = Nokogiri::XML(File.read("#{IMICRTS::ASSETS_PATH}/#{map_file}"))
|
||||
|
||||
@width, @height = 0, 0
|
||||
@width = 0
|
||||
@height = 0
|
||||
@tile_size = 32
|
||||
|
||||
@layers = []
|
||||
@@ -17,7 +18,8 @@ class IMICRTS
|
||||
parse
|
||||
|
||||
terrain = @layers.find { |layer| layer.name.downcase == "terrain" }
|
||||
@width, @height = terrain.width, terrain.height
|
||||
@width = terrain.width
|
||||
@height = terrain.height
|
||||
|
||||
@tilesets.each do |tileset|
|
||||
@tiles.push(*tileset.tiles)
|
||||
@@ -36,11 +38,12 @@ class IMICRTS
|
||||
end
|
||||
|
||||
@xml.search("//objectgroup").each do |objectgroup|
|
||||
if objectgroup.attr("name") == "spawns"
|
||||
objectgroup.children.each do |object|
|
||||
next unless object.attr("name") && object.attr("name").downcase.strip == "spawn"
|
||||
@spawnpoints << SpawnPoint.new(object)
|
||||
end
|
||||
next unless objectgroup.attr("name") == "spawns"
|
||||
|
||||
objectgroup.children.each do |object|
|
||||
next unless object.attr("name") && object.attr("name").downcase.strip == "spawn"
|
||||
|
||||
@spawnpoints << SpawnPoint.new(object)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -55,9 +58,11 @@ class IMICRTS
|
||||
|
||||
class Layer
|
||||
attr_reader :name, :width, :height
|
||||
|
||||
def initialize(xml_layer)
|
||||
@name = xml_layer["name"]
|
||||
@width, @height = Integer(xml_layer["width"]), Integer(xml_layer["height"])
|
||||
@width = Integer(xml_layer["width"])
|
||||
@height = Integer(xml_layer["height"])
|
||||
@data = []
|
||||
|
||||
xml_layer.css("data").inner_html.each_line do |line|
|
||||
@@ -74,8 +79,8 @@ class IMICRTS
|
||||
|
||||
|
||||
class TileSet
|
||||
attr_reader :first_gid, :name, :tile_width, :tile_height, :tile_count, :columns, :rows
|
||||
attr_reader :tiles
|
||||
attr_reader :first_gid, :name, :tile_width, :tile_height, :tile_count, :columns, :rows, :tiles
|
||||
|
||||
Tile = Struct.new(:image, :data)
|
||||
def initialize(xml_tileset)
|
||||
@first_gid = nil
|
||||
@@ -116,7 +121,7 @@ class IMICRTS
|
||||
end
|
||||
|
||||
path = tileset.search("//image").first.attributes.detect { |a, v| a == "source" }.last.value
|
||||
images = Gosu::Image.load_tiles("#{IMICRTS::ASSETS_PATH}/tilesets/#{path}", @tile_width, @tile_height, retro: true)
|
||||
images = Gosu::Image.load_tiles("#{IMICRTS::ASSETS_PATH}/tilesets/#{path}", @tile_width, @tile_height, retro: true, tileable: true)
|
||||
|
||||
tileset.search("//tile").each_with_index do |xml, index|
|
||||
tile = Tile.new
|
||||
@@ -136,8 +141,10 @@ class IMICRTS
|
||||
|
||||
class SpawnPoint
|
||||
attr_reader :x, :y
|
||||
|
||||
def initialize(xml_object)
|
||||
@x, @y = Integer(xml_object.attr("x")), Integer(xml_object.attr("y"))
|
||||
@x = Integer(xml_object.attr("x"))
|
||||
@y = Integer(xml_object.attr("y"))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user