赞 | 0 |
VIP | 289 |
好人卡 | 7 |
积分 | 1 |
经验 | 7622 |
最后登录 | 2024-2-4 |
在线时间 | 400 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 65
- 在线时间
- 400 小时
- 注册时间
- 2005-10-24
- 帖子
- 634
|
本帖最后由 叶子 于 2012-1-31 05:17 编辑
即插即用的脚本不是很清楚,不过我的一个坑倒是有写过通用的寻路算法用例
当然下面这些不能直接在默认VA工程内使用,只是用法参考。- #==============================================================================
- # ■ SLGGraph
- #------------------------------------------------------------------------------
- # 所有方法都以模块方法存在
- #==============================================================================
- module SLGGraph
- end
- class << SLGGraph
- include Graph
- #--------------------------------------------------------------------------
- # ● 迭代邻居
- #--------------------------------------------------------------------------
- def each_neighbor(u)
- x, y = u
- if passable?(x, y, 2)
- yield([x, y + 1])
- end
- if passable?(x, y, 4)
- yield([x - 1, y])
- end
- if passable?(x, y, 6)
- yield([x + 1, y])
- end
- if passable?(x, y, 8)
- yield([x, y - 1])
- end
- end
- #--------------------------------------------------------------------------
- # ● 可通行
- #--------------------------------------------------------------------------
- def passable?(x, y, d)
- x2 = $game_map.round_x_with_direction(x, d)
- y2 = $game_map.round_y_with_direction(y, d)
- return false unless $game_map.valid?(x2, y2)
- return false if !$game_map.passable?(x, y, d)
- return false if !$game_map.passable?(x2, y2, 10 - d)
- char_block = Proc.new{|char|
- # 这里不判断priority了,如果想事件可穿透,设置through属性
- if @source_battler != nil
- char.block?(@source_battler)
- else
- true
- end
- }
- return false if $game_map.events_xy_nt(x2, y2).any? do |event|
- char_block.call(event)
- end
- if (battler = $game_slg.get_battler_at(x2, y2)) != nil
- return false if char_block.call(battler)
- end
- return true
- end
- #--------------------------------------------------------------------------
- # ● 返回邻居两点间距离
- #--------------------------------------------------------------------------
- def dist_neighbor(u, v)
- return 1
- end
- #--------------------------------------------------------------------------
- # ● 返回Dijkstra寻路实例
- #--------------------------------------------------------------------------
- def dijkstra_search(source, max_dist)
- if source.is_a?(Array)
- @source_battler = nil
- source_pos = source
- else
- @source_battler = source
- source_pos = [@source_battler.x, @source_battler.y]
- end
- return Dijkstra.search(self, source_pos, max_dist)
- end
- end
复制代码 |
|