class RPG::Tileset attr_accessor :id attr_accessor :name attr_accessor :tileset_name attr_accessor :autotile_names attr_accessor :panorama_name attr_accessor :panorama_hue attr_accessor :fog_name attr_accessor :fog_hue attr_accessor :fog_opacity attr_accessor :fog_blend_type attr_accessor :fog_zoom attr_accessor :fog_sx attr_accessor :fog_sy attr_accessor :battleback_name attr_accessor :passages attr_accessor :priorities attr_accessor :terrain_tags end class Game_Map #-------------------------------------------------------------------------- # ● 通行检查 # bit : 判断通行禁止与否的字节(请参照二进制运算) #-------------------------------------------------------------------------- def check_passage(x, y, bit) for i in 0..2 tile_id = all_tiles(x, y)[i] flag = tileset.flags[tile_id] if flag & 0x10 != 0 # [☆] : 不影响通行 next if i < 2 end return true if flag & bit == 0 # [○] : 可以通行 return false if flag & bit == bit # [×] : 不能通行 end return false # 不能通行 end end #============================================================================== # ■ Game_CharacterEasy #------------------------------------------------------------------------------ # 管理地图人物的基本类。是所有地图人物类的共通父类。拥有坐标、图片等基本信息。 #============================================================================== class Game_MapTile #-------------------------------------------------------------------------- # ● 定义实例变量 #-------------------------------------------------------------------------- attr_reader :id # ID attr_reader :x # 地图 X 坐标(理论坐标) attr_reader :y # 地图 Y 坐标(理论坐标) attr_reader :real_x # 地图 X 坐标(实际坐标) attr_reader :real_y # 地图 Y 坐标(实际坐标) attr_reader :tile_id # 图块 ID(0 则无效) attr_reader :character_name # 行走图文件名 attr_reader :character_index # 行走图索引 attr_accessor :animation_id attr_accessor :balloon_id #-------------------------------------------------------------------------- # ● 初始化对象 #-------------------------------------------------------------------------- def initialize init_public_members end def set_static_tile(id, priority) @static_tile = true @tile_id = id @priority = priority end def static_tile? return false if @static_tile == nil return true end #-------------------------------------------------------------------------- # ● 初始化公有成员变量 #-------------------------------------------------------------------------- def init_public_members @id = 0 @x = 0 @y = 0 @real_x = 0 @real_y = 0 @tile_id = 0 @character_name = "" @character_index = 0 @animation_id = 0 @balloon_id = 0 end #-------------------------------------------------------------------------- # ● 移动到指定位置 #-------------------------------------------------------------------------- def moveto(x, y) @x = x % $game_map.width @y = y % $game_map.height @real_x = @x @real_y = @y end #-------------------------------------------------------------------------- # ● 判定优先级“与人物同层” #-------------------------------------------------------------------------- def normal_priority? @priority_type == 1 end #-------------------------------------------------------------------------- # ● 获取画面 X 坐标 #-------------------------------------------------------------------------- def screen_x $game_map.adjust_x(@real_x) * 32 + 16 end #-------------------------------------------------------------------------- # ● 获取画面 Y 坐标 #-------------------------------------------------------------------------- def screen_y $game_map.adjust_y(@real_y) * 32 + 32 end #-------------------------------------------------------------------------- # ● 获取画面 Z 坐标 #-------------------------------------------------------------------------- def screen_z 100 + (@priority - 1) * 32 end #-------------------------------------------------------------------------- # ● 更新画面 #-------------------------------------------------------------------------- def update end end #============================================================================== # ■ Sprite_Character #------------------------------------------------------------------------------ # 地图人物的精灵。根据 Game_Character 类的实例而产生自动变化。 #============================================================================== class Sprite_Character < Sprite_Base alias update_old update unless $@ def update if @static_tile == nil @static_tile = @character.is_a?(Game_MapTile) if @static_tile super update_bitmap update_src_rect update_position return end elsif @static_tile super update_position return end update_old end #-------------------------------------------------------------------------- # ● 获取指定图块 ID 的图块组 #-------------------------------------------------------------------------- def tileset_bitmap(tile_id) if tile_id >= 1536 and tile_id <= 1663 # X6R pid = 4 else pid = 5 + tile_id / 256 return if ![5, 6, 7, 8].include?(pid) end filename = $game_map.tileset.tileset_names[pid] tile = Cache.tileset(filename) return tile end end
#encoding:utf-8 #============================================================================== # ■ Spriteset_Map #------------------------------------------------------------------------------ # 处理地图画面精灵和图块的类。本类在 Scene_Map 类的内部使用。 #============================================================================== class Spriteset_Map #-------------------------------------------------------------------------- # ● 初始化对象 #-------------------------------------------------------------------------- def initialize create_viewports create_tilemap create_parallax create_characters create_shadow create_weather create_pictures create_timer update end #-------------------------------------------------------------------------- # ● 生成显示端口 #-------------------------------------------------------------------------- def create_viewports @viewport1 = Viewport.new @viewport2 = Viewport.new @viewport3 = Viewport.new @viewport2.z = 50 @viewport3.z = 100 end #-------------------------------------------------------------------------- # ● 读取图块地图 #-------------------------------------------------------------------------- def create_tilemap @tilemap_all = [] @char_tileset = {} tilemap = Tilemap.new(@viewport1) tilemap.map_data = xpdata_convert($game_map.data, 1) @tilemap_all.push(tilemap) tilemap = Tilemap.new(@viewport1) tilemap.map_data = xpdata_convert($game_map.data, 2) @tilemap_all.push(tilemap) tilemap = Tilemap.new(@viewport1) tilemap.map_data = xpdata_convert($game_map.data, 3) @tilemap_all.push(tilemap) load_tileset end def xpdata_convert(orial_data, id) get_data = orial_data.clone for x in 0...get_data.xsize for y in 0...get_data.ysize for i in 0..2 if $game_map.tileset.priorities[get_data[x, y, i]] > 0 and get_data[x, y, i] != 0 if !@char_tileset.keys.include?(x.to_s + "_" + y.to_s + "_" + i.to_s) char = Game_MapTile.new char.set_static_tile( get_data[x, y, i] , $game_map.tileset.priorities[get_data[x, y, i]] ) char.moveto(x, y) @char_tileset[x.to_s + "_" + y.to_s + "_" + i.to_s] = char end get_data[x, y, i] = 0 end end case id when 1 get_data[x, y, 2] = get_data[x, y, 0] get_data[x, y, 0] = 0 get_data[x, y, 1] = 0 when 2 get_data[x, y, 2] = get_data[x, y, 1] get_data[x, y, 0] = 0 get_data[x, y, 1] = 0 when 3 get_data[x, y, 0] = 0 get_data[x, y, 1] = 0 end end end return get_data end #-------------------------------------------------------------------------- # ● 读取图块组 #-------------------------------------------------------------------------- def load_tileset @tileset = $game_map.tileset @tileset.tileset_names.each_with_index do |name, i| for tilemap in @tilemap_all tilemap.bitmaps[i] = Cache.tileset(name) end end for tilemap in @tilemap_all tilemap.flags = @tileset.flags end end #-------------------------------------------------------------------------- # ● 生成远景图 #-------------------------------------------------------------------------- def create_parallax @parallax = Plane.new(@viewport1) @parallax.z = -100 end #-------------------------------------------------------------------------- # ● 生成人物精灵 #-------------------------------------------------------------------------- def create_characters @character_sprites = [] $game_map.events.values.each do |event| @character_sprites.push(Sprite_Character.new(@viewport1, event)) end @char_tileset.values.each do |char| @character_sprites.push(Sprite_Character.new(@viewport1, char)) end $game_map.vehicles.each do |vehicle| @character_sprites.push(Sprite_Character.new(@viewport1, vehicle)) end $game_player.followers.reverse_each do |follower| @character_sprites.push(Sprite_Character.new(@viewport1, follower)) end @character_sprites.push(Sprite_Character.new(@viewport1, $game_player)) @map_id = $game_map.map_id end #-------------------------------------------------------------------------- # ● 生成飞艇影子 #-------------------------------------------------------------------------- def create_shadow @shadow_sprite = Sprite.new(@viewport1) @shadow_sprite.bitmap = Cache.system("Shadow") @shadow_sprite.ox = @shadow_sprite.bitmap.width / 2 @shadow_sprite.oy = @shadow_sprite.bitmap.height @shadow_sprite.z = 180 end #-------------------------------------------------------------------------- # ● 生成天气 #-------------------------------------------------------------------------- def create_weather @weather = Spriteset_Weather.new(@viewport2) end #-------------------------------------------------------------------------- # ● 生成图片精灵 #-------------------------------------------------------------------------- def create_pictures @picture_sprites = [] end #-------------------------------------------------------------------------- # ● 生成计时器精灵 #-------------------------------------------------------------------------- def create_timer @timer_sprite = Sprite_Timer.new(@viewport2) end #-------------------------------------------------------------------------- # ● 释放 #-------------------------------------------------------------------------- def dispose dispose_tilemap dispose_parallax dispose_characters dispose_shadow dispose_weather dispose_pictures dispose_timer dispose_viewports end #-------------------------------------------------------------------------- # ● 释放地图图块 #-------------------------------------------------------------------------- def dispose_tilemap for tilemap in @tilemap_all do tilemap.dispose end end #-------------------------------------------------------------------------- # ● 释放远景图 #-------------------------------------------------------------------------- def dispose_parallax @parallax.bitmap.dispose if @parallax.bitmap @parallax.dispose end #-------------------------------------------------------------------------- # ● 释放人物精灵 #-------------------------------------------------------------------------- def dispose_characters @character_sprites.each {|sprite| sprite.dispose } end #-------------------------------------------------------------------------- # ● 释放飞艇影子 #-------------------------------------------------------------------------- def dispose_shadow @shadow_sprite.dispose end #-------------------------------------------------------------------------- # ● 释放天气 #-------------------------------------------------------------------------- def dispose_weather @weather.dispose end #-------------------------------------------------------------------------- # ● 释放图片精灵 #-------------------------------------------------------------------------- def dispose_pictures @picture_sprites.compact.each {|sprite| sprite.dispose } end #-------------------------------------------------------------------------- # ● 释放计时器精灵 #-------------------------------------------------------------------------- def dispose_timer @timer_sprite.dispose end #-------------------------------------------------------------------------- # ● 释放显示端口 #-------------------------------------------------------------------------- def dispose_viewports @viewport1.dispose @viewport2.dispose @viewport3.dispose end #-------------------------------------------------------------------------- # ● 更新人物 #-------------------------------------------------------------------------- def refresh_characters dispose_characters create_characters end #-------------------------------------------------------------------------- # ● 更新画面 #-------------------------------------------------------------------------- def update update_tileset update_tilemap update_parallax update_characters update_shadow update_weather update_pictures update_timer update_viewports end #-------------------------------------------------------------------------- # ● 监察图块组是否需要被切换 #-------------------------------------------------------------------------- def update_tileset if @tileset != $game_map.tileset load_tileset refresh_characters end end #-------------------------------------------------------------------------- # ● 更新地图图块 #-------------------------------------------------------------------------- def update_tilemap for tilemap in @tilemap_all tilemap.ox = $game_map.display_x * 32 tilemap.oy = $game_map.display_y * 32 tilemap.update end end #-------------------------------------------------------------------------- # ● 更新远景图 #-------------------------------------------------------------------------- def update_parallax if @parallax_name != $game_map.parallax_name @parallax_name = $game_map.parallax_name @parallax.bitmap.dispose if @parallax.bitmap @parallax.bitmap = Cache.parallax(@parallax_name) Graphics.frame_reset end @parallax.ox = $game_map.parallax_ox(@parallax.bitmap) @parallax.oy = $game_map.parallax_oy(@parallax.bitmap) end #-------------------------------------------------------------------------- # ● 更新人物精灵 #-------------------------------------------------------------------------- def update_characters refresh_characters if @map_id != $game_map.map_id @character_sprites.each {|sprite| sprite.update } end #-------------------------------------------------------------------------- # ● 更新飞艇影子 #-------------------------------------------------------------------------- def update_shadow airship = $game_map.airship @shadow_sprite.x = airship.screen_x @shadow_sprite.y = airship.screen_y + airship.altitude @shadow_sprite.opacity = airship.altitude * 8 @shadow_sprite.update end #-------------------------------------------------------------------------- # ● 更新天气 #-------------------------------------------------------------------------- def update_weather @weather.type = $game_map.screen.weather_type @weather.power = $game_map.screen.weather_power @weather.ox = $game_map.display_x * 32 @weather.oy = $game_map.display_y * 32 @weather.update end #-------------------------------------------------------------------------- # ● 更新图片精灵 #-------------------------------------------------------------------------- def update_pictures $game_map.screen.pictures.each do |pic| @picture_sprites[pic.number] ||= Sprite_Picture.new(@viewport2, pic) @picture_sprites[pic.number].update end end #-------------------------------------------------------------------------- # ● 更新计时器精灵 #-------------------------------------------------------------------------- def update_timer @timer_sprite.update end #-------------------------------------------------------------------------- # ● 更新显示端口 #-------------------------------------------------------------------------- def update_viewports @viewport1.tone.set($game_map.screen.tone) @viewport1.ox = $game_map.screen.shake @viewport2.color.set($game_map.screen.flash_color) @viewport3.color.set(0, 0, 0, 255 - $game_map.screen.brightness) @viewport1.update @viewport2.update @viewport3.update end end
11.PNG (145.42 KB, 下载次数: 40)
12.PNG (118.84 KB, 下载次数: 40)
dukesward 发表于 2013-11-24 11:45
目测更新图块的时候没有更新相应的图块内容。试试把Spriteset_Map第249行def update_tilemap方法写成:
d ...
dukesward 发表于 2013-11-24 11:45
目测更新图块的时候没有更新相应的图块内容。试试把Spriteset_Map第249行def update_tilemap方法写成:
d ...
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |