赞 | 19 |
VIP | 100 |
好人卡 | 0 |
积分 | 19 |
经验 | 74719 |
最后登录 | 2022-3-29 |
在线时间 | 101 小时 |
Lv3.寻梦者
- 梦石
- 1
- 星屑
- 916
- 在线时间
- 101 小时
- 注册时间
- 2006-3-27
- 帖子
- 1081
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
尽量把判定做的完善了一点
但是面队两边都可完全通行的障碍,比如一个分叉的尖顶处,我还是没有想到最好的办法
,用了随机方向,不知道怎么判定具体走那边会更完善
基本功能已经实现
---------------3月22日更新,对NPC不进行转向,对于个别需要自动转向的事件,第一行写一句注释“not_npc”即可,见范例
http://rpg.blue/upload_program/files/自动转向修正版.rar
直接使用脚本
- #==============================================================================
- # 使用方法:
- # 1.直接插在MAIN前即可使用
- # 2.面对事件不进行自动转向
- # 3.对于个别需要自动转向的事件,在该事件的第一页第一行写一句注释"not_npc"(不含引号)
- #
- #------------------------------------------------------------------------------
- class Game_Character
- #--------------------------------------------------------------------------
- # ● 可以通行判定
- # 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
复制代码 |
|