赞 | 0 |
VIP | 0 |
好人卡 | 0 |
积分 | 1 |
经验 | 0 |
最后登录 | 2014-8-6 |
在线时间 | 4 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 905
- 在线时间
- 4 小时
- 注册时间
- 2014-7-21
- 帖子
- 4
|
本帖最后由 宸小紫 于 2014-7-28 20:36 编辑
翻译的时候有用到谷歌翻译。。。所以你就将就一下吧。。。- =begin
- ■移动路线强化功能 RGSS2 DAIpage■ v0.6
- 脚本来源:魔女之家 汉化:宸小紫
- ●如何使用功能●
- 移动路线的设置
- ・最短距离移动(考虑障碍物)
- ・指定区域内随机移动(使用地图的区域功能)
- 额外功能的追加。
- 还可以使用在,移动类型“随机”,触发按钮为“确定键”,优先级
- “与普通角色相同”的事件,受到玩家阻挡,或改变方向移动。街道
- 等狭窄的地方,通行受玩家的干扰的时候使用。
-
- 移动路线的设定可以通过在移动路线的“自定义”中通过脚本设定
- 【以最短移动路线的顺序移动一步】
- ※ 指定目标坐标x,y。
- target_p_move_auto(x, y)
-
- 【指定区域内随机移动】当你离开区域的时候。
- ※ id为指定区域id。
- move_type_area_random(id)
-
- 【接近指定事件】
- ※ 指定id为目标事件的ID。玩家为0。
- target_c_move_auto(id)
-
- 【可以通行的情况下前进,否则向随机方向转换】
- search_front
-
- ●重新定义的地方●
- 设定Game_Player为Game_Character的别名。
- ※可能会和改变相同位置的脚本冲突
- ●参考●
- 这个脚本的一些功能,参考以下网址并重新编写
- RPGツクールシステム研究室
- http://suppy1632.hp.infoseek.co.jp/
- =end
- #============================================================================
- # 自定义点
- #============================================================================
- module DAI_Move
-
- # 以最短距离移动到指定位置再次计算的间隔歩数。
- # 数字越大精确度越低。
- P = 2
-
- # 随机移动的事件向玩家远离的功能。
- E = true
-
- end
- #==============================================================================
- # ■ Game_Character
- #==============================================================================
- class Game_Character
- #--------------------------------------------------------------------------
- # ● 公共实例变量
- #--------------------------------------------------------------------------
- attr_reader :move_type
- attr_reader :stop_count
- attr_reader :move_frequency
- #--------------------------------------------------------------------------
- # ● 创建到目的地的最短路线
- #--------------------------------------------------------------------------
- def search_route(target_x, target_y, type = 0)
- @route_count = 0
- @target_route = []
- return false if target_x == @x and target_y == @y
- @openlist = [@x * 1000 + @y, target_x * 1000 + target_y]
- @closelist = {@x * 1000 + @y=>0, target_x * 1000 + target_y=>1}
- @lootlist = [[],[]]
- [url=home.php?mod=space&uid=83309]@pointer[/url] = 0
- while [url=home.php?mod=space&uid=83309]@pointer[/url] < @openlist.length
- for i in 1..4
- a = way(i)
- b = @openlist[@pointer]
- c = @lootlist[@pointer]
- if @closelist.include?(a)
- if @closelist[a] != @closelist[b]
- if @closelist[a] == 0
- half_route = c
- half_route.push 5 - i
- perfect_route = @lootlist[@openlist.index(a)]
- else
- half_route = @lootlist[@openlist.index(a)]
- perfect_route = c
- perfect_route.push i
- end
- half_route.reverse!
- perfect_route += half_route
- @target_route = perfect_route
- return @target_route
- end
- else
- if type == 0
- newloot(a, b, c, i) if dir_passable?(b / 1000, b % 1000, i * 2)
- else
- newloot(a, b, c, i) if dir_e_passable?(b / 1000, b % 1000, i * 2)
- end
- end
- end
- @pointer += 1
- end
- return false
- end
- #--------------------------------------------------------------------------
- # ● 坐标变换
- #--------------------------------------------------------------------------
- def way(i)
- case i
- when 1 ; a = @openlist[@pointer] + 1
- when 2 ; a = @openlist[@pointer] - 1000
- when 3 ; a = @openlist[@pointer] + 1000
- when 4 ; a = @openlist[@pointer] - 1
- end
- return a
- end
- #--------------------------------------------------------------------------
- # ● 新增路线
- #--------------------------------------------------------------------------
- def newloot(a, b, c, i)
- @openlist.push a
- @closelist[a] = @closelist[b]
- loot = c.dup
- if @closelist[a] == 0
- loot.push i
- else
- loot.push 5 - i
- end
- @lootlist.push loot
- end
- #--------------------------------------------------------------------------
- # ● 判断能否从指定坐标向指定方向通行
- #--------------------------------------------------------------------------
- def dir_passable?(x, y, d)
- case d
- when 2 ; a = passable?(x, y + 1)
- when 4 ; a = passable?(x - 1, y)
- when 6 ; a = passable?(x + 1, y)
- when 8 ; a = passable?(x, y - 1)
- end
- return a
- end
- #--------------------------------------------------------------------------
- # ● 不考虑单位碰撞时指定方向通行可能的判定
- #--------------------------------------------------------------------------
- def dir_e_passable?(x, y, d)
- case d
- when 2 ; a = e_passable?(x, y + 1)
- when 4 ; a = e_passable?(x - 1, y)
- when 6 ; a = e_passable?(x + 1, y)
- when 8 ; a = e_passable?(x, y - 1)
- end
- return a
- end
- #--------------------------------------------------------------------------
- # ● 不考虑单位碰撞时通行可能的判定
- #--------------------------------------------------------------------------
- def e_passable?(x, y)
- x = $game_map.round_x(x)
- y = $game_map.round_y(y)
- return false unless $game_map.valid?(x, y)
- return true if @through or debug_through?
- return false unless map_passable?(x, y)
- return true
- end
- #--------------------------------------------------------------------------
- # ● 根据最短移动路线的顺序移动(事件命令:仅限脚本)
- #--------------------------------------------------------------------------
- def target_route_move(x, y)
- if search_route(x, y, 0) == false
- search_route(x, y, 1)
- else
- search_route(x, y)
- end
- move_route = RPG::MoveRoute.new
- for i in 0...@target_route.length
- move_route.list[i] = RPG::MoveCommand.new
- move_route.list[i].code = @target_route[i]
- end
- force_move_route(move_route)
- @target_route = []
- return
- end
- #--------------------------------------------------------------------------
- # ● 以最短移动路线的顺序移动一步(指定移动路线专用)
- #--------------------------------------------------------------------------
- def target_p_move_auto(x, y)
- if @route_count == DAI_Move::P or @target_route == nil
- if search_route(x, y, 0) == false
- search_route(x, y, 1)
- else
- search_route(x, y)
- end
- end
- case @target_route[@route_count]
- when 1 ; move_down
- when 2 ; move_left
- when 3 ; move_right
- when 4 ; move_up
- end
- @route_count += 1
- return
- end
- #--------------------------------------------------------------------------
- # ● 接近指定人物(指定移动路线专用)
- #--------------------------------------------------------------------------
- def target_c_move_auto(id)
- if id == 0
- target = $game_player
- else
- target = $game_map.events[id]
- end
- return if target == nil
- target_p_move_auto(target.x, target.y)
- end
- #--------------------------------------------------------------------------
- # ● 可以通行的情况下前进,否则向随机方向转换
- #--------------------------------------------------------------------------
- def search_front
- unless moving?
- if dir_passable?(@x, @y, @direction)
- move_forward
- else
- turn_random
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 移动类型 : 随机
- #--------------------------------------------------------------------------
- def move_type_area_random(id)
- case rand(6)
- when 0..1; move_area_random(id)
- when 2..4; move_forward if dir_passable_in_area?(@direction, id)
- when 5; @stop_count = 0
- end
- end
- #--------------------------------------------------------------------------
- # ● 区域内随机移动
- #--------------------------------------------------------------------------
- def move_area_random(id)
- a = in_area_passable?(id)
- return if a.empty?
- b = rand(a.size)
- case a[b]
- when 2 ; move_down(false)
- when 4 ; move_left(false)
- when 6 ; move_right(false)
- when 8 ; move_up(false)
- end
- end
- #--------------------------------------------------------------------------
- # ● 取得区域内可以通行的方向
- #--------------------------------------------------------------------------
- def in_area_passable?(id)
- a = []
- a.push 2 if dir_passable_in_area?(2, id)
- a.push 4 if dir_passable_in_area?(4, id)
- a.push 6 if dir_passable_in_area?(6, id)
- a.push 8 if dir_passable_in_area?(8, id)
- return a
- end
- #--------------------------------------------------------------------------
- # ● 指定方向的区域内可以通行吗?
- #--------------------------------------------------------------------------
- def dir_passable_in_area?(d, id)
- case d
- when 2
- return $game_map.in_area?(id, @x, @y + 1) && dir_passable?(@x, @y, 2)
- when 4
- return $game_map.in_area?(id, @x - 1, @y) && dir_passable?(@x, @y, 4)
- when 6
- return $game_map.in_area?(id, @x + 1, @y) && dir_passable?(@x, @y, 4)
- when 8
- return $game_map.in_area?(id, @x, @y - 1) && dir_passable?(@x, @y, 8)
- end
- end
- #--------------------------------------------------------------------------
- # ● 移动类型 : 自定义
- #--------------------------------------------------------------------------
- alias dai_custom_move_move_type_custom move_type_custom
- def move_type_custom
- return if @move_route.list[@move_route_index] == nil
- dai_custom_move_move_type_custom
- end
- end
- #==============================================================================
- # ■ Game_Player
- #==============================================================================
- class Game_Player < Game_Character
- #--------------------------------------------------------------------------
- # ● 接触事件的执行判定
- #--------------------------------------------------------------------------
- alias dai_custom_move_check_event_trigger_touch check_event_trigger_touch
- def check_event_trigger_touch(x, y)
- for event in $game_map.events_xy(x, y)
- if event.trigger == 0 && event.priority_type == 1 && DAI_Move::E &&
- event.move_type == 1 && event.stop_count > 30 * (4 - event.move_frequency)
- event.move_away_from_player
- end
- end
- dai_custom_move_check_event_trigger_touch(x, y)
- end
- end
- #==============================================================================
- # ■ Game_Map
- #==============================================================================
- class Game_Map
- #--------------------------------------------------------------------------
- # ● 区域确定
- #--------------------------------------------------------------------------
- def in_area?(id, x, y)
- area = $data_areas[id]
- return false if area == nil
- return false if $game_map.map_id != area.map_id
- return false if x < area.rect.x
- return false if y < area.rect.y
- return false if x >= area.rect.x + area.rect.width
- return false if y >= area.rect.y + area.rect.height
- return true
- end
- end
复制代码 |
评分
-
查看全部评分
|