赞 | 7 |
VIP | 0 |
好人卡 | 0 |
积分 | 10 |
经验 | 0 |
最后登录 | 2023-9-4 |
在线时间 | 72 小时 |
Lv3.寻梦者
- 梦石
- 0
- 星屑
- 1027
- 在线时间
- 72 小时
- 注册时间
- 2019-11-25
- 帖子
- 12
|
(写给楼主)
针对上述1、3点有个行之有效的方法(前提你听得懂)
在Game_Map里维护一个至少定义了读方法的二维数组或一个Hash,以下简称坐标容器吧
在Event定义时将event对象加入到坐标容器中它的坐标的下标/键的位置
覆盖Game_Event的所有能使坐标变化的方法(为了保证坐标变化反映的实时性)(这些方法得从父类Game_Character找起,VA封装得不错,很多方法最终汇集到寥寥几个方法中改变坐标如move_straight,XP明显就分散多了,改坐标的方法一大堆……)
在变化前以坐标为索引删除Game_Map中坐标容器中的self引用,在变化后以新坐标插入self引用(如果你知道super的话一定懂怎么实现),无论坐标是否真的改变都这样做
最后将所有判断事件位置的地方都改为使用这个坐标容器参考
下面是我在VA上用的例子:
- class Game_Map
- def setup_events
- @events = {}
- ...
- @event_point = {}
- @map.events.each do |id, event|
- ...
- @events[id] = Game_Event.new(@map_id, event)
- end
- if @events[id]
- @event_point[[@events[id].x, @events[id].y]] ||= []
- @event_point[[@events[id].x, @events[id].y]] << @events[id]
- end
- end
- ...
- end
复制代码- class Game_Event < Game_Character
- ...
- def moveto(x, y)
- location_remove
- super
- location_insert
- end
- def move_straight(d, turn_ok = true)
- location_remove
- super
- location_insert
- end
- def move_diagonal(horz, vert)
- location_remove
- super
- location_insert
- end
- def jump(x_plus, y_plus)
- location_remove
- super
- location_insert
- end
- def location_remove
- return if !$game_map.event_point[[@x, @y]]
- $game_map.event_point[[@x, @y]].delete(self)
- end
- def location_insert
- $game_map.event_point[[@x, @y]] ||= []
- $game_map.event_point[[@x, @y]].push(self)
- end
- end
复制代码- class Game_Map
- def events_xy(x, y)
- @event_point[[x, y]] ||= []
- end
- def events_xy_any?(x, y, except = nil)
- events_xy(x, y).any? {|event| event != except }
- end
- def events_xy_nt(x, y)
- events_xy(x, y).select {|event| !event.through }
- end
- ............
- end
复制代码
可以简化坐标判定的计算,实测在VA上200事件的50*50地图都不会掉帧,当然这个可能有着RGD的加成
至于XP上那些坐标判断或坐标修改的方法具体在哪,一般多出现于Game_Map Game_Character Game_Event Game_Player(甚至Interpreter?),运用好全局搜索(就是在左边的脚本库栏目里右键搜索),关键字一般是@x =,@y =,for event in events.values之类的,更多的看你的理解吧。 |
评分
-
查看全部评分
|