2013年5月3日
客座文章:Corona SDK + GameDevHelper = 强大的组合
Andy Hadlington 是一位居住在英国的自由职业交互开发人员。Andy 一旦深入移动开发,就使用 Corona SDK 创建了他的第一个 2D 自上而下的赛车游戏 – Turbo Sprint。在他的客座文章中,Andy 剖析了有关 Turbo Sprint 的几个常见问题。
我是 Andy Hadlington,一位居住在英国布里斯托尔的自由职业交互开发人员。我的主要“谋生”工作是使用 Flash 和 ActionScript 为在线游戏/赌场行业开发内容,但在我(非常罕见的!)空闲时间,我喜欢开发小型移动应用。
起初,我以为我会利用我现有的经验/工具(即 Flash/AS3)来开发一个应用,但我很快对 Flash 中 iOS 打包器的性能感到失望,所以我开始寻找其他替代方案,并发现了Corona SDK。
经过一些实验,我意识到它是一个强大且相对容易开发的应用,可以与移动设备的本地应用相媲美,所以我决定开始开发我喜欢自己玩的游戏类型,所以我开始开发一个名为Turbo Sprint的 2D 自上而下的赛车游戏。
这是对过去几个月我被问到的关于游戏主要组成部分的快速概述。这绝不是详尽的,但我确实在项目中学到了很多,所以想与社区分享一些信息和技术片段。如果您有任何其他问题,请随时提问!
赛道和关卡设计
显然,赛车游戏需要赛道,我的方法是设计赛道图块,并使用出色的Level Helper 和 Sprite Helper工具将它们放置在关卡中。这使我可以创建一个图块集,并将它们排列在网格中以创建基本的赛道布局。这确实将赛道方向限制为简单的 N、E、S 和 W 外观(即,没有对角线),但我认为这还可以,并且符合我想创建的游戏风格。这确实为我节省了数小时的开发工作,因为 Level Helper 提供了一个非常简单的 API,允许您仅用一行代码加载一个关卡。如果我不满意,我会切换回 Level Helper 来调整赛道,保存它,然后再试一次。太棒了!
赛道对象
我们需要汽车,对吧?当然需要。同样,我使用 Sprite Helper 创建了一个精灵表,其中包含汽车精灵(以及赛车游戏中的其他赛道边家具)。通过 Sprite Helper 为每个对象添加一个物理外壳,然后通过关卡编辑器将它们放置在赛道上,这很简单。我还可以向关卡添加其他对象(真正的堆栈、树等),保存它,一切就绪。
游戏逻辑
虽然在屏幕上获取赛道和物理对象相对简单,但有必要为汽车、赛道逻辑等编写自定义代码。为此,需要在加载关卡后从关卡中获取对象,然后将必要的代码注入到这些对象中。
当然,可以使用名称引用关卡中的对象,但一个很好的功能是可以通过类型标记它们。例如,景观图块被标记为“LANDSCAPE”,汽车对象为“CARS”,树木为“TREES”……我想您明白了。这使得从关卡中获取这些对象并跳过它们注入必要的代码变得简单。例如,如果景观图块不在屏幕上,则绘制每个景观图块是浪费的,因此,一个简单的“我在屏幕上吗”的检查被注入到每个标记为“LANDSCAPE”的对象中,该对象每帧都会被调用,以根据当前玩家汽车的位置使图块可见/不可见。起初,我认为这可能会导致性能问题,因为有些赛道有多达 40 个图块,尽管我扔掉了我知道不可能在屏幕上的图块,但我每帧都在做这件事。我错了;Corona SDK 把它吞噬了,并要求更多。我有足够的能量来处理其他事情。
类似地,为每辆汽车创建了一个“进入帧”方法。所有汽车都共享相同的代码(包括玩家和 CPU),这处理了汽车在加速、转向下的行为,并处理了打滑和一般汽车操控背后的数学运算(这并不像听起来那么困难!)。我将努力在稍后发布对此更深入的解释——也就是说,如果有人感兴趣的话!
碰撞
使用内置的物理处理碰撞,并通过事件监听器(通过 Level Helper API)添加到某些类型的对象之间的碰撞。例如,汽车与汽车会播放碰撞声,汽车与能量道具会处理能量道具,等等。一切都很简单。
控制和 AI
玩家汽车由屏幕输入(左/右/加速)控制,这些输入传递给玩家汽车的“进入帧”函数,但显然,CPU 汽车需要能够以某种方式在赛道上导航。这就是 Level Helper 发挥作用的地方,因为它允许在关卡上创建贝塞尔曲线,因此在每条赛道上绘制“赛车线”,然后通过代码,从关卡中获取线并查询线点,这是一个简单的过程。每隔几秒钟,都会告诉 CPU 汽车向线点移动,当它足够接近时,移动到下一个线点,等等。这被证明非常有效。
此外,每辆汽车都有不同的最大速度和加速度参数,以确保它们在比赛期间始终在赛道上充分分散。
谁领先?
通过使用此贝塞尔线数据,还可以创建一个由 1 到 20 编号的不可见多边形列表,每个多边形将赛道封装到“分段”中(每条赛道大约 20 个分段是最佳的)。
在每次比赛之前,此数据会经过预处理以创建每个分段多边形。然后用它在赛道上的距离(以像素为单位)标记这些多边形,例如
然后,大约每秒 5 次(没有必要每帧都执行此检查),每辆汽车都会通过检查此列表中的每个多边形来检查它在哪个分段。在计算出此分段号之后,我们然后查询其预先计算的距离,以获得汽车在赛道上的大致位置值。
但是,此值有点粗略,因为位置信息需要相当精确,尤其是在汽车不断相互超车时,因此我们然后计算汽车在当前分段上的行驶距离,然后将其添加到原始分段距离中。通过存储每辆汽车的总行驶距离值,并将这些值除以赛道的长度,我们可以简单地比较它们来决定每辆汽车的位置。例如,汽车距离为 0.5 表示它在第一圈行驶了一半。汽车距离为 1.5 表示它在第二圈行驶了一半,而汽车距离为 3.9 表示它在第四圈行驶,接近第五圈。
使用 500 的赛道长度的汽车位置示例
汽车编号 | 行驶距离 | 位置 | 圈数值 |
---|---|---|---|
汽车 1 | 1578.3 | #2 | 3.1566 – 第 4 圈 |
汽车 2 | 1976.2 | #1 | 3.1566 – 第 4 圈 |
汽车 3 | 1456.7 | #3 | 2.9134 – 第 3 圈 |
汽车 4 | 1256.9 | #4 | 2.5138 – 第 3 圈 |
汽车 5 | 1000 | #5 | 2.0 – 刚刚开始第 3 圈 |
啊,你作弊了。
此方法还可用于控制玩家的任何非标准驾驶(走错方向、检测捷径等)。在每次分段检查期间,如果分段号增加,则表示汽车正在沿赛道正确方向行驶。但是,如果汽车已移动到较低值的分段,则汽车显然走错了方向,因此会向玩家闪烁一条消息。但是,如果汽车已从最后一个分段移动到第一个分段,则表示汽车已完成一圈。
为了检测玩家是否试图抄近路,需要跟踪玩家在每圈中已经驶过的路段数。当玩家完成一圈时,如果发现他仍然需要通过某些路段(例如,segments_left > 0),那么我们可以安全地认为他抄了近路,并显示相应的消息。这可以通过类似的方式来实现,即检查汽车在当前圈中行驶的总距离与圈长进行比较,但我选择了路段检查(因为它似乎更容易)。
社交
Facebook 和 Game Center 的集成比我想象的要简单得多(如此简单,以至于我把它留到了游戏开发的后期,因为我真的不想面对它!)。然而,我感到非常惊喜,在论坛上提出了一些问题后,很快就有人指出了正确的方向。的确,这个平台的一大优点是 Corona SDK 的社区(感谢各位!)。
总结
创建赛车游戏及其相关逻辑可能有很多其他方法。我在这里描述的方法纯粹是个人偏好,但我想无论如何都要分享一下。我想表达的重点是使用 Corona SDK 和 Lua 可以达到的开发速度。我在开发的最初几个小时内就成功地在屏幕上显示了玩家控制的汽车和 CPU 控制的汽车。另外,请记住,虽然我是一位经验丰富的程序员,但我对 Corona SDK 和 Lua 完全陌生,所以我相信我未来的 Corona SDK 项目开发速度会更快。
从 Flash/AS3 背景出发,我发现 Corona SDK 和 Lua 非常简单但功能非常强大。由于 SDK 出色的性能和动态、灵活的特性,我上面描述的技术相对容易实现。我个人也非常喜欢编辑和测试代码的速度。所有更改都可以通过模拟器几乎立即查看,我发现这非常有用,尤其是在项目后期微调玩家汽车物理效果时。内置的物理引擎也很棒。
总而言之。Corona SDK 如今已成为我游戏制作工具库中的主要武器。名副其实的大规模杀伤性武器!
–安迪·哈德林顿
戴夫·巴克斯特
发布于 03 月 03 日 16:07希望安迪能看到这条评论,有一些问题。
第一次运行该应用程序时,它重启了我的 iPad 1,我选择了 1 级,它在加载屏幕上停留了很久。
第二次它没有重启,所以不确定为什么,但我以前从应用商店使用 Crona 应用程序时也遇到过这种情况。
你的全屏 iAds 是个大问题。我在第一场比赛中垫底,点击重试,结果出现了一个全屏 iAd,关闭 X 按钮大约 5 秒才出现。一旦我关闭广告,比赛就已经开始了!
戴夫
伊娜·特雷格
发布于 03 月 03 日 17:20你好,戴夫 - 安迪今天在旅行,不在办公室。他要求我问你是否正在使用 v 1.2,因为他认为 RevMob 导致了一些这些问题。
安迪将在返回后调查并回复更多信息。
感谢您的阅读!
伊娜
戴夫·巴克斯特
发布于 03 月 03 日 23:08你好,
是的,我正在使用 1.2
戴夫
内纳德·卡蒂奇
发布于 05 月 05 日 02:55好游戏,感谢这篇精彩的帖子!是的,非常感谢关于转向和打滑物理的深入帖子 🙂
安迪
发布于 05 月 08 日 12:17大家好!我是开发者。我将在 5 月 13 日休假回来后立即调查这些问题。对于给你们带来的糟糕体验,我深表歉意。
请放心,我一回到办公室就会进行调查 🙂
克里斯·马赫
发布于 05 月 10 日 09:00你好,安迪,游戏做得很好。它具有让人难以放下的“再来一局”的成瘾因素。
我注意到一件事……我还没有能够确定它何时或为什么发生,但偶尔控制似乎会停止工作。我的拇指会在油门上保持 3 圈(一次都没有移动),然后突然我的汽车会减速。然后它最终会再次加速。其他任何人都发生过类似的事情吗?(我使用的是 iphone 5)。
另外,似乎带倾斜转向的游戏会很有趣。你在开发过程中尝试过吗?
sq2
发布于 05 月 11 日 17:42谁负责音乐?听起来很有演示场景的味道。
内森
发布于 05 月 13 日 18:01安迪,精彩的帖子 - 写得很好。我对你文章中提到的汽车操控、打滑等方面更感兴趣。
安迪·哈德林顿
发布于 05 月 20 日 01:55大家好!
感谢大家的耐心,我从拉斯维加斯的假期回来后,堆积如山的工作需要处理,所以直到过去的两天左右才有时间重新回到《涡轮冲刺》上。
我已经修复了全屏广告的问题,现在我正在尝试重现 iPad 1 的问题。之后,我将查看克里斯提到的控制问题,并且在我修复该问题后,我将向 Apple 上传新版本进行审查(您可能已经注意到,在我离开期间推送了一个新版本,这是我在休假之前上传的,并且在我意识到人们在这个帖子中遇到的问题之前)。
@sq2 - 音乐是从 MusicLoops.com 购买的
@nathan - 我将在为应用商店确定新版本后,立即整理一篇关于驾驶物理的帖子!
内森
发布于 06 月 06 日 19:20你好,安迪,
我现在正在制作我的新游戏中的一个小型的自上而下的驾驶部分,但我正在与物理学作斗争 - 我已经通过施加线性力使加速/减速工作,但我正在与转弯以及决定何时打滑和何时不打滑作斗争……你只是使用了角力吗?
谢谢,
内森。