设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2628|回复: 6
打印 上一主题 下一主题

[已经过期] 能帮忙看看这个跳跃脚本的执行方法吗?

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
75 小时
注册时间
2013-8-1
帖子
26
跳转到指定楼层
1
发表于 2013-8-7 12:36:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
每个键都试过了也不能跳
  1. class Game_Map
  2.   #--------------------------------------------------------------------------
  3.   # ● 计算地图元件ID
  4.   #--------------------------------------------------------------------------
  5.   def get_tile_id(x, y)
  6.     a = data[x, y, 0]
  7.     return 0 unless a
  8.     a-=2000
  9.     map_tile_id_0 = (a >= 0) ? a/48 : (a+593)
  10.     map_tile_id_1 = (data[x, y, 1]-2000) / 48
  11.     map_tile_id_2 = (data[x, y, 2])
  12.          
  13.     map_tile_id_0 = 0 if map_tile_id_0 == -42 # A
  14.     map_tile_id_1 = 0 if map_tile_id_1 == -42 # I
  15.     map_tile_id_2 = 0 if map_tile_id_2 == -42 # B~E
  16.    
  17.     # 图块 ID 矫正
  18.     map_tile_id_0 = map_tile_id_1 if map_tile_id_1 > 0
  19.     unless @events.nil?
  20.       for event in @events.values
  21.         if event.pos?(x, y) and event.tile_id > 0
  22.           # 若是事件使用地图元件,使用该地图元件的ID
  23.           map_tile_id_2 = event.tile_id
  24.         end
  25.       end
  26.     end
  27.     # 返回 [底层ID, 上层ID]
  28.     return [map_tile_id_0, map_tile_id_2]
  29.   end
  30. end
  31. class Game_Character < Game_CharacterBase
  32.   #--------------------------------------------------------------------------
  33.   # ● 获取地图元件ID
  34.   #--------------------------------------------------------------------------
  35.   def get_map_tile_id(x, y)
  36.     return $game_map.get_tile_id(x, y)
  37.   end
  38.   #--------------------------------------------------------------------------
  39.   # ● 判断是否能跳跃
  40.   #--------------------------------------------------------------------------
  41.   def can_jump?
  42.     # 面向与方向键不同时不跳跃
  43.     return false if Input.dir4 != @direction
  44.     return false if debug_through? # 测试行走(按下Ctrl)时不跳跃
  45.     x_f1 = x_f2 = @x
  46.     y_f1 = y_f2 = @y
  47.    
  48.     # 计算前两格座标
  49.     case @direction
  50.     when 2
  51.       y_f2 += 2
  52.       y_f1 += 1
  53.     when 4
  54.       x_f2 -= 2
  55.       x_f1 -= 1
  56.     when 6
  57.       x_f2 += 2
  58.       x_f1 += 1
  59.     when 8
  60.       y_f2 -= 2
  61.       y_f1 -= 1
  62.     end
  63.     tile_id_0 = get_map_tile_id(@x, @y)       # 获取当前格元件ID
  64.     tile_id_1 = get_map_tile_id(x_f1, y_f1)   # 获取前一格元件ID
  65.     tile_id_2 = get_map_tile_id(x_f2, y_f2)   # 获取前两格元件ID
  66.     event_1 = $game_map.events_xy(x_f1, y_f1) # 获取前一格事件
  67.     event_2 = $game_map.events_xy(x_f2, y_f2) # 获取前两格事件
  68.    
  69.     # 事件判断
  70.     if !event_1.empty? # 若前一格有事件
  71.       return false if !event_2.empty? # 前两格也有事件则不能跳跃
  72.       return check_event_jumpable?(event_1) # 判断是否指定可以跳跃
  73.     end
  74.    
  75.     # 前第一格判断
  76.     if tile_id_1[1]>1
  77.       return false # 前一格的B~E层无法通行时也不能跳跃
  78.     elsif $game_map.counter?(x_f1, y_f1)
  79.       return false # 前一格为柜台时无法跳跃
  80.     end
  81.    
  82.     # 判断面前两格是否相同
  83.     return false if tile_id_1 == tile_id_2
  84.     return false if tile_id_1 == tile_id_0
  85.    
  86.     # 判断面前一格是否墙壁元件
  87.     wall_tile = (89..96).to_a + (105..112).to_a + (121..128).to_a # 获取墙壁元件ID
  88.     w_top_tile = (81..88).to_a + (97..104).to_a + (113..120).to_a # 获取墙顶元件ID
  89.     return false if wall_tile.include?(tile_id_1[0]) # 前一格为墙壁时无法跳跃
  90.     if w_top_tile.include?(tile_id_0[0]) # 若当前格为墙顶
  91.       # 前一格非墙顶,而前两格为墙顶时则可以跳跃
  92.       if !w_top_tile.include?(tile_id_1[0]) && w_top_tile.include?(tile_id_2[0])
  93.         return true
  94.       end
  95.     end
  96.     return false if map_passable?(x_f1, y_f1, @direction) # 前一格能通行时不跳跃
  97.     return map_passable?(x_f2, y_f2, @direction) # 判断前两格是否能通行
  98.   end
  99.   #--------------------------------------------------------------------------
  100.   # ● 判断某格的事件是否能跳跃
  101.   #--------------------------------------------------------------------------
  102.   def check_event_jumpable?(events)
  103.     events.each{|event|
  104.       return true if event.can_jump?
  105.     }
  106.     return false
  107.   end
  108.   #--------------------------------------------------------------------------
  109.   # ● 执行跳跃
  110.   #--------------------------------------------------------------------------
  111.   def do_jump(d=@direction)
  112.     # 判断跳跃方向
  113.     case d
  114.     when 2;  jump(0, 2)  # 向下跳
  115.     when 4;  jump(-2, 0) # 向左跳
  116.     when 6;  jump(2, 0)  # 向右跳
  117.     when 8;  jump(0, -2) # 向上跳
  118.     end
  119.   end
  120. end
  121. class Game_Event < Game_Character
  122.   #--------------------------------------------------------------------------
  123.   # ● 判断事件是否能跳跃
  124.   #--------------------------------------------------------------------------
  125.   def can_jump?
  126.     return false if @list[0].code != 108 # 第一个指令不是“注释”时返回 false
  127.     return @list[0].parameters[0] == "jumpable"
  128.   end
  129. end
  130. class Game_Player < Game_Character
  131.   #--------------------------------------------------------------------------
  132.   # ● 输入移动处理
  133.   #--------------------------------------------------------------------------
  134.   alias old_move_by_input move_by_input
  135.   def move_by_input
  136.     # 不能行动时忽略所有动作
  137.     return unless movable?
  138.     # 解释器执行时忽略所有动作
  139.     return if $game_map.interpreter.running?
  140.     d = Input.dir4
  141.     if can_jump?# 能够跳跃时
  142.       if $game_player.followers.visible # 队伍跟随时
  143.         $game_player.followers.gather   # 跟随队伍聚集
  144.         while !$game_player.followers.gather?
  145.           $game_player.followers.update # 跟随队伍刷新
  146.         end
  147.         # 跟随队员跳跃
  148.         $game_player.followers.each{ |follower|
  149.           follower.do_jump(d)
  150.         }
  151.       end
  152.       do_jump(d) # 执行跳跃
  153.     else
  154.       old_move_by_input # 呼叫原有方法
  155.     end
  156.   end
  157. end
复制代码

Lv2.观梦者

梦石
0
星屑
560
在线时间
1286 小时
注册时间
2011-6-14
帖子
4086
2
发表于 2013-8-7 12:58:45 | 只看该作者
做了个范例。此脚本似乎只能跳过事件。自己加dll
跳跃脚本范例.rar (302.47 KB, 下载次数: 90)

点评

@八月桑 经测试下载正常  发表于 2013-8-7 13:05
表示无法下载= =  发表于 2013-8-7 13:01
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
75 小时
注册时间
2013-8-1
帖子
26
3
 楼主| 发表于 2013-8-7 14:24:45 | 只看该作者
satgo1546 发表于 2013-8-7 12:58
做了个范例。此脚本似乎只能跳过事件。自己加dll

我刚试验了,是可以还可以跳某墙壁边缘的部分。。。
不过有BUG,当前面第二个是个随机移动的事件的时候可以跳过去重叠。。固定事件不存在这BUG
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
473
在线时间
487 小时
注册时间
2011-10-12
帖子
407
4
发表于 2013-8-7 18:12:19 | 只看该作者
本帖最后由 gaogs123456 于 2013-8-7 18:19 编辑

跳跃脚本对我来说觉得很好用,能让玩家不用按照地图上画出的‘路’固定式的行走。但也有一些BUG和好笑的问题:
它是被动式的跳跃,不是按键触发的
1、千万不能用“暂时消除事件”否则,碰到该事件必定弹错
2、当处在山上的时候,向着边缘猛冲过去,会直接跳下去(避免这种情况,一定要向前只走一步,再拐弯即使不能行走的情况下再向前走一步,很坑的效果)
如此图中标注事件的地方,如果玩家猛冲过去就会跳到沼泽地中。
3、做室内的时候,一格的墙是可以跳过去的,所以一定要在墙上加上空白的事件(与人物同层)
就比如这张图中,我加入事件的位置是可以被跳过去的;可以左侧有两个不可通行的花盆,也可以阻止跳跃的触发(如果换成事件是无法阻止的)
4、当可以跳跃的地方,存在于人物同层的事件是不可以跳跃的

以下是判定可以跳跃的情况(只有一格才会跳跃,2格以上是不能的):
第一种:
房顶和墙壁都可以跳跃
第二种:
只有房顶可以跳跃(室内地图与此相同)
第三种:
左右两个绘制山体的元件,山壁可以跳跃,山顶则需要冲向边缘就能跳下去
第四种:
这里我不截图了,河流、水都是可以跳跃的(前提是只绘制一格的情况下),另外栅栏也可以跳跃。

最后的说明:这不是一个主动跳跃的脚本,只有在对应地形的时候才会跳跃(也就是被动式的跳过障碍物),所以不需要设置什么的,。
莺莺飞蛾夜灯寻,小路迷途飞满庭;
追爱明光夜夜怜,不觉天明为谁晴。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
75 小时
注册时间
2013-8-1
帖子
26
5
 楼主| 发表于 2013-8-8 13:41:32 | 只看该作者
gaogs123456 发表于 2013-8-7 18:12
跳跃脚本对我来说觉得很好用,能让玩家不用按照地图上画出的‘路’固定式的行走。但也有一些BUG和好笑的问 ...

我改了一些东西,这样大多数BUG都没了 ,可以在房顶上跳。。。也保证了不可以在山上跳下来或者跳上去  还有事件的跳跃改成了判断落地点是否有可跳跃的事件。。。总之感觉真实一点,你试试?顺便问一下如何操作BCDE型的图块ID?nojunp=(113..117).to_b这样写为啥不行。。。新手,见笑了
  1. class Game_Map
  2.   #--------------------------------------------------------------------------
  3.   # ● 计算地图元件ID
  4.   #--------------------------------------------------------------------------
  5.   def get_tile_id(x, y)
  6.     a = data[x, y, 0]
  7.     return 0 unless a
  8.     a-=2000
  9.     map_tile_id_0 = (a >= 0) ? a/48 : (a+593)
  10.     map_tile_id_1 = (data[x, y, 1]-2000) / 48
  11.     map_tile_id_2 = (data[x, y, 2])
  12.          
  13.     map_tile_id_0 = 0 if map_tile_id_0 == -42 # A
  14.     map_tile_id_1 = 0 if map_tile_id_1 == -42 # I
  15.     map_tile_id_2 = 0 if map_tile_id_2 == -42 # B~E
  16.    
  17.     # 图块 ID 矫正
  18.     map_tile_id_0 = map_tile_id_1 if map_tile_id_1 > 0
  19.     unless @events.nil?
  20.       for event in @events.values
  21.         if event.pos?(x, y) and event.tile_id > 0
  22.           # 若是事件使用地图元件,使用该地图元件的ID
  23.           map_tile_id_2 = event.tile_id
  24.         end
  25.       end
  26.     end
  27.     # 返回 [底层ID, 上层ID]
  28.     return [map_tile_id_0, map_tile_id_2]
  29.   end
  30. end
  31. class Game_Character < Game_CharacterBase
  32.   #--------------------------------------------------------------------------
  33.   # ● 获取地图元件ID
  34.   #--------------------------------------------------------------------------
  35.   def get_map_tile_id(x, y)
  36.     return $game_map.get_tile_id(x, y)
  37.   end
  38.   #--------------------------------------------------------------------------
  39.   # ● 判断是否能跳跃
  40.   #--------------------------------------------------------------------------
  41.   def can_jump?
  42.     # 面向与方向键不同时不跳跃
  43.     return false if Input.dir4 != @direction
  44.     return false if debug_through? # 测试行走(按下Ctrl)时不跳跃
  45.     x_f1 = x_f2 = @x
  46.     y_f1 = y_f2 = @y
  47.    
  48.     # 计算前两格座标
  49.     case @direction
  50.     when 2
  51.       y_f2 += 2
  52.       y_f1 += 1
  53.     when 4
  54.       x_f2 -= 2
  55.       x_f1 -= 1
  56.     when 6
  57.       x_f2 += 2
  58.       x_f1 += 1
  59.     when 8
  60.       y_f2 -= 2
  61.       y_f1 -= 1
  62.     end
  63.     #落地判断
  64.     return false if !(map_passable?(x_f2, y_f2, 2)|map_passable?(x_f2, y_f2, 4)|map_passable?(x_f2, y_f2, 6)|map_passable?(x_f2, y_f2, 8))
  65.    
  66.     tile_id_0 = get_map_tile_id(@x, @y)       # 获取当前格元件ID
  67.     tile_id_1 = get_map_tile_id(x_f1, y_f1)   # 获取前一格元件ID
  68.     tile_id_2 = get_map_tile_id(x_f2, y_f2)   # 获取前两格元件ID
  69.     event_1 = $game_map.events_xy(x_f1, y_f1) # 获取前一格事件
  70.     event_2 = $game_map.events_xy(x_f2, y_f2) # 获取前两格事件
  71.    
  72.     return false if $game_map.counter?(x_f1, y_f1) # 前一格为柜台时无法跳跃
  73.     return false if !event_2.empty? # 前两格也有事件则不能跳跃
  74.     # 判断面前一格是否墙壁元件
  75.     # 获取墙壁元件ID
  76.     wall_tile = (57..64).to_a + (73..80).to_a + (89..96).to_a + (105..112).to_a + (121..128).to_a + (241..243).to_a + (246..251).to_a + (254..256).to_a
  77.     # 获取墙顶元件ID
  78.     w_top_tile = (49..56).to_a + (65..72).to_a + (81..88).to_a + (97..104).to_a + (113..120).to_a + (217..240).to_a + (244..245).to_a + (252..253).to_a
  79.    
  80.     return false if wall_tile.include?(tile_id_2[0]) # 前两格为墙壁时无法跳跃
  81.    
  82.     if w_top_tile.include?(tile_id_0[0])
  83.       if w_top_tile.include?(tile_id_2[0])
  84.         return true if !event_1.empty?&&check_event_jumpable?(event_1)
  85.         return true if !map_passable?(@x, @y, @direction)
  86.         return true if !map_passable?(x_f1, y_f1, @direction)
  87.         return true if !map_passable?(x_f1, y_f1, 8)&&@direction==2
  88.       end
  89.       return false
  90.     end
  91.   
  92.    
  93.     return false if w_top_tile.include?(tile_id_1[0])
  94.     return false if wall_tile.include?(tile_id_1[0])
  95.     return false if w_top_tile.include?(tile_id_2[0]) #前两格是墙顶不能跳
  96.    
  97.     if !event_1.empty? # 若前一格有事件
  98.       return false if w_top_tile.include?(tile_id_1[0]) #事件在墙顶不能跳
  99.       return false if !map_passable?(x_f1, y_f1, @direction)
  100.       return check_event_jumpable?(event_1) # 判断是否指定可以跳跃
  101.     end
  102.    
  103. #    njump = (113..117).to_b + (121..125).to_b + (129..132).to_b + (137..140).to_b
  104.     # 前第一格判断
  105.     #if tile_id_1[1]>1
  106.      # return false # 前一格的B~E层无法通行时也不能跳跃
  107.     # 判断面前两格是否相同
  108.     #return false if tile_id_1 == tile_id_2
  109.     #return false if tile_id_1 == tile_id_0
  110.     #if !map_passable?(x_f1, y_f1, )
  111.     return false if map_passable?(x_f1, y_f1, 4)
  112.       return true
  113.     #end
  114.    
  115.   end
  116.   #--------------------------------------------------------------------------
  117.   # ● 判断某格的事件是否能跳跃
  118.   #--------------------------------------------------------------------------
  119.   def check_event_jumpable?(events)
  120.     events.each{|event|
  121.       return true if event.can_jump?
  122.     }
  123.     return false
  124.   end
  125.   #--------------------------------------------------------------------------
  126.   # ● 执行跳跃
  127.   #--------------------------------------------------------------------------
  128.   def do_jump(d=@direction)
  129.     # 判断跳跃方向
  130.     Audio.se_play("Audio/SE/"+"Jump2",80,100)
  131.     case d
  132.     when 2;  jump(0, 2)  # 向下跳
  133.     when 4;  jump(-2, 0) # 向左跳
  134.     when 6;  jump(2, 0)  # 向右跳
  135.     when 8;  jump(0, -2) # 向上跳
  136.     end
  137.   end
  138. end
  139. class Game_Event < Game_Character
  140.   #--------------------------------------------------------------------------
  141.   # ● 判断事件是否能跳跃
  142.   #--------------------------------------------------------------------------
  143.   def can_jump?
  144.     return false if @list[0].code != 108 # 第一个指令不是“注释”时返回 false
  145.     return @list[0].parameters[0] == "jump"
  146.   end
  147. end
  148. class Game_Player < Game_Character
  149.   #--------------------------------------------------------------------------
  150.   # ● 输入移动处理
  151.   #--------------------------------------------------------------------------
  152.   alias old_move_by_input move_by_input
  153.   def move_by_input
  154.     # 不能行动时忽略所有动作
  155.     return unless movable?
  156.     # 解释器执行时忽略所有动作
  157.     return if $game_map.interpreter.running?
  158.     d = Input.dir4
  159.     if can_jump?# 能够跳跃时
  160.       if $game_player.followers.visible # 队伍跟随时
  161.         $game_player.followers.gather   # 跟随队伍聚集
  162.         while !$game_player.followers.gather?
  163.           $game_player.followers.update # 跟随队伍刷新
  164.         end
  165.         # 跟随队员跳跃
  166.         $game_player.followers.each{ |follower|
  167.           follower.do_jump(d)
  168.         }
  169.       end
  170.       do_jump(d) # 执行跳跃
  171.     else
  172.       old_move_by_input # 呼叫原有方法
  173.     end
  174.   end
  175. end
复制代码
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
473
在线时间
487 小时
注册时间
2011-10-12
帖子
407
6
发表于 2013-8-8 15:54:49 | 只看该作者
sens1992 发表于 2013-8-8 13:41
我改了一些东西,这样大多数BUG都没了 ,可以在房顶上跳。。。也保证了不可以在山上跳下来或者跳上去  还 ...

在77行有一段这样的说明:      return false # 前一格的B~E层无法通行时也不能跳跃
我试着把false改成true就能跳了。

但又有问题了,所有的单格不可通行的元件都能跳。
我是脚本盲,不知道怎么来设置判断B~E的墙壁元件。
莺莺飞蛾夜灯寻,小路迷途飞满庭;
追爱明光夜夜怜,不觉天明为谁晴。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-12-27 17:19

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表