Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

Tileset class

As whoever first posted the Tileset class hasn't reposted theirs, i got one from Creation Asylum.

Code:
#==============================================================================
# ** Game_Map
#==============================================================================
class Game_Map
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader :map
  attr_accessor :tilemap_tone
  attr_accessor :tilemap_plane
  attr_accessor :tilemap_zoom_x
  attr_accessor :tilemap_zoom_y
  attr_accessor :tilemap_tile_width
  attr_accessor :tilemap_tile_height
  #--------------------------------------------------------------------------
  # * Alias Listings
  #--------------------------------------------------------------------------
  alias seph_tilemap_gmap_init initialize
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    # Original Initialization
    seph_tilemap_gmap_init
    # Sets Special Tilemap Properties
    @tilemap_tone        = nil
    @tilemap_plane       = false
    @tilemap_zoom_x      = 2.0
    @tilemap_zoom_y      = 2.0
    @tilemap_tile_width  = 32
    @tilemap_tile_height = 32
  end
end
#==============================================================================
# ** Tilemap
#==============================================================================
class Tilemap
  #--------------------------------------------------------------------------
  # * Animated Autotiles Frames Reset
  #--------------------------------------------------------------------------
  Animated_Autotiles_Frames = 15
  #--------------------------------------------------------------------------
  # * Auto-Tiles
  #
  #   Auto-Tile 48 : First Auto-Tile, Constructed of tiles 27, 28, 33, 34
  #--------------------------------------------------------------------------
  Autotiles = [
    [ [27, 28, 33, 34], [ 5, 28, 33, 34], [27,  6, 33, 34], [ 5,  6, 33, 34],
      [27, 28, 33, 12], [ 5, 28, 33, 12], [27,  6, 33, 12], [ 5,  6, 33, 12] ],
    [ [27, 28, 11, 34], [ 5, 28, 11, 34], [27,  6, 11, 34], [ 5,  6, 11, 34],
      [27, 28, 11, 12], [ 5, 28, 11, 12], [27,  6, 11, 12], [ 5,  6, 11, 12] ],
    [ [25, 26, 31, 32], [25,  6, 31, 32], [25, 26, 31, 12], [25,  6, 31, 12],
      [15, 16, 21, 22], [15, 16, 21, 12], [15, 16, 11, 22], [15, 16, 11, 12] ],
    [ [29, 30, 35, 36], [29, 30, 11, 36], [ 5, 30, 35, 36], [ 5, 30, 11, 36],
      [39, 40, 45, 46], [ 5, 40, 45, 46], [39,  6, 45, 46], [ 5,  6, 45, 46] ],
    [ [25, 30, 31, 36], [15, 16, 45, 46], [13, 14, 19, 20], [13, 14, 19, 12],
      [17, 18, 23, 24], [17, 18, 11, 24], [41, 42, 47, 48], [ 5, 42, 47, 48] ],
    [ [37, 38, 43, 44], [37,  6, 43, 44], [13, 18, 19, 24], [13, 14, 43, 44],
      [37, 42, 43, 48], [17, 18, 47, 48], [13, 18, 43, 48], [ 1,  2,  7,  8] ]
  ]
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader :layers
  attr_accessor :tileset
  attr_accessor :autotiles
  attr_accessor :map_data
  attr_accessor :flash_data
  attr_accessor :priorities
  attr_accessor :visible
  attr_accessor :ox
  attr_accessor :oy
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(viewport, map = $game_map.map)
    # Creates layers
    @layers = []
    for l in 0...3
      layer = ($game_map.tilemap_plane ? 
               Plane.new(viewport) : Sprite.new(viewport))
      layer.bitmap = Bitmap.new(map.width * 32, map.height * 32)
      layer.z = l * 150
      layer.zoom_x = $game_map.tilemap_zoom_x
      layer.zoom_y = $game_map.tilemap_zoom_y
      if (tone = $game_map.tilemap_tone).is_a?(Tone)
        layer.tone = tone
      end
      @layers << layer
    end
    # Sets Tileset Data
    @tileset    = nil  # Refers to Map Tileset Name
    @autotiles  = []   # Refers to Tileset Auto-Tiles (Actual Auto-Tiles)
    @map_data   = nil  # Refers to 3D Array Of Tile Settings
    @flash_data = nil  # Refers to 3D Array of Tile Flashdata
    @priorities = nil  # Refers to Tileset Priorities
    @visible    = true # Refers to Tilest Visibleness
    @ox         = 0    # Bitmap Offsets          
    @oy         = 0    # bitmap Offsets
    @data       = nil  # Acts As Refresh Flag
    # Sets Specials Tile Properties
    @map         = map
    @tone        = $game_map.tilemap_tone
    @plane       = $game_map.tilemap_plane
    @zoom_x      = $game_map.tilemap_zoom_x
    @zoom_y      = $game_map.tilemap_zoom_y
    @tile_width  = $game_map.tilemap_tile_width
    @tile_height = $game_map.tilemap_tile_height
  end
  #--------------------------------------------------------------------------
  # * Dispose
  #--------------------------------------------------------------------------
  def dispose
    # Dispose Layers (Sprites)
    for layer in @layers
      layer.dispose
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    # If Data Changes
    unless @data == @map_data && 
           @tile_width == $game_map.tilemap_tile_width &&
           @tile_height == $game_map.tilemap_tile_height
      refresh
    end
    # Tone Change
    unless @tone == $game_map.tilemap_tone
      @tone = $game_map.tilemap_tone
      @tone = Tone.new(0, 0, 0, 0) if @tone.nil?
      for layer in @layers
        layer.tone = @tone
        layer.tone = @tone
      end
    end
    # Zoom Change
    unless @zoom_x == $game_map.tilemap_zoom_x
      @zoom_x = $game_map.tilemap_zoom_x
      for layer in @layers
        layer.zoom_x = @zoom_x
        layer.zoom_x = @zoom_x
      end
    end
    unless @zoom_y == $game_map.tilemap_zoom_y
      @zoom_y = $game_map.tilemap_zoom_y
      for layer in @layers
        layer.zoom_y = @zoom_y
        layer.zoom_y = @zoom_y
      end
    end
    # Update layer Position offsets
    for layer in @layers
      layer.ox = @ox
      layer.oy = @oy
    end
    # Animated Autotiles
    if Graphics.frame_count % Animated_Autotiles_Frames == 0
      # Refresh Autotiles
      refresh_autotiles
    end
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    # Saves Map Data
    @data = @map_data
    # Passes Through All Priorities
    for p in 0..5
      # Passes Through Layers
      for z in [EMAIL=0...@map_data.zsize]0...@map_data.zsize[/EMAIL]
        # Passes Through X Coordinates
        for x in [EMAIL=0...@map_data.xsize]0...@map_data.xsize[/EMAIL]
          # Passes Through Z Coordinates
          for y in [EMAIL=0...@map_data.ysize]0...@map_data.ysize[/EMAIL]
            # Collects Tile ID
            id = @map_data[x, y, z]
            # Skip if 0 tile
            next if id == 0
            # Skip If Priority Doesn't Match
            next unless p == @priorities[id]
            # Cap Priority to Layer 3
            p = 2 if p > 2
            # Draw Tile
            id < 384 ? draw_autotile(x, y, p, id) : draw_tile(x, y, p, id)
          end
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Refresh Auto-Tiles
  #--------------------------------------------------------------------------
  def refresh_autotiles
    # Auto-Tile Locations
    autotile_locations = Table.new(@map_data.xsize, @map_data.ysize, 
      @map_data.zsize)
    # Passes Through All Priorities
    for p in 0..5
      # Passes Through Layers
      for z in [EMAIL=0...@map_data.zsize]0...@map_data.zsize[/EMAIL]
        # Passes Through X Coordinates
        for x in [EMAIL=0...@map_data.xsize]0...@map_data.xsize[/EMAIL]
          # Passes Through Z Coordinates
          for y in [EMAIL=0...@map_data.ysize]0...@map_data.ysize[/EMAIL]
            # Collects Tile ID
            id = @map_data[x, y, z]
            # Skip if 0 tile
            next if id == 0
            # Skip If Priority Doesn't Match
            next unless p == @priorities[id]
            # Skip If Non-Animated Tile
            next unless autotile = @autotiles[id / 48 - 1].width / 96 > 1
            # Cap Priority to Layer 3
            p = 2 if p > 2
            # If Autotile
            if id < 384
              # Draw Auto-Tile
              draw_autotile(x, y, p, id)
              # Save Autotile Location
              autotile_locations[x, y, z] = 1
            # If Normal Tile
            else
              # If Autotile Drawn
              if autotile_locations[x, y, z] == 1
                # Redraw Normal Tile
                draw_tile(x, y, p, id)
              end
            end
          end
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Draw Tile
  #--------------------------------------------------------------------------
  def draw_tile(x, y, z, id)
    # Figures Tile Rect
    rect = Rect.new((id - 384) % 8 * 32, (id - 384) / 8 * 32, 32, 32)
    # Calculates Tile Coordinates
    x *= @tile_width
    y *= @tile_height
    # If Normal Tile
    if @tile_width == 32 && @tile_height == 32
      @layers[z].bitmap.blt(x, y, @tileset, rect)
    # If Altered Dimensions
    else
      dest_rect = Rect.new(x, y, @tile_width, @tile_height)
      @layers[z].bitmap.stretch_blt(dest_rect, @tileset, rect)
    end
  end
  #--------------------------------------------------------------------------
  # * Draw Auto-Tile
  #--------------------------------------------------------------------------
  def draw_autotile(x, y, z, tile_id)
    # Gets Auto-Tile
    autotile = @autotiles[tile_id / 48 - 1]
    # Reconfigure Tile ID
    tile_id %= 48
    # Creates Bitmap
    bitmap = Bitmap.new(32, 32)
    # Collects Auto-Tile Tile Layout
    tiles = Autotiles[tile_id / 8][tile_id % 8]
    # Animated Tiles
    frames = autotile.width / 96
    # Configures Animation Offset
    anim = (Graphics.frame_count / Animated_Autotiles_Frames) % frames * 96
    # Draws Auto-Tile Rects
    for i in 0...4
      tile_position = tiles[i] - 1
      src_rect = Rect.new(tile_position % 6 * 16 + anim, tile_position / 6 * 16, 16, 16)
      bitmap.blt(i % 2 * 16, i / 2 * 16, autotile, src_rect)
    end
    # Calculates Tile Coordinates
    x *= @tile_width
    y *= @tile_height
    # If Normal Tile
    if @tile_width == 32 && @tile_height == 32
      @layers[z].bitmap.blt(x, y, bitmap, Rect.new(0, 0, 32, 32))
    # If Altered Dimensions
    else
      dest_rect = Rect.new(x, y, @tile_width, @tile_height)
      @layers[z].bitmap.stretch_blt(dest_rect, bitmap, Rect.new(0, 0, 32, 32))
    end
  end
  #--------------------------------------------------------------------------
  # * Collect Bitmap
  #--------------------------------------------------------------------------
  def bitmap
    # Creates New Blank Bitmap
    bitmap = Bitmap.new(@layers[0].bitmap.width, @layers[0].bitmap.height)
    # Passes Through All Layers
    for layer in @layers
      bitmap.blt(0, 0, layer.bitmap, 
        Rect.new(0, 0, bitmap.width, bitmap.height))
    end
    # Return Bitmap
    return bitmap
  end
end

And theres an error on line 218, undefined method 'width'. And nwo i check through it, there doesn't seem to be a def 'width'. At least, not in this script. So could someone please repost the Tileset class here for me, or at elast tlel me whats wrong with it?
 
I did that too thinking that a single tile is more slower, but i when i used a single sprite for each tile, it gives me much possibilities such as animation plus the z layer is distributed properly rather than having the same z for every tiles on the same layer. Maybe mine was faster because i am using C# ^^
 
Selwyn;126790 said:
hum
rpgmaker, would you mind sharing your C# tilemap class?
Because I wanted to make one alas my C# knowledge is literally inexistent so to speak...

sure you can have it, it is not the best, but it still work. I am still going to rewrite it.

Code:
//Map Class
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.Drawing;

namespace EngineClasses
{
    [Serializable]
    public class Map
    {
        public int width;
        public int height;
        public string tile_name;
        public string map_name;
        public List<Event> events = new List<Event>();
        public List<Point>[] Layer = new List<Point>[3];
        public List<Rectangle>[] Rect = new List<Rectangle>[3];
        public Map(){
            Layer[0] = new List<Point>(); Layer[1] = new List<Point>(); Layer[2] = new List<Point>();
            Rect[0] = new List<Rectangle>(); Rect[1] = new List<Rectangle>(); Rect[2] = new List<Rectangle>();
        }
    }
}

//Tilemap Class
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.Drawing;

namespace EngineClasses
{
    using SdlDotNet;
    public class TileMap
    {
        #region Variable
        public List<int> priorities;
        public bool visible;
        public bool needRefresh;
        private Viewport viewport;
        private const int SIZE = 32;
        private string filename;
        private Surface tilesetBitmap;
        private List<Sprite>[] MapSprite = new List<Sprite>[3];
        private const int WIDTH = 640;
        private const int HEIGHT = 480;
        private int cx, cy;
        #endregion

        #region Constructor
        public TileMap(Viewport viewport)
        {
            this.viewport = viewport;
            this.visible = true;
            this.cx = 0; this.cy = 0;
            this.priorities = Game.gameMap.priorities;
            this.filename = "TileMap/" + Game.gameMap.map.tile_name;
            tilesetBitmap = new Surface(filename);
            this.needRefresh = true;
            MapSprite[0] = new List<Sprite>();
            MapSprite[1] = new List<Sprite>();
            MapSprite[2] = new List<Sprite>();
        }
        #endregion

        #region Methods
        public void Update()
        {
            if (this.needRefresh == false) return;
            this.Dispose();
            int index = -1;
            int tile_id = -1;
            for (int i = 0; i < Game.gameMap.map.Layer.Length; i++)
            {
                for (int j = 0; j < Game.gameMap.map.Layer[i].Count; j++)
                {
                    if ((Game.gameMap.map.Layer[i][j].X >= cx * SIZE &&
                        Game.gameMap.map.Layer[i][j].Y >= cy * SIZE) &&
                        ((Game.gameMap.map.Layer[i][j].X - (cx * SIZE) + SIZE) <= WIDTH &&
                        ((Game.gameMap.map.Layer[i][j].Y - (cy * SIZE)) + SIZE) <= HEIGHT))
                    {
                        MapSprite[i].Add(new Sprite());
                        index = MapSprite[i].Count - 1;
                        MapSprite[i][index].Bitmap = tilesetBitmap;
                        MapSprite[i][index].viewport = new Viewport(
                            Game.gameMap.map.Layer[i][j].X - (cx * SIZE),
                            Game.gameMap.map.Layer[i][j].Y - (cy * SIZE), SIZE, SIZE);
                        MapSprite[i][index].viewport.ox = Game.gameMap.map.Rect[i][j].X;
                        MapSprite[i][index].viewport.oy = Game.gameMap.map.Rect[i][j].Y;
                        tile_id = Game.gameMap.tilePoints.IndexOf(
                            new Point(MapSprite[i][index].viewport.ox,
                            MapSprite[i][index].viewport.oy));
                        if (priorities[tile_id] > 0)
                            MapSprite[i][index].Z = (MapSprite[i][index].viewport.y / SIZE + (1 + 1) +
                                priorities[tile_id]) * SIZE;
                        else if (priorities[tile_id] == 0)
                            MapSprite[i][index].Z = i + 1;
                    }
                }
            }
            this.needRefresh = false;
        }
        public void Dispose()
        {
            foreach (List<Sprite> sprites in MapSprite)
                foreach (Sprite sprite in sprites)
                    if (sprite != null && !sprite.IsDisposed())
                        sprite.Dispose();
            for (int i = 0; i < MapSprite.Length; i++)
            {
                if (MapSprite[i] != null)
                    MapSprite[i].Clear();
                MapSprite[i] = new List<Sprite>();
            }
        }
        public void MoveCamera(int x, int y)
        {
            if (cx <= WIDTH / SIZE) cx += x;
            if (cy <= HEIGHT / SIZE) cy += y;
            if (cx < 0) cx = 0;
            if (cy < 0) cy = 0;
            if (cx > WIDTH / SIZE) cx = WIDTH / SIZE;
            if (cy > HEIGHT / SIZE) cy = HEIGHT / SIZE;
            this.needRefresh = true;
        }
        public int OX
        {
            get { return cx; }
            set { cx = value / SIZE; needRefresh = true; }
        }
        public int OY
        {
            get { return cy; }
            set { cy = value / SIZE; needRefresh = true; }
        }
        #endregion
    }
}
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top