Class: Bestguigui::Tiled::TileLayer

Inherits:
Object
  • Object
show all
Defined in:
lib/bestguigui/tiled.rb

Overview

Couche de tuiles. Les gids Tiled comptent depuis 1 (0 = case vide) — tile_at/each_tile renvoient déjà des index 0-based, ou nil pour une case vide.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(data) ⇒ TileLayer

Returns a new instance of TileLayer.



69
70
71
72
73
74
# File 'lib/bestguigui/tiled.rb', line 69

def initialize(data)
  @name = data["name"]
  @width = data["width"]
  @height = data["height"]
  @gids = data["data"]
end

Instance Attribute Details

#heightObject (readonly)

Returns the value of attribute height.



67
68
69
# File 'lib/bestguigui/tiled.rb', line 67

def height
  @height
end

#nameObject (readonly)

Returns the value of attribute name.



67
68
69
# File 'lib/bestguigui/tiled.rb', line 67

def name
  @name
end

#widthObject (readonly)

Returns the value of attribute width.



67
68
69
# File 'lib/bestguigui/tiled.rb', line 67

def width
  @width
end

Instance Method Details

#bake(tileset, tile_width:, tile_height:, retro: true) ⇒ Object

Compose toute la couche en une seule image (Gosu.render), une fois — pour un sol/fond statique dessiné à partir d'un tileset plutôt que tuile par tuile à chaque frame (1 draw call au lieu d'un par tuile visible, quelle que soit la taille du niveau).

tileset = Gosu::Image.load_tiles("gfx/tileset.png", 16, 16, retro: true)
floor_image = map.tile_layer.bake(tileset, tile_width: 16, tile_height: 16)

Ne convient pas à un fond qui mélange remplissage + marqueurs épars (une minimap, par exemple) — dans ce cas, Gosu.render directement reste plus adapté qu'une grille de tuiles uniforme.



104
105
106
107
108
# File 'lib/bestguigui/tiled.rb', line 104

def bake(tileset, tile_width:, tile_height:, retro: true)
  Gosu.render(width * tile_width, height * tile_height, retro: retro) do
    each_tile { |x, y, tile| tileset[tile].draw(x * tile_width, y * tile_height, 0) }
  end
end

#each_tileObject

yield(x, y, tile_index) pour chaque case non vide.



84
85
86
87
88
89
90
91
# File 'lib/bestguigui/tiled.rb', line 84

def each_tile
  @height.times do |y|
    @width.times do |x|
      tile = tile_at(x, y)
      yield x, y, tile unless tile.nil?
    end
  end
end

#tile_at(x, y) ⇒ Object



76
77
78
79
80
81
# File 'lib/bestguigui/tiled.rb', line 76

def tile_at(x, y)
  return nil if x.negative? || y.negative? || x >= @width || y >= @height

  gid = @gids[(y * @width) + x]
  gid.zero? ? nil : gid - 1
end