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 |
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 |