Project1
标题:
有关事件自寻路的脚本
[打印本页]
作者:
樱花の眼泪
时间:
2014-7-28 17:48
标题:
有关事件自寻路的脚本
我想问下,RPG vx 怎样做追人的事件?就是像魔女之家那种boss会追人的事件,不会乱乱跑而是对准主角的位置追来
我爬了文,下载来看看,可是都开不到,出现这个对话框
有没有大大可以发个较新的档案借我参考参考啊?(偶不是故意要当伸手党的→_→)
谢谢了~
155922rgynry444yy7t82t.jpg
(16.43 KB, 下载次数: 23)
下载附件
保存到相册
2014-7-28 17:47 上传
作者:
白鬼
时间:
2014-7-28 18:43
虽然我用XP的
但是事件设置中,难道没有一个是 靠近角色 的移动方式吗?
作者:
宸小紫
时间:
2014-7-28 20:24
本帖最后由 宸小紫 于 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
复制代码
作者:
正太君
时间:
2014-7-28 20:42
选择Game.rvproj文件,右键,打开方式,选择用记事本打开,把里面的内容改成RPGVX 1.01,不行的话就改成RPGVX 1.00,保存退出,就可以顺利打开了呢...
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1