内容简述:

平台游戏中,如何在动作操作方面达到《Celeste》,《死亡细胞》等作品那样的效果(手感),单纯使用物理引擎是比较难做到的,因为我们需要一些反常识的运动效果,而这些效果可能是多种运动组成的,为了更精细的控制物理运动,需要对每一种动作的物理运动做特定的建模与调参。

本文会针对平台类的游戏,针对走路,和跳跃这两个行为,从实现原理上做一些解释,为了更清晰的表述,文中会使用伪代码来解释。读完文章,你会了解走,跳的一种实现思路。话不多说,让我们开始吧。

简化:

平台类游戏,最常见的物体会有,地板,墙,角色这三种,首先我们需要简化其几何模型,因为这会大大提高后边物理计算的效率,也更直观,更容易理解。

游戏循环:

游戏循环,几乎所有的游戏都有一个叫游戏循环的部分,这部分代码会被一遍一遍的执行,直到游戏结束。功能上通常包括收集用户的输入,更新所有物体的状态,渲染成图等。逻辑如图

每一个Update函数负责改变游戏内所有物体的信息,后边的Render会根据数据生成一张图片,也就是常说的一帧。这篇文章所讨论的问题就是:在Update函数中,如何计算出每一帧玩家的位置。

走:

从上图中可以看出来,物体当前帧的位置可以根据上一帧的位置来计算出来。

第3行用来计算偏移距离,即:偏移距离=运动速度x时差。

第4行用来计算当前帧物体的位置,即:当前帧物体的位置=上一帧物体的位置+偏移距离。

利用上边的实现,我们已经可以使角色运动起来了。

加入墙体

当加入墙体后,需要对墙体做特殊处理,以保证角色不会直接穿过墙体。

用线段A去和外围的世界做碰撞检测,如果有交点,那么则代表碰撞到物体,需要修正偏移距离。线段A的一个端点可以选择上一帧物体的中心,另一个端点可以根据当前速度,时差来计算出。那么,代码就变成了这样:

新加入的代码:使用线段与场景内的物体进行求交检测,如果有交点,更新偏移距离。利用上述代码,角色将会被墙壁挡住。

处理坑:

如果用上述代码来让角色走过一个坑洞时,角色会并不会掉落下去,而是直接走过,所以需要特殊处理有坑洞的情况。卖手机号码平台思路是,首先检测坑洞,如果没有检测到,则保持水平行走,如果检测到坑洞,则切换物体为掉落状态。

检测坑洞具体的方法是向下做一个线段进行碰撞检测,如果没有碰撞到物体,代表下边就是一个坑了。贴出加入坑洞处理的代码。

第3行添加了状态检测,角色的状态除了走路之外,还会有跳跃,冲刺……等其它状态,所以在此我们添加一个变量state用来追踪当前玩家的状态,以区分和管理角色的行为。

第10-14行:利用垂直线段向下进行碰撞检测,如果有交点,那么修改垂直偏移距离。

第16行:如果检测到坑洞,则改变角色当前状态为“下落”

下落状态:

下落是从跳跃的最高点处开始向下,直到落地的这个间隔。或者是在走路时遇到坑洞后,掉落的这个过程。下落过程中,处理情况和行走是非常的相似的。

第16行,在行走的过程中,如果向下方的碰撞测试没有检测的地面,这时需要改变为下落状态。

第20-23行,在下落的过程中,检测横向的墙面,如果有碰撞,需要修正偏移的距离。

第25-30行,在下落的过程中,如果向下方的碰撞测试,检测到了地面,需要修正垂直偏移距离。

起跳:

起跳是从离开地面到最高点这段过程,当收到玩家指定时,进入跳跃状态,代码如下:

第39-41行,在起跳的过程中,如果达到了跳跃的最高高度,那么应该切换到下落状态。

第43-49行,和前边的代码行为是类似的。

总结

通过上述的描述,我们已经可以实现出平台游戏中走与跳的行为了,并且可以方便的扩展出更多的运动效果,比如:

  • 走路的滑动
  • 落地弹一下
  • just-in-time jump
  • 碰到墙上反弹
  • 走路时加速
  • 加速跳
  • ……

为了用尽量短小的篇幅说明问题,文中删减了一些和物理实现无关的问题,比如动画管理切换,用户输入采集等……文中的截图,均是采用上述方法实现的。

平台游戏中走与跳的实现相关推荐

  1. 2D平台游戏王牌英雄的AI寻路解决方案

    为什么80%的码农都做不了架构师?>>>    当我们在开始开发王牌英雄的机器人时 我们开始了最复杂的部分:怎样去做寻路? 当人们谈到寻路的时候 通常会想到 A*寻路. 这众所周知的 ...

  2. 如何制作一个平台游戏

    ** 新建(所需工具:Construct 2) ** 大小的布局 首先,我们需要布局 (级) 要比默认值大一点.左键单击布局中的空间和属性栏将显示布局属性.更改为 4000 × 2048 的水平大小. ...

  3. linux ba 模拟,在你的 Python 游戏中模拟引力 | Linux 中国

    学习如何使用 Python 的 Pygame 模块编程电脑游戏,并开始操作引力. -- Seth Kenlon 真实的世界充满了运动和生活.物理学使得真实的生活如此忙碌和动态.物理学是物质在空间中运动 ...

  4. java2d游戏代码_Java 2d游戏中的“JUMP”

    我有这个代码,我想在java 2d游戏中启动一个跳转,事情是我的对象没有去任何地方,它只是停留在那里...我想我的对象跳,当我按下键和程序显示我的图像上下移动..我试图通过简单的repaint()方法 ...

  5. python物理模拟_如何在Python 游戏中模拟引力

    学习如何使用 Python 的 Pygame 模块编程电脑游戏,并开始操作引力. 真实的世界充满了运动和生活.物理学使得真实的生活如此忙碌和动态.物理学是物质在空间中运动的方式.既然一个电脑游戏世界没 ...

  6. 遗传算法在走迷宫游戏中的应用

    我的数据挖掘算法库:https://github.com/linyiqun/DataMiningAlgorithm  我的算法库:https://github.com/linyiqun/lyq-alg ...

  7. Web3 游戏中的创造者经济:从游戏到平台,用户生成内容的挑战

    撰写:Joel John.Siddharth 编译:深潮 TechFlow 图片来源:由Maze AI工具生成 今天我们要探讨的是游戏.出于几个原因,游戏是为数不多的真正有机会在数字资产生态系统中扩展 ...

  8. Web3 游戏中的创造者经济:从游戏到平台 用户生成内容的挑战

    今天我们要探讨的是游戏.出于几个原因,游戏是为数不多的真正有机会在数字资产生态系统中扩展至十亿用户面向消费者的用例之一. 首先,游戏玩家已经习惯了数字资产:他们经常为游戏中的交易(即道具)付费. 其次 ...

  9. 游戏陪玩平台系统中iOS 采集音视频及写入文件的实现

    在游戏陪玩平台系统中音视频采集包括两部分:视频采集和音频采集.在iOS中可以同步采集视频与音频,通过系统框架AVFoundation,可以帮助游戏陪玩平台系统采集音频与视频,对于视频还可以进行切换前后 ...

最新文章

  1. Python 中的序列类型支持哪些公共操作
  2. 计算机的发展知识点,计算机一级MsOffice考试知识点:计算机的发展
  3. 7.Hadoop的学习(Hadoop的配置(伪分布式的搭建)-3(启动守护进程))
  4. Android Java包
  5. idea重要插件代码颜色_颜色在您的网站上的重要性和品牌形象
  6. [css] flex布局的缺点有哪些?(除兼容性外)
  7. vue css自定义标签,Vue如何使用CSS自定义变量
  8. 程序中变量分布的区域总结 堆 栈 字符常量区 全局数据区 静态存储区
  9. VB 字符串MD5加密函数
  10. Spark--安装和配置遇到的所有问题
  11. spring :cannot be resolved to absolute file path because it does not reside in the file system: jar
  12. VDN For PB Web实现消息推送
  13. QT Libvlc播放视频时捕获鼠标和键盘事件
  14. 三种主流芯片架构简单比较
  15. 更换固态硬盘并使用微pe安装windows7系统及万能网卡
  16. 嵌入式c语言如何在堆区开辟空间
  17. 32位/64位操作系统的最大支持内存的空间
  18. 光猫 虚拟服务器设置,光猫虚拟服务器设置
  19. 论国产操作系统的研发及其软件生态系统建设的重要性
  20. 国科大--多媒体分析与理解--2020考试试题

热门文章

  1. python如何开启多进程_python如何写多进程
  2. linux 全局搜索文件_Linux笔记之文件搜索1
  3. 荣耀v30pro搭载鸿蒙吗,荣耀麒麟30pro+,可以搭载鸿蒙的顶级荣耀,你买了吗?...
  4. oracle M4,oracle高级部分 - osc_9gm4ypss的个人空间 - OSCHINA - 中文开源技术交流社区...
  5. springmvc 全局编码_SpringMVC-设置UTF-8编码
  6. 【计算机基础】 操作系统总结(未完)
  7. CodeForces Goodbye 2017
  8. 笔记:用EXCEL计算收益(复利)
  9. HTML5新增的一些特性
  10. 自定义PopupWindow弹出后背景灰色状态