赞 | 1 |
VIP | 0 |
好人卡 | 1 |
积分 | 2 |
经验 | 23130 |
最后登录 | 2016-5-15 |
在线时间 | 509 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 180
- 在线时间
- 509 小时
- 注册时间
- 2010-10-1
- 帖子
- 97
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 7408 于 2013-7-20 00:24 编辑
为什么在主站上找了半天也找不到XP的有手感的八方向脚本,只找到了这个教程...http://www.66rpg.com/articles/3126
而且把那一段完成的放到工程上一走就报错....
把这个做成了成品整合了一个绕开障碍的功能,发上来吧。我相信肯定会有人在找这个东东....- #==============================================================================
- # 本脚本来自www.66RPG.com,使用和转载请保留此信息
- #==============================================================================
- #==============================================================================
- #
- # XP版八方向移动及遇到障碍自动转向脚本整合 by 7408,使用和转载请保留此信息
- # 效果:实现手感加强的八方向移动,遇到障碍自动绕开
- # 使用:将此脚本插入到Main前即可,面对事件不进行自动转向,
- # 对于个别需要自动转向的事件,在该事件的第一页
- # 第一行写一句注释"not_npc"(不含引号),
- # 如不需要自动转向功能请删掉354行到593行的内容(就是保留最后一个end)
- #
- #==============================================================================
- class Game_Player < Game_Character
- #--------------------------------------------------------------------------
- # ● 画面更新
- #--------------------------------------------------------------------------
- def update
- # 本地变量记录移动信息
- last_moving = moving?
- # 移动中、事件执行中、强制移动路线中、
- # 信息窗口一个也不显示的时候
- unless moving? or $game_system.map_interpreter.running? or
- @move_route_forcing or $game_temp.message_window_showing
- # 如果方向键被按下、主角就朝那个方向移动
- case Input.dir8
- when 1
- move_lower_left
- when 2
- move_down
- when 3
- move_lower_right
- when 4
- move_left
- when 6
- move_right
- when 7
- move_upper_left
- when 8
- move_up
- when 9
- move_upper_right
- end
- end
- # 本地变量记忆坐标
- last_real_x = @real_x
- last_real_y = @real_y
- super
- # 角色向下移动、画面上的位置在中央下方的情况下
- if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
- # 画面向下卷动
- $game_map.scroll_down(@real_y - last_real_y)
- end
- # 角色向左移动、画面上的位置在中央左方的情况下
- if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
- # 画面向左卷动
- $game_map.scroll_left(last_real_x - @real_x)
- end
- # 角色向右移动、画面上的位置在中央右方的情况下
- if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
- # 画面向右卷动
- $game_map.scroll_right(@real_x - last_real_x)
- end
- # 角色向上移动、画面上的位置在中央上方的情况下
- if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
- # 画面向上卷动
- $game_map.scroll_up(last_real_y - @real_y)
- end
- # 不在移动中的情况下
- unless moving?
- # 上次主角移动中的情况
- if last_moving
- # 与同位置的事件接触就判定为事件启动
- result = check_event_trigger_here([1,2])
- # 没有可以启动的事件的情况下
- if result == false
- # 调试模式为 ON 并且按下 CTRL 键的情况下除外
- unless $DEBUG and Input.press?(Input::CTRL)
- # 遇敌计数下降
- if @encounter_count > 0
- @encounter_count -= 1
- end
- end
- end
- end
- # 按下 C 键的情况下
- if Input.trigger?(Input::C)
- # 判定为同位置以及正面的事件启动
- check_event_trigger_here([0])
- check_event_trigger_there([0,1,2])
- end
- end
- end
- end
- class Game_Character
- #--------------------------------------------------------------------------
- # ● 向左下移动
- #--------------------------------------------------------------------------
- def move_lower_left
- # 没有固定面向的场合
- unless @direction_fix
- # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
- @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
- end
- # 下→左、左→下 的通道可以通行的情况下
- if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) and
- (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
- # 更新坐标
- @x -= 1
- @y += 1
- # 增加步数
- increase_steps
- # 下→左能够通行的情况下
- elsif (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4))
- # 向下移动后向左移动
- move_down
- move_left
- # 左→下能够通行的情况下
- elsif (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
- # 向左移动后向下移动
- move_left
- move_down
- # 如果移动的对象是角色且非强制移动
- elsif self.is_a?(Game_Player) and not @move_route_forcing
- # 面向左时
- if @direction = 4
- # 左方可以通行时
- if passable?(@x, @y, 4)
- # 向左移动
- move_left
- # 不能通行时
- else
- # 左面接触事件启动
- result = check_event_trigger_touch(@x-1, @y)
- # 没有事件的情况下
- unless result
- # 向下移动
- move_down
- end
- end
- # 不面向左时
- else
- # 下方可以通行时
- if passable?(@x, @y, 2)
- # 向下移动
- move_down
- # 不能通行时
- else
- # 下面接触事件启动
- result = check_event_trigger_touch(@x, @y+1)
- # 没有事件的情况下
- unless result
- # 向左移动
- move_left
- end
- end
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 向右下移动
- #--------------------------------------------------------------------------
- def move_lower_right
- # 没有固定面向的场合
- unless @direction_fix
- # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
- @direction = (@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)
- end
- # 下→右、右→下 的通道可以通行的情况下
- if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 6)) or
- (passable?(@x, @y, 6) and passable?(@x + 1, @y, 2))
- # 更新坐标
- @x += 1
- @y += 1
- # 增加步数
- increase_steps
- # 下→右能够通行的情况下
- elsif (passable?(@x, @y, 2) and passable?(@x, @y + 1, 6))
- # 向下移动后向右移动
- move_down
- move_right
- # 右→下能够通行的情况下
- elsif (passable?(@x, @y, 6) and passable?(@x + 1, @y, 2))
- # 向右移动后向下移动
- move_right
- move_down
- # 如果移动的对象是角色且非强制移动
- elsif self.is_a?(Game_Player) and not @move_route_forcing
- # 面向右时
- if @direction = 6
- # 右方可以通行时
- if passable?(@x, @y, 6)
- # 向右移动
- move_right
- # 不能通行时
- else
- # 右面接触事件启动
- result = check_event_trigger_touch(@x+1, @y)
- # 没有事件的情况下
- unless result
- # 向下移动
- move_down
- end
- end
- # 不面向右时
- else
- # 下方可以通行时
- if passable?(@x, @y, 2)
- # 向下移动
- move_down
- # 不能通行时
- else
- # 下面接触事件启动
- result = check_event_trigger_touch(@x, @y+1)
- # 没有事件的情况下
- unless result
- # 向右移动
- move_right
- end
- end
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 向左上移动
- #--------------------------------------------------------------------------
- def move_upper_left
- # 没有固定面向的场合
- unless @direction_fix
- # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
- @direction = (@direction == 6 ? 4 : @direction == 2 ? 8 : @direction)
- end
- # 上→左、左→上 的通道可以通行的情况下
- if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 4)) or
- (passable?(@x, @y, 4) and passable?(@x - 1, @y, 8))
- # 更新坐标
- @x -= 1
- @y -= 1
- # 增加步数
- increase_steps
- # 上→左能够通行的情况下
- elsif (passable?(@x, @y, 8) and passable?(@x, @y - 1, 4))
- # 向上移动后向左移动
- move_up
- move_left
- # 左→上能够通行的情况下
- elsif (passable?(@x, @y, 4) and passable?(@x - 1, @y, 8))
- # 向左移动后向上移动
- move_left
- move_up
- # 如果移动的对象是角色且非强制移动
- elsif self.is_a?(Game_Player) and not @move_route_forcing
- # 面向左时
- if @direction = 4
- # 左方可以通行时
- if passable?(@x, @y, 4)
- # 向左移动
- move_left
- # 不能通行时
- else
- # 左面接触事件启动
- result = check_event_trigger_touch(@x-1, @y)
- # 没有事件的情况下
- unless result
- # 向上移动
- move_up
- end
- end
- # 不面向左时
- else
- # 上方可以通行时
- if passable?(@x, @y, 8)
- # 向上移动
- move_up
- # 不能通行时
- else
- # 上面接触事件启动
- result = check_event_trigger_touch(@x, @y-1)
- # 没有事件的情况下
- unless result
- # 向左移动
- move_left
- end
- end
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 向右上移动
- #--------------------------------------------------------------------------
- def move_upper_right
- # 没有固定面向的场合
- unless @direction_fix
- # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
- @direction = (@direction == 4 ? 6 : @direction == 2 ? 8 : @direction)
- end
- # 上→右、右→上 的通道可以通行的情况下
- if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 6)) or
- (passable?(@x, @y, 6) and passable?(@x + 1, @y, 8))
- # 更新坐标
- @x += 1
- @y -= 1
- # 增加步数
- increase_steps
- # 上→右能够通行的情况下
- elsif (passable?(@x, @y, 8) and passable?(@x, @y - 1, 6))
- # 向上移动后向右移动
- move_up
- move_right
- # 右→上能够通行的情况下
- elsif (passable?(@x, @y, 6) and passable?(@x + 1, @y, 8))
- # 向右移动后向上移动
- move_right
- move_up
- # 如果移动的对象是角色且非强制移动
- elsif self.is_a?(Game_Player) and not @move_route_forcing
- # 面向右时
- if @direction = 6
- # 右方可以通行时
- if passable?(@x, @y, 6)
- # 向右移动
- move_right
- # 不能通行时
- else
- # 右面接触事件启动
- result = check_event_trigger_touch(@x+1, @y)
- # 没有事件的情况下
- unless result
- # 向上移动
- move_up
- end
- end
- # 不面向右时
- else
- # 上方可以通行时
- if passable?(@x, @y, 8)
- # 向上移动
- move_up
- # 不能通行时
- else
- # 上面接触事件启动
- result = check_event_trigger_touch(@x, @y-1)
- # 没有事件的情况下
- unless result
- # 向右移动
- move_right
- end
- end
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 可以通行判定
- # x : X 坐标
- # y : Y 坐标
- # d : 方向 (0,2,4,6,8) ※ 0 = 全方向不能通行的情况判定 (跳跃用)
- #--------------------------------------------------------------------------
- def passable?(x, y, d)
- #---------------------------
- $isnpc = true
- #---------------------------
- # 求得新的坐标
- new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
- new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
- # 坐标在地图以外的情况
- unless $game_map.valid?(new_x, new_y)
- # 不能通行
- return false
- end
- # 穿透是 ON 的情况下
- if @through
- # 可以通行
- return true
- end
- # 移动者的元件无法来到指定方向的情况下
- unless $game_map.passable?(x, y, d, self)
- # 通行不可
- return false
- end
- # 从指定方向不能进入到移动处的元件的情况下
- unless $game_map.passable?(new_x, new_y, 10 - d)
- # 不能通行
- return false
- end
- # 循环全部事件
- for event in $game_map.events.values
- # 事件坐标于移动目标坐标一致的情况下
- if event.x == new_x and event.y == new_y
- # 穿透为 ON
- unless event.through
- # 自己就是事件的情况下
- if self != $game_player
- # 不能通行
- #---------------------------
- $isnpc = false if event.list[0].parameters[0] != "not_npc"
- #---------------------------
- return false
- end
- # 自己是主角、对方的图形是角色的情况下
- if event.character_name != ""
- # 不能通行
- #---------------------------
- $isnpc = false if event.list[0].parameters[0] != "not_npc"
- #---------------------------
- return false
- end
- end
- end
- end
- # 主角的坐标与移动目标坐标一致的情况下
- if $game_player.x == new_x and $game_player.y == new_y
- # 穿透为 ON
- unless $game_player.through
- # 自己的图形是角色的情况下
- if @character_name != ""
- # 不能通行
- return false
- end
- end
- end
- # 可以通行
- return true
- end
-
- #--------------------------------------------------------------------------
- # ● 向下移动
- # turn_enabled : 本场地位置更改许可标志
- #--------------------------------------------------------------------------
- def move_down(turn_enabled = true)
- #---------------------------
- direct = @direction
- #---------------------------
- # 面向下
- if turn_enabled
- turn_down
- end
- # 可以通行的场合
- if passable?(@x, @y, 2)
- # 面向下
- turn_down
- # 更新坐标
- @y += 1
- # 增加步数
- increase_steps
- # 不能通行的情况下
- else
-
- #---------------------------
- if $isnpc
- if passable?(@x, @y, 6) and passable?(@x+1, @y, 2) and passable?(@x, @y, 4) and passable?(@x-1, @y, 2)
- move_left if direct == 4
- move_right if direct == 6
- if direct == 2 or direct == 8
- randtra = rand(2)
- randtra == 0 ? move_left : move_right
- end
- else
- move_left if passable?(@x, @y, 4) and passable?(@x-1, @y, 2)
- move_right if passable?(@x, @y, 6) and passable?(@x+1, @y, 2)
- end
- end
- #---------------------------
- # 接触事件的启动判定
- check_event_trigger_touch(@x, @y+1)
- end
- end
- #--------------------------------------------------------------------------
- # ● 向左移动
- # turn_enabled : 本场地位置更改许可标志
- #--------------------------------------------------------------------------
- def move_left(turn_enabled = true)
- #---------------------------
- direct = @direction
- #---------------------------
- # 面向左
- if turn_enabled
- turn_left
- end
- # 可以通行的情况下
- if passable?(@x, @y, 4)
- # 面向左
- turn_left
- # 更新坐标
- @x -= 1
- # 增加步数
- increase_steps
- # 不能通行的情况下
- else
-
- #---------------------------
- if $isnpc
- if passable?(@x, @y, 8) and passable?(@x, @y-1, 4) and passable?(@x, @y, 2) and passable?(@x, @y+1, 4)
- move_up if direct == 8
- move_down if direct == 2
- if direct == 4 or direct == 6
- randtra = rand(2)
- randtra == 0 ? move_up : move_down
- end
- else
- move_up if passable?(@x, @y, 8) and passable?(@x, @y-1, 4)
- move_down if passable?(@x, @y, 2) and passable?(@x, @y+1, 4)
- end
- end
- #---------------------------
-
- # 接触事件的启动判定
- check_event_trigger_touch(@x-1, @y)
- end
- end
- #--------------------------------------------------------------------------
- # ● 向右移动
- # turn_enabled : 本场地位置更改许可标志
- #--------------------------------------------------------------------------
- def move_right(turn_enabled = true)
- #---------------------------
- direct = @direction
- #---------------------------
- # 面向右
- if turn_enabled
- turn_right
- end
- # 可以通行的场合
- if passable?(@x, @y, 6)
- # 面向右
- turn_right
- # 更新坐标
- @x += 1
- # 增加部数
- increase_steps
- # 不能通行的情况下
- else
- #---------------------------
- if $isnpc
- if passable?(@x, @y, 8) and passable?(@x, @y-1, 6) and passable?(@x, @y, 2) and passable?(@x, @y+1, 6)
- move_up if direct == 8
- move_down if direct == 2
- if direct == 4 or direct == 6
- randtra = rand(2)
- randtra == 0 ? move_up : move_down
- end
- else
- move_up if passable?(@x, @y, 8) and passable?(@x, @y-1, 6)
- move_down if passable?(@x, @y, 2) and passable?(@x, @y+1, 6)
- end
- end
- #---------------------------
- # 接触事件的启动判定
- check_event_trigger_touch(@x+1, @y)
- end
- end
- #--------------------------------------------------------------------------
- # ● 向上移动
- # turn_enabled : 本场地位置更改许可标志
- #--------------------------------------------------------------------------
- def move_up(turn_enabled = true)
- #---------------------------
- direct = @direction
- #---------------------------
- # 面向上
- if turn_enabled
- turn_up
- end
- # 可以通行的情况下
- if passable?(@x, @y, 8)
- # 面向上
- turn_up
- # 更新坐标
- @y -= 1
- # 歩数増加
- increase_steps
- # 不能通行的情况下
- else
- #---------------------------
- if $isnpc
- if passable?(@x, @y, 6) and passable?(@x+1, @y, 8) and passable?(@x, @y, 4) and passable?(@x-1, @y, 8)
- move_left if direct == 4
- move_right if direct == 6
- if direct == 2 or direct == 8
- randtra = rand(2)
- randtra == 0 ? move_left : move_right
- end
- else
- move_left if passable?(@x, @y, 4) and passable?(@x-1, @y, 8)
- move_right if passable?(@x, @y, 6) and passable?(@x+1, @y, 8)
- end
- end
- #---------------------------
- # 接触事件的启动判定
- check_event_trigger_touch(@x, @y-1)
- end
- end
- end
复制代码 貌似复制这个会有数字标号?...给个链接:
八方向 绕开障碍.zip
(3.15 KB, 下载次数: 269)
百度网盘的链接 http://pan.baidu.com/share/link?shareid=2037218928&uk=4247755149
范例
范例.zip
(203.15 KB, 下载次数: 437)
|
评分
-
查看全部评分
|