Pokémon Script Project Index du Forum

S’enregistrer | Rechercher | Connexion
 Information des admins 
Si vous désirez parler de PSP ou obtenir du soutient là dessus, merci d'aller faire un tour sur https://pokemonworkshop.com/forum/index.php Imbécile heureux

[MAJ]DS Résolution / Tilemap

 
Poster un nouveau sujet   Répondre au sujet    Pokémon Script Project Index du Forum -> Game Making -> Ressources techniques -> Scripts
Sujet précédent :: Sujet suivant   
Auteur Message
Nuri Yuri
Administrateur
Administrateur


Inscrit le: 15 Oct 2008
Messages: 6 383
~Entity~
Localisation: Nancy
Non renseigné (Visible...)
ID Steam: Nuri_Yuri

MessagePosté le: Lun 10 Oct - 18:13 (2011)    Sujet du message: [MAJ]DS Résolution / Tilemap

Tilemap


Bonjour, je vous poste une petite mise à jour du script Tilemap corrigeant normalement les bugs dus aux Autotiles non-conventionnels et aux map ayant des tiles hors tilesets.
J'ai aussi retiré certaines fonctions au script à savoir celles qui permettent de changer les tiles, cette fonction n'avait pas été mise à jour sur PSP DS donc planté à cause de l'incompatibilité entre les méthodes et variables.

Script


Voici le script à coller à la place de DS résolution ou à mettre dans un script nommé Tilemap avant Main.
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

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.
#===
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
  #===
  M=10**3
  MM=10**6
  MMM=10**9
  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, update_count=10, tile_size_x=16, tile_size_y=16, visible=true)
    @viewport=viewport
    @visible=visible
    @tiled=false
    @dispose=false
    @update_count=update_count.to_i
    set_tile_zoom(tile_size_x,tile_size_y)
    @tiles={}
    @atiles={}
    @bitmap_tiles={}
    @autotile_update_ids=[] # tableau des id tiles(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)
    @autotile_bmp=Bitmap.new(32,32)
  end
 
  #===
  #§Mise à jour du Tilemap
  #===
  def update(forced=false)
    @ox /= @tile_zoom_x
    @oy /= @tile_zoom_y
    if not @tiled
      @tiled=true
      create_map
    end
    update_autotiles if forced or (Graphics.frame_count % @update_count == 0)
    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{|z|
      @map_data.xsize.times{|x|
        @map_data.ysize.times{|y|
          id = @map_data[x, y, z]
          next if id == 0
          c = @priorities[id]
          next unless c
          id < 384 ? sprite_at2(x, y, c, z, id) : sprite_t(x, y, c, z, 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
    name=-(z*MMM+c)
   
    if @bitmap_tiles[id]
      if @tiles[name]
        @tiles[name].bitmap.blt(x*@tile_size_x,y*@tile_size_y,@bitmap_tiles[id],@dest_rect)
      else
        @tiles[name] = Sprite.new(@viewport)
        @tiles[name].ox=@ox
        @tiles[name].oy=@oy
        @tiles[name].z = z*150 + c
        @tiles[name].bitmap=Bitmap.new(@map_data.xsize*@tile_size_x,@map_data.ysize*@tile_size_y)
        @tiles[name].bitmap.blt(x*@tile_size_x,y*@tile_size_y,@bitmap_tiles[id],@dest_rect)
        @tiles[name].visible=@visible
      end
    else
      @rect.x=(id - 384) % 8 * 32
      @rect.y=(id - 384) / 8 * 32
      x *= @tile_size_x
      y *= @tile_size_y
      @bitmap_tiles[id]=Bitmap.new(@tile_size_x, @tile_size_y)
      @bitmap_tiles[id].stretch_blt(@dest_rect, @tileset, @rect)
      @rect.x=0
      @rect.y=0
      if @tiles[name]
        @tiles[name].bitmap.blt(x,y,@bitmap_tiles[id],@dest_rect)
      else
        @tiles[name] = Sprite.new(@viewport)
        @tiles[name].ox=@ox
        @tiles[name].oy=@oy
        @tiles[name].z = z*150 + c
        @tiles[name].bitmap=Bitmap.new(@map_data.xsize*@tile_size_x,@map_data.ysize*@tile_size_y)
        @tiles[name].bitmap.blt(x,y,@bitmap_tiles[id],@dest_rect)
        @tiles[name].visible=@visible
      end
    end
  end
  #===
  #§Dessin des tiles en *1
  #===
  def sprite_t!(x,y,z,c,id)
    name=y.to_f
    if @bitmap_tiles[id]
      if @tiles[name]
        @tiles[name].bitmap.blt(x*@tile_size_x,0,@bitmap_tiles[id],@dest_rect)
      else
        @tiles[name] = Sprite.new(@viewport)
        @tiles[name].ox=@ox
        @tiles[name].oy=@oy
        @tiles[name].y = @tile_size_y*y
        @tiles[name].bitmap=Bitmap.new(@map_data.xsize*@tile_size_x,@tile_size_y)
        @tiles[name].bitmap.blt(x*@tile_size_x,0,@bitmap_tiles[id],@dest_rect)
        @tiles[name].visible=@visible
      end
    else
      @rect.x=(id - 384) % 8 * 32
      @rect.y=(id - 384) / 8 * 32
      x *= @tile_size_x
      #y *= @tile_size_y
      @bitmap_tiles[id]=Bitmap.new(@tile_size_x, @tile_size_y)
      @bitmap_tiles[id].stretch_blt(@dest_rect, @tileset, @rect)
      @rect.x=0
      @rect.y=0
      if @tiles[name]
        @tiles[name].bitmap.blt(x,0,@bitmap_tiles[id],@dest_rect)
      else
        @tiles[name] = Sprite.new(@viewport)
        @tiles[name].ox=@ox
        @tiles[name].oy=@oy
        @tiles[name].y = @tile_size_y*y
        @tiles[name].bitmap=Bitmap.new(@map_data.xsize*@tile_size_x,@tile_size_y)
        @tiles[name].bitmap.blt(x,0,@bitmap_tiles[id],@dest_rect)
        @tiles[name].visible=@visible
      end
    end
  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
      name=-(z*MMM+c)
      if @bitmap_tiles[id]
        if @tiles[name]
          @tiles[name].bitmap.blt(x*@tile_size_x,y*@tile_size_y,@bitmap_tiles[id],@dest_rect)
        else
          @tiles[name] = Sprite.new(@viewport)
          @tiles[name].ox=@ox
          @tiles[name].oy=@oy
          @tiles[name].z = z*150 + c
          @tiles[name].bitmap=Bitmap.new(@map_data.xsize*@tile_size_x,@map_data.ysize*@tile_size_y)
          @tiles[name].bitmap.blt(x*@tile_size_x,y*@tile_size_y,@bitmap_tiles[id],@dest_rect)
          @tiles[name].visible=@visible
        end
      else
        bitmap=get_autotile_bmp(id)
        x *= @tile_size_x
        y *= @tile_size_y
        @bitmap_tiles[id]=Bitmap.new(@tile_size_x, @tile_size_y)
        @bitmap_tiles[id].stretch_blt(@dest_rect, bitmap, @rect)
        if @tiles[name]
          @tiles[name].bitmap.blt(x,y,@bitmap_tiles[id],@dest_rect)
        else
          @tiles[name] = Sprite.new(@viewport)
          @tiles[name].ox=@ox
          @tiles[name].oy=@oy
          @tiles[name].z = z*150 + c
          @tiles[name].bitmap=Bitmap.new(@map_data.xsize*@tile_size_x,@map_data.ysize*@tile_size_y)
          @tiles[name].bitmap.blt(x,y,@bitmap_tiles[id],@dest_rect)
          @tiles[name].visible=@visible
        end
      end
    else
      sprite_at(x,y,z,c,id)
    end
  end
 
  #===
  #§Dessin d'autotile
  #===
  def sprite_at(x,y,z,c,id)
    name=id*MMM+x*MM+y*M+z
    @atiles[name]=id
    if @bitmap_tiles[id]
      if @tiles[name]
        @tiles[name].bitmap=@bitmap_tiles[id]
      else
        @tiles[name] = Sprite.new(@viewport)
        @tiles[name].x = x*@tile_size_x
        @tiles[name].y = y*@tile_size_y
        @tiles[name].ox=@ox
        @tiles[name].oy=@oy
        @tiles[name].z = z*150 + c
        @tiles[name].bitmap=@bitmap_tiles[id]
        @tiles[name].visible=@visible
      end
    else
      bitmap=get_autotile_bmp(id)
      x *= @tile_size_x
      y *= @tile_size_y
      @bitmap_tiles[id]=Bitmap.new(@tile_size_x, @tile_size_y)
      @bitmap_tiles[id].stretch_blt(@dest_rect, bitmap, @rect)
      @tiles[name] = Sprite.new(@viewport)
      @tiles[name].x = x
      @tiles[name].y = y
      @tiles[name].z= z*150 + c
      @tiles[name].ox=@ox
      @tiles[name].oy=@oy
      @tiles[name].bitmap=@bitmap_tiles[id]
      @tiles[name].visible=@visible
      if not @autotile_update_ids.include?(id)
        @autotile_update_ids.push(id) if @autotile_max_count[id / 48 - 1] > 1
      end
    end
  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=Bitmap.new(32,32)
    bitmap=@autotile_bmp
    bitmap.clear
    tiles = Autotiles[id / 8][id % 8]
    frames = autotile.width / 96
    anim = (Graphics.frame_count / @update_count) % frames * 96
    4.times{|i|
      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)
    }
    return bitmap
  end
 
  #===
  #§Mise à jour des autotiles.
  #===
  def update_autotiles
    @autotile_update_ids.each {|id|
      #id=@autotile_update_ids[i]
      bitmap=get_autotile_bmp(id)
      #@bitmap_tiles[id]=Bitmap.new(@tile_size_x, @tile_size_y) #Pas besoins d'en recréer
      @bitmap_tiles[id].stretch_blt(@dest_rect, bitmap, @rect)
    }
  end
 
  #===
  #§Mise à jour des positions des Sprites du Tilemap
  #===
  def update_pos
    @tiles.each_key {|i|
      @tiles[i].ox=@ox
      @tiles[i].oy=@oy
      @tiles[i].visible=@visible
      if @atiles[i]
        @tiles[i].bitmap=@bitmap_tiles[@atiles[i]]
      end
      if i.class==Float
        @tiles[i].z=(i.to_i*128 - $game_map.display_y + 3) / 4 + 32 +32
      end
     
    }
  end
 
  #===
  #§Effacement du Tilemap
  #===
  def dispose
    @tiles.each_key {|i|
      @tiles[i].bitmap.clear
      @tiles[i].bitmap=nil
      @tiles[i].dispose
    }
    @tiles.clear
    @bitmap_tiles.each_key{|i|
      @bitmap_tiles[i].dispose
    }
    @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=32/tile_size_x
    @tile_zoom_y=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


Notes

Le script met à jour les autotiles toute les dix frames, les autotiles à une frame sont considérés comme des tiles mais dessinés comme des autotiles.
Il faut éviter de faire des Maps de plus de 50x50 bourrés d'autotiles.
Pour changer les tiles de la Map in Game il suffit normalement d'utiliser la méthode de base et de mettre le code suivant en appel de script pour appliquer les changements. (non testé) :
Code:
$scene.spriteset.tilemap.resize_tiles(16,16)


Crédits
Yuri-塗 ゆり - Codage du Script.


Édit : Le script a été corrigé les tiles en supériorité 1 ne fonctionnaient pas comme sur la version original du Tilemap. Merci à Ayumi pour avoir signaler ce problème.


Dernière édition par Nuri Yuri le Mar 15 Nov - 19:04 (2011); édité 3 fois
Revenir en haut
Facebook Twitter
Publicité






MessagePosté le: Lun 10 Oct - 18:13 (2011)    Sujet du message: Publicité

PublicitéSupprimer les publicités ?
Revenir en haut
Kosuke Kyuu
Membre


Inscrit le: 09 Juin 2011
Messages: 87

MessagePosté le: Mar 25 Oct - 17:00 (2011)    Sujet du message: [MAJ]DS Résolution / Tilemap

Merci Yuri pour ton travail acharné ! ^^
Revenir en haut
Nuri Yuri
Administrateur
Administrateur


Inscrit le: 15 Oct 2008
Messages: 6 383
~Entity~
Localisation: Nancy
Non renseigné (Visible...)
ID Steam: Nuri_Yuri

MessagePosté le: Mar 15 Nov - 19:13 (2011)    Sujet du message: [MAJ]DS Résolution / Tilemap

J'ai remis à jour le script, il est maintenant plus rapide et mange légèrement moins de mémoire que l'ancien et fait 69 lignes de moins.
J'ai fait une comparaison sur une map de 40x40 ayant la couche une remplie d'autotiles avec la mise à jour le jeu tourne à 34 - 40 FPS (environ 37 en moyenne) et consomme 32 000 Ko de mémoire (Testé sur PSP v2 donc sur PSP c'est largement plus grand) avec le script posté le 10 le jeu tourne à 12 - 27 FPS (24 constaté en moyenne, le 12 est un sous régime inexpliqué...) et bouffe 34 000 Ko.
La mémoire utilisé ne sera pas toujours plus faible que la version précédente, il y a des possibilités que ce soit l'inverse, mais au niveau frame_rate je pense que ça va resté assez grand, à vous de tester ça...

Bonne soirée.
Revenir en haut
Facebook Twitter
Kosuke Kyuu
Membre


Inscrit le: 09 Juin 2011
Messages: 87

MessagePosté le: Mar 15 Nov - 19:14 (2011)    Sujet du message: [MAJ]DS Résolution / Tilemap

Je testerai ça, merci. ^^
Revenir en haut
Zohran
Support Technique
Support Technique


Inscrit le: 14 Mai 2011
Messages: 906
Localisation: France
Masculin

MessagePosté le: Ven 30 Aoû - 09:48 (2013)    Sujet du message: [MAJ]DS Résolution / Tilemap

Bonjour, ce script m'intéresse en fait depuis longtemps mais je ne m'en servais pas à cause d'un problème qui me chagrine, il ne supporte pas les autotiles à 8 frames, serait-il possible que tu le modifies pour que cela marche?
En fait, lorsque je met un autotile à 8 frame, graphiquement, ça bugue, ils deviennent de temps à autre noir...
Revenir en haut
Nuri Yuri
Administrateur
Administrateur


Inscrit le: 15 Oct 2008
Messages: 6 383
~Entity~
Localisation: Nancy
Non renseigné (Visible...)
ID Steam: Nuri_Yuri

MessagePosté le: Ven 30 Aoû - 13:38 (2013)    Sujet du message: [MAJ]DS Résolution / Tilemap

Je viens de tester avec un tile avec 8 animations et il n'y a aucun problèmes (de plus les 8 animations s'affichent) donc il se peut que ton graphique soit incorrecte. L'autotile doit faire 768 pixels de largeur. (nb_anime*96)
Si ce n'est pas le cas, refait le ou envoie moi l'image que je voie la chose.
J'ai testé avec ça :
Revenir en haut
Facebook Twitter
Zohran
Support Technique
Support Technique


Inscrit le: 14 Mai 2011
Messages: 906
Localisation: France
Masculin

MessagePosté le: Sam 31 Aoû - 16:13 (2013)    Sujet du message: [MAJ]DS Résolution / Tilemap

Ah, oui effectivement, le bug que je décris ne se produit plus... bizarre, j'ai du faire une erreur désolé, si jamais ça se reproduit, je te le dirais, merci Imbécile heureux
Revenir en haut
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 02:01 (2017)    Sujet du message: [MAJ]DS Résolution / Tilemap

Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Pokémon Script Project Index du Forum -> Game Making -> Ressources techniques -> Scripts Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  

Index | Creer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group
Thème par Thomas et l'équipe de la refonte PSP 2012 (version 1.0)
Traduction par : phpBB-fr.com