class Ruby2d::Tiled::Level

Constants

FLIP_MAP

Attributes

angle[W]
x_offset[W]
y_offset[W]

Public Class Methods

new(data, tileset_relative_path, layer_data) click to toggle source
# File lib/ruby2d/tiled/level.rb, line 15
def initialize(data, tileset_relative_path, layer_data)
  @scale = 1
  @x_offset = 0
  @y_offset = 0
  @angle = 0

  @data = data
  @layer_data = layer_data
  @tileset_relative_path = tileset_relative_path
  @tilesets = {}

  @layers = @data['layerInstances'].reverse.select do |layer|
    ['Tiles', 'IntGrid', 'AutoLayer'].include?(layer['__type'])
  end
  @ruby2d_objects = []
end

Public Instance Methods

clear() click to toggle source
# File lib/ruby2d/tiled/level.rb, line 94
def clear
  @ruby2d_objects.each(&:remove)
  @tilesets.each_value(&:clear_tiles)
  @ruby2d_objects = []
end
scale=(scale) click to toggle source
# File lib/ruby2d/tiled/level.rb, line 89
def scale=(scale)
  @scale = scale
  @tilesets.each_value { |tileset| tileset.instance_variable_set('@scale', scale) }
end
show() click to toggle source
# File lib/ruby2d/tiled/level.rb, line 32
def show
  Window.set(background: @data['__bgColor'])

  @layers.each_with_index do |layer, z_index|
    grid_size = layer['__gridSize'] * @scale
    grid_tiles = layer['gridTiles'] + layer['autoLayerTiles']

    if grid_tiles.size > 0
      tileset = @tilesets[layer['__identifier']]

      if !tileset
        tileset = Ruby2D::Tileset.new(
          File.expand_path(File.join(@tileset_relative_path, layer['__tilesetRelPath'])),
          tile_width: layer['__gridSize'],
          tile_height: layer['__gridSize'],
          scale: @scale,
          z: z_index,
          padding: 0, # FIXME: implement padding
          spacing: 0, # FIXME: implement spacing
        )

        # FIXME: We use the gridSize and not the width and height, i'm not sure if that's OK
        # Will need to fix this later
        (grid_tiles.uniq { |tile| tile.slice('src', 'f') }).each do |tile|
          tileset.define_tile("#{tile['t']}#{tile['f']}", tile['src'][0] / layer['__gridSize'], tile['src'][1] / layer['__gridSize'], flip: FLIP_MAP[tile['f']])
        end

        @tilesets[layer['__identifier']] = tileset
      end

      grid_tiles.each do |tile|
        tileset.set_tile("#{tile['t']}#{tile['f']}", [{ x: (tile['px'][0] * @scale) + @x_offset, y: (tile['px'][1] * @scale) + @y_offset }])
      end
    elsif layer['intGridCsv'].size > 0
      layer_data = @layer_data.detect { |layer_data| layer_data['uid'] == layer['layerDefUid'] }

      layer['intGridCsv'].each_with_index do |int_grid_value, index|
        if int_grid_value != 0
          color = (layer_data['intGridValues'].detect { |value| value['value'] == int_grid_value })['color']

          # FIXME: Need to support offsers here :)
          x = (((index % layer['__cWid'])) * grid_size) + @x_offset
          y = (((index + 1).to_i / layer['__cWid'].to_i) * grid_size) + @y_offset

          @ruby2d_objects.push(Ruby2D::Square.new(
            x: x,
            y: y,
            z: z_index,
            size: grid_size,
            color: color
          ))
        end
      end
    end
  end
end