Sujet n°12677
Posté par FinalArt le 27 Avr - 01:04 (2013)
Titre : [Résolu] Autotiles animés qui causent d'énormes lags
Bonjour,

J'ai récemment eu l'envie d'animer ma map. Ainsi j'ai utilisé des autotiles, tel un représentant les vagues de la mer sur une plage. L'animation marche très bien, mais quand on se trouve sur la map, les pas du héros sont ponctués de pauses et des que l'on s'approche des autotiles le jeu crash et la fenêtre se ferme.

Ainsi, utilisez vous des autotiles ? Si oui, laguez-vous et comment y remédiez-vous ? Si non, qu'utilisez-vous pour animer vos map, tout du moins vos décors.

Merci d'avance !

Posté par Nuri Yuri le 27 Avr - 01:16 (2013)
Quel SK ?

Posté par Eurons くさ le 27 Avr - 09:40 (2013)
Je dirais PSP5G, Azur, met ceci " Graphics.frame_rate = 55 " après le begin dans le script "Main", augmente le à 60 si cela ne suffit pas.

Posté par Nuri Yuri le 27 Avr - 10:49 (2013)
Tout a fait normal. PSP 5G est basé sur PSP DS 0.3 qui bug énormément, c'est via PSP DS0.3 que j'ai commencé à coder des TileMap car j'ai ressenti une frustration tout autre au niveau des autotiles : Ils ne restent pas transparents.
Enfin bref, c'est le jeu qui se surcharge en mémoire et pour les autotiles, quelque soit le tilemap à moins d'en avoir codé un en c++/asm il laggera quand il y a trop d'autotiles.
Essaie ce script : ./10510.html?t…
Si ça ne réduit pas un peu les lags je peux pas grand chose pour toi. Peut être que faire des Maps d'au max 50x50 aiderait pas mal.

(Sinon, je déconseille fortement le code d'euros : le RGSS1 Player est programmé pour fonctionner à 40FPS, si tu mets plus il fonctionnera entre 20 et 55 FPS à cause des instabilité causés par le code Ruby.)

Posté par Eurons くさ le 27 Avr - 10:53 (2013)
Sur PSPDS0.4, le code utiliser marche très bien pour ma part =O
Après, je vais voir ton script de résolution pour une méthode moins barbare.

Posté par Nuri Yuri le 27 Avr - 11:01 (2013)
Ce code marche, mais que sur les ordis puissants, les autres c'est plutôt la fête au niveau de frame_rate.
Sinon, sur PSP DS 0.4, ce script est déjà présent au détail près : il est pas à jour sur PSP DS :b

Posté par FinalArt le 27 Avr - 11:55 (2013)
Merci de vos réponses.

Donc soit j'utilise le script donné et prie pour que ça marche, soit je change de sk pour une version plus stable (impossible vu le travail réalisé sur les scripts), soit j'abandonne les autotiles et l'animation des maps.

Je vais pleurer dans mon coin, mais merci encore.

Posté par Pαlвσlѕку le 27 Avr - 12:22 (2013)
Tu devrais essayer de changer le script Tilemap, ça ne fonctionnera peut-être pas, mais c'est la solution la plus rapide qui pourrait fonctionner.
Et puis même si ça ne fonctionne pas, les performances pour les maps sans autotiles seront quand même meilleures.

Lorsque j'ai mis le Tilemap de Yuri dans PSP DS, même si actuellement ce n'est pas la dernière version, je n'ai plus eu de crash de mémoire.

Posté par FinalArt le 27 Avr - 13:05 (2013)
Bon, cela ne fonctionne pas.

Pas trop grave, seulement les maps seront fixes =/

Merci encore.

[Edit]

Merci Eurons !

En effet, j'ai utilisé ce DS Résolution :

Spoiler
Code:
#=============================================================================
# ■ DS Résolution
# Pokemon Script Project DS - Brendan & SephirothSpawn
# 05/04/10
#-----------------------------------------------------------------------------
# Redimensionnement des sprites à 1*1 pixel.
#-----------------------------------------------------------------------------

class Sprite_Character < RPG::Sprite
  def initialize(viewport, character = nil)
    super(viewport)
    self.zoom_x = $game_map.tilemap_zoom_x
    self.zoom_y = $game_map.tilemap_zoom_y
    @character = character
    update
  end
end

class Game_Character
 
  #--------------------------------------------------------------------------
  # ? ?? X ?????
  #--------------------------------------------------------------------------
  def screen_x
    # ***
    #return (@real_x - $game_map.display_x + 3) / 4 + 16
    zx = $game_map.tilemap_zoom_x
    return (@real_x - $game_map.display_x + 3*zx) / 4*zx + 16*zx
  end
  #--------------------------------------------------------------------------
  # ? ?? Y ?????
  #--------------------------------------------------------------------------
  def screen_y
    # ***
    # y = (@real_y - $game_map.display_y + 3) / 4 + 32
    zy = $game_map.tilemap_zoom_y
    y = (@real_y - $game_map.display_y + 3*zy) / 4*zy + 32*zy
    # ???????????? Y ????????
    if @jump_count >= @jump_peak
      n = @jump_count - @jump_peak
    else
      n = @jump_peak - @jump_count
    end
    return y - (@jump_peak * @jump_peak - n * n) / 2
  end
  #--------------------------------------------------------------------------
  # ? ?? Z ?????
  #     height : ?????????
  #--------------------------------------------------------------------------
  def screen_z(height = 0)
    # ?????????? ON ???
    if @always_on_top
      # ???? 999
      return 999
    end
    # ***
    # z = (@real_y - $game_map.display_y + 3) / 4 + 32
    zy = $game_map.tilemap_zoom_y
    z = (@real_y - $game_map.display_y + 3*zy) / 4*zy + 32*zy
    # ??????
    if @tile_id > 0
      # ??????????? * 32 ???
      #return z + $game_map.priorities[@tile_id] * 32
      return z + $game_map.priorities[@tile_id] * 32*zy
    # ?????????
    else
      # ??? 32 ??????? 31 ???
      return z + ((height > 32*zy) ? 31 : 0)
    end
  end
  #--------------------------------------------------------------------------
  # ? bush_depth ***
  #--------------------------------------------------------------------------
  def bush_depth
    # ???????????????????? ON ???
    if @tile_id > 0 or @always_on_top
      return 0
    end
    # ?????????????????? 12??????? 0
    if @jump_count == 0 and $game_map.bush?(@x, @y)
      return 6
    else
      return 0
    end
  end
end

class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  # * Set Map Display Position to Center of Screen
  #--------------------------------------------------------------------------
  def center(x, y)
    center_x = (256+9) * 4   # ????? X ?? * 4
    center_y = (192+10) * 4   # ????? Y ?? * 4
    $game_map.display_x = x * 128 - center_x # [0, [x * 128 - center_x, max_x].min].max
    $game_map.display_y = y * 128 - center_y # [0, [y * 128 - center_y, max_y].min].max
  end
end


#==============================================================================
# Tilemap Class
#------------------------------------------------------------------------------
# Script by SephirothSpawn
#==============================================================================

class Game_Map
  #--------------------------------------------------------------------------
  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 seph_tilemap_gmap_init initialize
  def initialize
    seph_tilemap_gmap_init
    @tilemap_tone        = nil
    @tilemap_plane       = false
    @tilemap_zoom_x      = 0.5
    @tilemap_zoom_y      = 0.5
    @tilemap_tile_width  = 32
    @tilemap_tile_height = 32
  end
  #--------------------------------------------------------------------------
  # ? ???????
  #     distance : ?????????
  #--------------------------------------------------------------------------
  def scroll_down(distance)
    @display_y = @display_y + distance# [@display_y + distance, (self.height - 15) * 128].min
  end
  #--------------------------------------------------------------------------
  # ? ???????
  #     distance : ?????????
  #--------------------------------------------------------------------------
  def scroll_left(distance)
    @display_x = @display_x - distance # ([@display_x - distance, 0].max)
  end
  #--------------------------------------------------------------------------
  # ? ???????
  #     distance : ?????????
  #--------------------------------------------------------------------------
  def scroll_right(distance)
    @display_x = @display_x + distance # ([@display_x + distance, (self.width - 20) * 128].min)
  end
  #--------------------------------------------------------------------------
  # ? ???????
  #     distance : ?????????
  #--------------------------------------------------------------------------
  def scroll_up(distance)
    @display_y = @display_y - distance# ([@display_y - distance, 0].max)
  end
end


class Tilemap
  #--------------------------------------------------------------------------
  Animated_Autotiles_Frames = 15
  #--------------------------------------------------------------------------
  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] ]
  ]
  #--------------------------------------------------------------------------
  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
  #--------------------------------------------------------------------------
  def initialize(viewport, map = $game_map.map)
    @layers = []
    for l in 0...6
      layer = 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
    @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
    @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
  #--------------------------------------------------------------------------
  def dispose
    for layer in @layers
      layer.dispose
    end
  end
  #--------------------------------------------------------------------------
  def update
    unless @data == @map_data && @tile_width == $game_map.tilemap_tile_width &&
           @tile_height == $game_map.tilemap_tile_height
      refresh
    end
    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
    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
    for layer in @layers
      layer.ox = @ox
      layer.oy = @oy
    end
    if Graphics.frame_count % Animated_Autotiles_Frames == 0
      refresh_autotiles
    end
  end
  #--------------------------------------------------------------------------
  def refresh
    @data = @map_data
    for p in 0..5
      for z in 0...@map_data.zsize
        for x in 0...@map_data.xsize
          for y in 0...@map_data.ysize
            id = @map_data[x, y, z]
            next if id == 0
            next unless p == @priorities[id]
            #p = 2 if p > 2
            id < 384 ? draw_autotile(x, y, p, id) : draw_tile(x, y, p, id)
          end
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  def refresh_autotiles
    autotile_locations = Table.new(@map_data.xsize, @map_data.ysize,
      @map_data.zsize)
    for p in 0..5
      for z in 0...@map_data.zsize
        for x in 0...@map_data.xsize
          for y in 0...@map_data.ysize
            id = @map_data[x, y, z]
            next if id == 0
            next unless p == @priorities[id]
            p = 2 if p > 2
            if id < 384
              next unless @autotiles[id / 48 - 1].width / 96 > 1
              draw_autotile(x, y, p, id)
              autotile_locations[x, y, z] = 1
            else
              if autotile_locations[x, y, z] == 1
                draw_tile(x, y, p, id)
              end
            end
          end
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  def draw_tile(x, y, z, id)
    rect = Rect.new((id - 384) % 8 * 32, (id - 384) / 8 * 32, 32, 32)
    x *= @tile_width
    y *= @tile_height
    if @tile_width == 32 && @tile_height == 32
      @layers[z].bitmap.blt(x, y, @tileset, rect)
    else
      dest_rect = Rect.new(x, y, @tile_width, @tile_height)
      @layers[z].bitmap.stretch_blt(dest_rect, @tileset, rect)
    end
  end
  #--------------------------------------------------------------------------
  def draw_autotile(x, y, z, tile_id)
    autotile = @autotiles[tile_id / 48 - 1]
    tile_id %= 48
    bitmap = Bitmap.new(32, 32)
    tiles = Autotiles[tile_id / 8][tile_id % 8]
    frames = autotile.width / 96
    anim = (Graphics.frame_count / Animated_Autotiles_Frames) % frames * 96
    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
    x *= @tile_width
    y *= @tile_height
    if @tile_width == 32 && @tile_height == 32
      @layers[z].bitmap.blt(x, y, bitmap, Rect.new(0, 0, 32, 32))
    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
  #--------------------------------------------------------------------------
  def bitmap
    bitmap = Bitmap.new(@layers[0].bitmap.width, @layers[0].bitmap.height)
    for layer in @layers
      bitmap.blt(0, 0, layer.bitmap, Rect.new(0, 0,
        bitmap.width, bitmap.height))
    end
    return bitmap
  end
  #--------------------------------------------------------------------------
end


Et ce Tilemap :

Spoiler
Code:
#===
#¤Classe Tilemap
#---
#%Création de Map avec les une taille de Tile choisie.
#%/!\ Le centrage n'est pas fonction des Characters donc veillez
# à bien positionner les characters dans leur positions virtuelles.
#---
#© 09/11/2010 - Nuri Yuri (塗 ゆり) Version Projet Communautaire
#© 10/10/2011 - Nuri Yuri (塗 ゆり) Amélioration, correction de bugs.
#© 25/10/2011 - Nuri Yuri (塗 ゆり) Correction du problème avec les tiles en supériorité 1.
#© 15/11/2011 - Nuri Yuri (塗 ゆり) Alègissement des methodes, modification de la méthode
# de dessin des autotiles
#===
class Tilemap
#===
#%Déclaration des attributs.
#===
attr_accessor :viewport, :ox, :oy, :tileset, :autotiles, :update_count
attr_accessor :map_data, :priorities, :visible
#===
#%Déclaration des constantes
#===
Default_Tile_Size_x=16
Default_Tile_Size_y=16
Default_Update_Count=10
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] ] ]
#===
#§Initialisation du Tilemap
#---
#%Aupdate_count est l'écart entre les mise à jour d'autotiles en frames.
#===
def initialize(viewport=false)
@viewport=viewport
@visible=true
@dispose=false
@update_count=Default_Update_Count
set_tile_zoom(Default_Tile_Size_x,Default_Tile_Size_y)
@Layers=Array.new(6) #Sprites des supériorités 0 2 3 4 5
@SpLayers=[] #Sprites en sup 1
@AtSprites={} #Sprites autotiles.
@bitmap_tiles=[] #Bitmaps des tiles calculés.
@autotile_update_ids=[] # tableau des id autotiles a mettre a jour
@autotile_max_count=[] # tableau contenant le nombre de frammes par autotiles
@autotiles=[]
@rect=Rect.new(0, 0, 32, 32)
@dest_rect = Rect.new(0, 0, @tile_size_x, @tile_size_y)
@rect_at=Rect.new(0,0, @tile_size_x, @tile_size_y)
@dest_recta=Rect.new(0,0,32,32)
@recta=Rect.new(0,0,32,32)
@autotile_bmp=Bitmap.new(320,32) #Bitmap de collage d'un autotile pas plus de 10 frame
end

#===
#§Mise à jour du Tilemap
#===
def update(forced=false)
@ox /= @tile_zoom_x
@oy /= @tile_zoom_y
unless @tiled
@tiled=true
create_map
end
update_pos
end

#===
#§Dessin de la Map et detection du nombre max de frammes.
#===
def create_map
7.times{|i|
@autotile_max_count[i] = @autotiles[i].width / 96
}
@map_data.zsize.times{|c|
@map_data.xsize.times{|x|
@map_data.ysize.times{|y|
id = @map_data[x, y, c]
next if id == 0
z = @priorities[id]
next unless z
id < 384 ? sprite_at2(x, y, z, c, id) : sprite_t(x, y, z, c, id)
}
}
}
end

#===
#§Sprite_t
#---
#%Création d'un sprite de tiles/collage de tiles sur ce sprite.
#===
def sprite_t(x,y,z,c,id)
if z==1
sprite_t!(x,y,z,c,id)
return
end
unless @Layers[z]
sprite=@Layers[z]=Sprite.new(@viewport)
sprite.z = z*150
sprite.bitmap=Bitmap.new(@map_data.xsize*@tile_size_x,@map_data.ysize*@tile_size_y)
sprite.visible=@visible
else
sprite=@Layers[z]
end
unless @bitmap_tiles[id]
@rect.x=(id - 384) % 8 * 32
@rect.y=(id - 384) / 8 * 32
@bitmap_tiles[id]=Bitmap.new(@tile_size_x, @tile_size_y)
@bitmap_tiles[id].stretch_blt(@dest_rect, @tileset, @rect)
end
sprite.bitmap.blt(x*@tile_size_x,y*@tile_size_y,@bitmap_tiles[id],@dest_rect)
end

#===
#§Dessin des tiles en *1
#===
def sprite_t!(x,y,z,c,id)
unless @SpLayers[y]
sprite=@SpLayers[y]=Sprite.new(@viewport)
sprite.y = @tile_size_y*y
sprite.bitmap=Bitmap.new(@map_data.xsize*@tile_size_x,@tile_size_y)
sprite.visible=@visible
else
sprite=@SpLayers[y]
end
unless @bitmap_tiles[id]
@rect.x=(id - 384) % 8 * 32
@rect.y=(id - 384) / 8 * 32
@bitmap_tiles[id]=Bitmap.new(@tile_size_x, @tile_size_y)
@bitmap_tiles[id].stretch_blt(@dest_rect, @tileset, @rect)
end
sprite.bitmap.blt(x*@tile_size_x,0,@bitmap_tiles[id],@dest_rect)
end

#===
#§Detection du type d'autotile à dessiner.
#---
#Si c'est un autotile à une frame ça le considère comme un tile
#===
def sprite_at2(x,y,z,c,id)
if @autotile_max_count[id / 48 - 1]==1
unless @bitmap_tiles[id]
@rect.x=@rect.y=0
bitmap=get_autotile_bmp(id)
@bitmap_tiles[id]=Bitmap.new(@tile_size_x, @tile_size_y)
@bitmap_tiles[id].stretch_blt(@dest_rect, bitmap, @rect)
end
sprite_t(x,y,z,c,id)
else
sprite_at(x,y,z,c,id)
end
end

#===
#§Dessin d'autotile
#===
def sprite_at(x,y,z,c,id)
sprite=Sprite.new(@viewport)
sprite.x = x*@tile_size_x
sprite.y = y*@tile_size_y
sprite.z = z*150
sprite.visible=@visible
@AtSprites[sprite]=id
unless @bitmap_tiles[id]
bitmap=get_autotile_bmp(id)
@bitmap_tiles[id]=Bitmap.new(@dest_recta.width, @tile_size_y)
@bitmap_tiles[id].stretch_blt(@dest_recta, bitmap, @recta)
end
sprite.bitmap=@bitmap_tiles[id]
sprite.src_rect.width=@tile_size_x
end

#===
#§Capture du Bitmap d'un Autotile.
#===
def get_autotile_bmp(id)
autotile = @autotiles[id / 48 - 1]
return autotile if autotile.width < 96
id %= 48
bitmap=@autotile_bmp
bitmap.clear
tiles = Autotiles[id / 8][id % 8]
frames = autotile.width / 96
@recta.set(0,0,frames*32,32)
@dest_recta.set(0,0,frames*@tile_size_x,@tile_size_y)
(frames).times { |x|
anim = x % frames * 96
4.times{|i|
tile_position = tiles[i] - 1
@rect_at.set(tile_position % 6 * 16 + anim, tile_position / 6 * 16, 16, 16)
bitmap.blt(i % 2 * 16 + x*32, i / 2 * 16, autotile, @rect_at)
}
}
return bitmap
end

#===
#§Mise à jour des positions des Sprites du Tilemap
#===
def update_pos
@Layers.each { |i|
next unless i
i.ox=@ox
i.oy=@oy
}
@map_data.ysize.times { |y|
i = @SpLayers[y]
next unless i
i.z=(y*128 - $game_map.display_y + 3) / 4 + 32 +32
i.ox=@ox
i.oy=@oy
}
bool=(Graphics.frame_count % @update_count == 0)
@AtSprites.each_key {|i|
next unless i
id = @AtSprites[i]
i.ox=@ox
i.oy=@oy
i.src_rect.x=@tile_size_x*((Graphics.frame_count / @update_count) % @autotile_max_count[id / 48 - 1]) if bool
}
end

#===
#§Effacement du Tilemap
#===
def dispose
@Layers.each {|i|
next unless i
i.bitmap.dispose if i.bitmap
i.dispose}
@map_data.ysize.times{ |y|
i = @SpLayers[y]
next unless i
i.bitmap.dispose if i.bitmap
i.dispose
}
@AtSprites.each_key {|i|
next unless i
i.bitmap.dispose if i.bitmap
i.dispose}
@bitmap_tiles.each{|i|
i.dispose if i
}
@AtSprites.clear
@Layers.clear
@SpLayers.clear
@bitmap_tiles.clear
GC.start
@dispose=true
end

#===
#§Disposed?
#===
def disposed?
return @dispose
end

#===
#§Changement de dimentions du Tilemap
#===
def resize_tiles(x=16,y=16)
dispose
set_tile_zoom(x,y)
@dest_rect = Rect.new(0, 0, @tile_size_x, @tile_size_y)
create_map
@dispose=false
end

#===
#§Modification des varables size et zoom
#===
def set_tile_zoom(tile_size_x,tile_size_y)
@tile_size_x=tile_size_x
@tile_size_y=tile_size_y
@tile_zoom_x=(tile_size_x > 32 ? 32/tile_size_x.to_f : 32/tile_size_x)
@tile_zoom_y=(tile_size_y > 32 ? 32/tile_size_y.to_f : 32/tile_size_y)
end
end

#===
#¤Ajout de l'attribut Tilemap dans Spriteset_Map pour un acces plus simple.
#===
class Spriteset_Map
attr_accessor :tilemap
end

#===
#¤Ajout de l'attribut Spriteset dans Scene_Map,
# cet attribut n'existe pas sur les versions d'RMXP
#===
class Scene_Map
attr_accessor :spriteset
end