查看: 3776|回复: 10

[已经过期] 柳大的xp转Va地图在游戏中换地图后错乱,求解决

[复制链接]
梦石
0
星屑
50
在线时间
138 小时
注册时间
2011-3-6
回帖
45
发表于 2013-11-23 20:40:51 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 sballance 于 2013-11-29 18:26 编辑



----------------------------------------------------------------------------


----------------------------------------------------------------------------


用了柳大的转地图工具之后,在地图编辑界面都是好的。就先举一个例子,就是原来工具里面附带的转好的库。


1.先随便弄一个地图,如图


2.选择下一张地图,这两张地图图块不相同


3.在地图1里面设置玩家初始位置,并设置场所移动事件,如图
03.PNG

4.运行游戏
04.PNG

5.触发事件后场所移动,结果全乱了
05.PNG

6.打开菜单
06.PNG

7.最后,返回游戏的时候吓尿了,地图好了
07.PNG
不知道是什么原因呢?

运行时用到的两个脚本
1.★XP->ACE 通行与遮挡部分


[pre lang="ruby" line="1"]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)
      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[/pre]
2.★Spriteset_Map(改得不多)

[pre lang="ruby" line="1"]#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 = 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[/pre]
就是感觉第二个脚本有些奇怪,注释掉之后发现地图不乱了,但是遮挡有问题了。

但是如果不注释掉,遮挡没问题,但是场所移动后(有图块改变的)地图全乱了



附上文件。



不知道该如何解决,先谢谢各位了


11.PNG
12.PNG
><
梦石
0
星屑
50
在线时间
138 小时
注册时间
2011-3-6
回帖
45
 楼主| 发表于 2013-11-23 20:54:02 | 显示全部楼层
来看看嘛~~@柳柳  
><
回复

使用道具 举报

梦石
0
星屑
55
在线时间
416 小时
注册时间
2012-11-30
回帖
146
发表于 2013-11-23 22:06:01 | 显示全部楼层
我先下下来,明天看看能不能弄懂,反正我不喜欢睡觉,干脆就通宵看看

<object width="630" height="500" align="middle" id="reader" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" classid="clsid:d27cdb6e-ae6d-11cf-96b8-44455354000
回复

使用道具 举报

梦石
0
星屑
50
在线时间
138 小时
注册时间
2011-3-6
回帖
45
 楼主| 发表于 2013-11-23 22:38:58 | 显示全部楼层
1091160905 发表于 2013-11-23 22:06
我先下下来,明天看看能不能弄懂,反正我不喜欢睡觉,干脆就通宵看看

嗯,谢谢啦!{:2_249:}
><
回复

使用道具 举报

巫女会长

梦石
0
星屑
60
在线时间
1028 小时
注册时间
2009-10-24
回帖
3425

贵宾

发表于 2013-11-24 11:45:37 | 显示全部楼层
目测更新图块的时候没有更新相应的图块内容。试试把Spriteset_Map第249行def update_tilemap方法写成:
  def update_tilemap
    @tilemap_all.each_with_index do |tilemap, i|
      tilemap.map_data = xpdata_convert($game_map.data, i)
      tilemap.ox = $game_map.display_x * 32
      tilemap.oy = $game_map.display_y * 32
      tilemap.update
    end
  end
如果再不行不是使用方法问题就是算法有问题。这个你大概只能问66自己了。。
回复

使用道具 举报

梦石
0
星屑
50
在线时间
157 小时
注册时间
2013-8-20
回帖
189
发表于 2013-11-25 20:09:39 | 显示全部楼层
你不会把这个地图图块放到动画那一栏了吧
回复

使用道具 举报

梦石
0
星屑
1622
在线时间
719 小时
注册时间
2013-10-20
回帖
121

开拓者

发表于 2013-11-25 21:07:50 | 显示全部楼层
★Spriteset_Map(改得不多)删了这个脚本即可
别查成分了,啥也没有
回复

使用道具 举报

梦石
0
星屑
50
在线时间
138 小时
注册时间
2011-3-6
回帖
45
 楼主| 发表于 2013-11-29 18:31:29 | 显示全部楼层
dukesward 发表于 2013-11-24 11:45
目测更新图块的时候没有更新相应的图块内容。试试把Spriteset_Map第249行def update_tilemap方法写成:
  d ...

谢谢谢谢!用了之后是比原来好很多了,但是又出现了新的问题,能看一下吗
这图基本是不错乱了,但是存在各种乱


还有,我在上面也更新了一种可以在游戏中手动弄回去的方法,会不会是地图载入出错了呀?不知道能不能用脚本把它在切换地图时自动搞定呢?
><
回复

使用道具 举报

梦石
0
星屑
50
在线时间
138 小时
注册时间
2011-3-6
回帖
45
 楼主| 发表于 2013-11-29 18:34:07 | 显示全部楼层
咖喱卡卡 发表于 2013-11-25 21:07
★Spriteset_Map(改得不多)删了这个脚本即可

删掉的话遮挡就有问题了

点评

那就自己调吧..我都是这么干的  发表于 2013-11-30 11:24
><
回复

使用道具 举报

梦石
0
星屑
50
在线时间
138 小时
注册时间
2011-3-6
回帖
45
 楼主| 发表于 2013-11-30 11:16:53 | 显示全部楼层
dukesward 发表于 2013-11-24 11:45
目测更新图块的时候没有更新相应的图块内容。试试把Spriteset_Map第249行def update_tilemap方法写成:
  d ...

请问一下有没有那种可以重载入地图的方法呢?或者,,不知道为什么到菜单之后返回地图就好了,如果自动执行这其中的步骤应该就好了吧?
><
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部