幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3177|回复: 2

[地图画面] VX为什么地图只有两层呢?让它变成3层吧!

[复制链接]

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2009-11-11 00:56:46 | 显示全部楼层 |阅读模式
首先 插入一个精灵的脚本
  1. #==============================================================================
  2. # ■ Sprite_Tile
  3. #------------------------------------------------------------------------------
  4. #  处理地图显示用的精灵(活动块)类。
  5. #==============================================================================
  6. class Sprite_Tile
  7.   #--------------------------------------------------------------------------
  8.   # ● 初始化对象
  9.   #--------------------------------------------------------------------------
  10.   def initialize(viewport)
  11.     @data = $game_map.tile_id_ary.clone
  12.     @sprite = []
  13.     @viewport = viewport
  14.     refresh
  15.   end
  16.   #--------------------------------------------------------------------------
  17.   # ● 获取包含所选图块的元件图档
  18.   #     tile_id : 元件ID
  19.   #--------------------------------------------------------------------------
  20.   def tileset_bitmap(tile_id)
  21.     set_number = tile_id / 256
  22.     return Cache.system("TileB") if set_number == 0
  23.     return Cache.system("TileC") if set_number == 1
  24.     return Cache.system("TileD") if set_number == 2
  25.     return Cache.system("TileE") if set_number == 3
  26.     return nil
  27.   end
  28.   def refresh
  29.     for i in 0...@data.size
  30.       @sprite[i] = Sprite.new(@viewport)
  31.       @sprite[i].bitmap = Bitmap.new(32,32)
  32.       set_tile_bitmap(i,@data[i][0])
  33.       @sprite[i].x = screen_x(@data[i][1])
  34.       @sprite[i].y = screen_y(@data[i][2])
  35.       @sprite[i].z = screen_z(@data[i][0],@data[i][3])
  36.     end
  37.   end
  38.   def set_tile_bitmap(index,tile_id)
  39.     sx = (tile_id / 128 % 2 * 8 + tile_id % 8) * 32
  40.     sy = tile_id % 256 / 8 % 16 * 32
  41.     bitmap = tileset_bitmap(tile_id)
  42.     @sprite[index].bitmap.blt(0,0,bitmap,Rect.new(sx,sy,32,32))
  43.     bitmap.dispose
  44.     @sprite[index].ox = 16
  45.     @sprite[index].oy = 32
  46.   end
  47.   def update
  48.     for i in 0...@data.size
  49.       @sprite[i].x = screen_x(@data[i][1])
  50.       @sprite[i].y = screen_y(@data[i][2])
  51.     end
  52.   end
  53.   def dispose
  54.     for i in 0...@data.size
  55.       @sprite[i].dispose
  56.       @sprite[i].bitmap.dispose
  57.     end
  58.     @data.clear
  59.   end
  60.   #--------------------------------------------------------------------------
  61.   # ● 获取画面 X 坐标
  62.   #--------------------------------------------------------------------------
  63.   def screen_x(x)
  64.     return ($game_map.adjust_x(x * 256) + 8007) / 8 - 1000 + 16
  65.   end
  66.   #--------------------------------------------------------------------------
  67.   # ● 获取画面 Y 坐标
  68.   #--------------------------------------------------------------------------
  69.   def screen_y(y)
  70.     return ($game_map.adjust_y(y * 256) + 8007) / 8 - 1000 + 32
  71.   end
  72.   #--------------------------------------------------------------------------
  73.   # ● 获取画面 Z 坐标
  74.   #--------------------------------------------------------------------------
  75.   def screen_z(id,p)
  76.     if p == 2
  77.       return 200
  78.     elsif p == 0
  79.       return 60
  80.     elsif id > 0
  81.       pass = $game_map.passages[id]
  82.       if pass & 0x10 == 0x10    # [☆]
  83.         return 160
  84.       else
  85.         return 40
  86.       end
  87.     else
  88.       return 100
  89.     end
  90.   end
  91. end
复制代码

在Spriteset_Map中分别在

    @tilemap = Tilemap.new(@viewport1)
    @tilemap.dispose
    @tilemap.update
每句后面各加上
    @tilemap_3 = Tilemap.new(@viewport1)
    @tilemap_3.dispose
    @tilemap_3.update

另外更改 Game_Map

定义实例变量中加一个
  attr_reader   :tile_id_ary              # 地图第三层
初始化的方法中加入
    @tile_id_ary = []

  #--------------------------------------------------------------------------
  # ● 设置事件
  #--------------------------------------------------------------------------
  def setup_events
    @events = {}          # 地图事件
的后面加入下面的脚本
  1.     @tile_id_ary.clear
  2.     for i in @map.events.keys
  3.       if @map.events[i].name == ""
  4.         id = @map.events[i].pages[0].graphic.tile_id
  5.         if id > 0
  6.           x = @map.events[i].x
  7.           y = @map.events[i].y
  8.           p = @map.events[i].pages[0].priority_type
  9.           @tile_id_ary.push([id,x,y,p])
  10.           next
  11.         end
  12.       end
  13.     end
复制代码
将   def passable?(x, y, flag = 0x01)  这个方法整体替换成
  1.   def passable?(x, y, flag = 0x01)
  2.     for event in events_xy(x, y)            # 调用坐标一致的事件
  3.       next if event.tile_id == 0            # 没有元件图片
  4.       next if event.priority_type > 0       # 不是"在普通角色下"
  5.       next if event.through                 # 直接通过状态
  6.       pass = @passages[event.tile_id]       # 通行属性を取得
  7.       next if pass & 0x10 == 0x10           # [☆] : 不受通行影响
  8.       return true if pass & flag == 0x00    # [○] : 可以通行
  9.       return false if pass & flag == flag   # [×] : 不可以通行
  10.     end
  11.     for i in 0...@tile_id_ary.size
  12.       if @tile_id_ary[i][1] == x && @tile_id_ary[i][2] == y
  13.         pass = @passages[@tile_id_ary[i][0]]# 通行属性を取得
  14.         next if pass & 0x10 == 0x10         # [☆] : 不受通行影响
  15.         return true if pass & flag == 0x00  # [○] : 可以通行
  16.         return false if pass & flag == flag # [×] : 不可以通行
  17.       end
  18.     end
  19.     for i in [2, 1, 0]                      # 调用图层顺序
  20.       tile_id = @map.data[x, y, i]          # 获取元件 ID
  21.       return false if tile_id == nil        # 获取元件 ID 失败 : 不可以通行
  22.       pass = @passages[tile_id]             # 通行属性を取得
  23.       next if pass & 0x10 == 0x10           # [☆] : 不受通行影响
  24.       return true if pass & flag == 0x00    # [○] : 可以通行
  25.       return false if pass & flag == flag   # [×] : 不可以通行
  26.     end
  27.     return false                            # 不可以通行
  28.   end
复制代码

用法,事件图块选地图的。。。事件名清空优先级什么的自己定吧。。。
比单纯的事件帧率高点呢?
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复

使用道具 举报

7

主题

84

帖子

769

积分

⑤进阶

积分
769
发表于 2010-1-15 20:01:26 | 显示全部楼层
有个疑问,这样改完了后,在RMVX制作的时候,会不会显示出来呢?还是只会在游戏运行中显示?
哎呀呀呀~
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
 楼主| 发表于 2010-1-15 20:26:34 | 显示全部楼层
能显示出
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-3-29 04:02 , Processed in 0.025284 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表