Project1
标题:
飞檐走壁 - 仿黄金太阳中跳格子 VA 版
[打印本页]
作者:
雪流星
时间:
2012-2-26 06:10
标题:
飞檐走壁 - 仿黄金太阳中跳格子 VA 版
本帖最后由 雪流星 于 2012-2-26 19:31 编辑
飞檐走壁 - 仿黄金太阳中跳格子
VX 版:
http://rpg.blue/forum.php?mod=viewthread&tid=163550
(设定上稍有不同)
当前一格无法行走(如河流),而前二格可以行走,则会跳跃过去
墙顶之间也可以跳跃(飞檐走壁)
无法跳跃的情况
* 前一格是墙壁
* 前一格有事件
* 前一格是柜台
* 游戏测试时,按住 Ctrl 行走时无论如何不会跳跃
如果某些原因想要忽略设定,可以在要忽略的地方方一个事件
事件的第一个指令用注释,填写 "jumpable"(不含引号)
则会忽略所有无法跳跃的情形(按 CTRL 时除外)
2012-02-26 更新功能
* 功能更新:队伍跟随时会随着主角跳跃
class Game_Map
#--------------------------------------------------------------------------
# ● 计算地图元件ID
#--------------------------------------------------------------------------
def get_tile_id(x, y)
a = data[x, y, 0]
return 0 unless a
a-=2000
map_tile_id_0 = (a >= 0) ? a/48 : (a+593)
map_tile_id_1 = (data[x, y, 1]-2000) / 48
map_tile_id_2 = (data[x, y, 2])
map_tile_id_0 = 0 if map_tile_id_0 == -42 # A
map_tile_id_1 = 0 if map_tile_id_1 == -42 # I
map_tile_id_2 = 0 if map_tile_id_2 == -42 # B~E
# 图块 ID 矫正
map_tile_id_0 = map_tile_id_1 if map_tile_id_1 > 0
unless @events.nil?
for event in @events.values
if event.pos?(x, y) and event.tile_id > 0
# 若是事件使用地图元件,使用该地图元件的ID
map_tile_id_2 = event.tile_id
end
end
end
# 返回 [底层ID, 上层ID]
return [map_tile_id_0, map_tile_id_2]
end
end
class Game_Character < Game_CharacterBase
#--------------------------------------------------------------------------
# ● 获取地图元件ID
#--------------------------------------------------------------------------
def get_map_tile_id(x, y)
return $game_map.get_tile_id(x, y)
end
#--------------------------------------------------------------------------
# ● 判断是否能跳跃
#--------------------------------------------------------------------------
def can_jump?
# 面向与方向键不同时不跳跃
return false if Input.dir4 != @direction
return false if debug_through? # 测试行走(按下Ctrl)时不跳跃
x_f1 = x_f2 = @x
y_f1 = y_f2 = @y
# 计算前两格座标
case @direction
when 2
y_f2 += 2
y_f1 += 1
when 4
x_f2 -= 2
x_f1 -= 1
when 6
x_f2 += 2
x_f1 += 1
when 8
y_f2 -= 2
y_f1 -= 1
end
tile_id_0 = get_map_tile_id(@x, @y) # 获取当前格元件ID
tile_id_1 = get_map_tile_id(x_f1, y_f1) # 获取前一格元件ID
tile_id_2 = get_map_tile_id(x_f2, y_f2) # 获取前两格元件ID
event_1 = $game_map.events_xy(x_f1, y_f1) # 获取前一格事件
event_2 = $game_map.events_xy(x_f2, y_f2) # 获取前两格事件
# 事件判断
if !event_1.empty? # 若前一格有事件
return false if !event_2.empty? # 前两格也有事件则不能跳跃
return check_event_jumpable?(event_1) # 判断是否指定可以跳跃
end
# 前第一格判断
if tile_id_1[1]>1
return false # 前一格的B~E层无法通行时也不能跳跃
elsif $game_map.counter?(x_f1, y_f1)
return false # 前一格为柜台时无法跳跃
end
# 判断面前两格是否相同
return false if tile_id_1 == tile_id_2
return false if tile_id_1 == tile_id_0
# 判断面前一格是否墙壁元件
wall_tile = (89..96).to_a + (105..112).to_a + (121..128).to_a # 获取墙壁元件ID
w_top_tile = (81..88).to_a + (97..104).to_a + (113..120).to_a # 获取墙顶元件ID
return false if wall_tile.include?(tile_id_1[0]) # 前一格为墙壁时无法跳跃
if w_top_tile.include?(tile_id_0[0]) # 若当前格为墙顶
# 前一格非墙顶,而前两格为墙顶时则可以跳跃
if !w_top_tile.include?(tile_id_1[0]) && w_top_tile.include?(tile_id_2[0])
return true
end
end
return false if map_passable?(x_f1, y_f1, @direction) # 前一格能通行时不跳跃
return map_passable?(x_f2, y_f2, @direction) # 判断前两格是否能通行
end
#--------------------------------------------------------------------------
# ● 判断某格的事件是否能跳跃
#--------------------------------------------------------------------------
def check_event_jumpable?(events)
events.each{|event|
return true if event.can_jump?
}
return false
end
#--------------------------------------------------------------------------
# ● 执行跳跃
#--------------------------------------------------------------------------
def do_jump(d=@direction)
# 判断跳跃方向
case d
when 2; jump(0, 2) # 向下跳
when 4; jump(-2, 0) # 向左跳
when 6; jump(2, 0) # 向右跳
when 8; jump(0, -2) # 向上跳
end
end
end
class Game_Event < Game_Character
#--------------------------------------------------------------------------
# ● 判断事件是否能跳跃
#--------------------------------------------------------------------------
def can_jump?
return false if @list[0].code != 108 # 第一个指令不是“注释”时返回 false
return @list[0].parameters[0] == "jumpable"
end
end
class Game_Player < Game_Character
#--------------------------------------------------------------------------
# ● 输入移动处理
#--------------------------------------------------------------------------
alias old_move_by_input move_by_input
def move_by_input
# 不能行动时忽略所有动作
return unless movable?
# 解释器执行时忽略所有动作
return if $game_map.interpreter.running?
d = Input.dir4
if can_jump?# 能够跳跃时
if $game_player.followers.visible # 队伍跟随时
$game_player.followers.gather # 跟随队伍聚集
while !$game_player.followers.gather?
$game_player.followers.update # 跟随队伍刷新
end
# 跟随队员跳跃
$game_player.followers.each{ |follower|
follower.do_jump(d)
}
end
do_jump(d) # 执行跳跃
else
old_move_by_input # 呼叫原有方法
end
end
end
复制代码
作者:
fux2
时间:
2012-2-28 10:40
跳跃不就是用来过墙的吗= =
作者:
tang19990919
时间:
2012-4-2 18:35
能用这个做跳格子游戏...对!就这样...
作者:
hwj2778
时间:
2012-4-8 17:11
能问一下怎么改才能按空格键之类才跳呢
作者:
azlunvice
时间:
2012-4-8 18:01
小弟愚見:有土有飯粒會更好,另:此腳本改手動按鍵跳躍會讓玩家更適應八。
作者:
shalicheng2
时间:
2012-4-11 10:28
本帖最后由 shalicheng2 于 2012-4-11 10:30 编辑
只用在室内场景会比较好的感觉,在室外的话估计地图得大改,不能用在有层次感的地图上,推荐用新的地形Id功能…相同数字代表相同层面…然后在地图上设置一下…那样不会产生跳到不同层的情况
作者:
load_ing
时间:
2012-4-11 10:32
本帖最后由 load_ing 于 2012-4-11 10:33 编辑
什么时候能整个制作立交道路的
作者:
badtea
时间:
2023-9-2 20:45
非常有用,十分感谢!
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1