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

Project1

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

[已经解决] 复刻FC封神榜,如何实现类似跳跃的战斗移位?难题。。。

[复制链接]

Lv5.捕梦者 (版主)

梦石
1
星屑
23963
在线时间
3338 小时
注册时间
2011-7-8
帖子
3925

开拓者

1
发表于 2019-6-16 20:27:20 | 显示全部楼层
本帖最后由 guoxiaomi 于 2019-6-16 20:33 编辑

现成的公式在XP的跳跃处理中,XP中有一条事件指令可以让地图上的角色从一个点跳跃到另一个点,在跳跃过程中角色走的路线是抛物线。接下来分析XP是如何实现抛物线的路线的:

我们顺藤摸瓜,首先找到 Game_Character 3 的 jump 方法,在此方法里,执行了以下任务:
1. 调整角色的朝向
2. 将@x和@y设置为目标位置的值
3. 设置跳跃计时@jump_count = @jump_peak * 2

随后找到Game_Character 2 中的 update_jump 方法:
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 更新画面 (跳跃)
  3.   #--------------------------------------------------------------------------
  4.   def update_jump
  5.     # 跳跃计数减 1
  6.     @jump_count -= 1
  7.     # 计算新坐标
  8.     @real_x = (@real_x * @jump_count + @x * 128) / (@jump_count + 1)
  9.     @real_y = (@real_y * @jump_count + @y * 128) / (@jump_count + 1)
  10.   end

从这里可以看出,每次更新的时候,@jump_count 会减少 1,最终一直减少到 0。同时,角色的@real_x和@real_y会用此递推公式进行更新。
为了庆祝高考结束,现场解一下递推公式,暂不考虑整除的影响:
数列Sn表示角色的@real_x在第 n 帧的值,则有:@jump_count = N - n,其中 N 是 @jump_count 的初始值。代入递推公式:
S[n+1] = (S[n] * (N - n) + X) / (N - n + 1),这里用 X 代替了 @x * 128,在整个跳跃过程中是不变的。同时我们还知道 S[0] = 初始位置的 @real_x。
整理递推公式得:
S[n+1] / (N - n) - S[n] / (N - n + 1) = X / (N - n) - X / (N - n + 1)
取n=0,1,2...a - 1,代入上面的式子,左右两边分别求和消去相同的项:
S[a] / (N - a  + 1) - S[0] / N = X / (N - a + 1) - X / N
得到:
S[a] = S[0] - a * (S[0] - X) / N,是一个等差数列。在a = 0的时候,值为S[0],在a = N的时候,值为X。

上面的推导说明了,在跳跃过程中,角色的真实位置@real_x和@real_y是匀速变换到目标位置的。这个和看上去的抛物线路径并不一样,所以找到最后的地方:Game_Character 1 的 screen_y 方法:
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 获取画面 Y 坐标
  3.   #--------------------------------------------------------------------------
  4.   def screen_y
  5.     # 通过实际坐标和地图的显示位置来求得画面坐标
  6.     y = (@real_y - $game_map.display_y + 3) / 4 + 32
  7.     # 取跳跃计数小的 Y 坐标
  8.     if @jump_count >= @jump_peak
  9.       n = @jump_count - @jump_peak
  10.     else
  11.       n = @jump_peak - @jump_count
  12.     end
  13.     return y - (@jump_peak * @jump_peak - n * n) / 2
  14.   end

在跳跃过程中,y值有一个修正项:y = y0 - 1/2 * (N*N - n*n),在这里用 N 表示 @jump_peak。
注意在跳跃过程中,@jump_count 的值从 @jump_peak * 2 逐步减少到 0,对应 n 的变化范围正好是从 -N 到 N,所以 screen_y 增量从 0 逐渐增大最后回落到 0。
实际显示的角色位置,是一个在 y 方向上与时间呈二次方关系的运动,叠加上角色本身的匀速运动,这是一条抛物线。

最终结论是,直接用XP自带的跳跃功能就行了。

点评

最近没空呀  发表于 2019-6-17 23:05
做一回伸手党了,抱歉  发表于 2019-6-17 20:37
我把简单的战斗范例传到主楼了,麻烦帮我整合一下吧,确实不太会把Game_Character整合到战斗场景里面。  发表于 2019-6-17 20:32
系统默认的是需要自己输入x,y数值,现在要自动计算,我先试试,不行发工程帮我弄弄哈。  发表于 2019-6-17 13:30
我在战斗里面调用,需要修改代码吧  发表于 2019-6-17 13:07
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-6-12 15:23

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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