学习爱(2d)游戏开发0 —用CSCI E-23a构建Pong

这是我 2018年春季由哈佛发布 的出色 CSCI E-23a 课程的 作业0代码的演练。 可以在 此处 找到 @ AbhirathMahipa l 创建的广泛的讲义

先决条件

  • 基本编程(变量,函数和对象)
  • Love2d安装
  • 如果您已经看过讲座,这将对您有所帮助。 我不太善于解释事物,这是我编写此书的原因之一。

我一直喜欢视频游戏,最近开始了CSCI E-23a游戏开发课程,该课程可免费在线获得。 我是一名Javascript开发人员,本课程使用Lua框架Love2d,因此专注于概念变得更加容易。

完成演讲后,我尝试使用Colton Ogden的(讲师)结构重新创建Pong,以使这些概念牢牢记住。 大多数代码与讲座中创建的代码相似,但是我对某些事情的组织方式有所不同。 您可以在这里找到回购。 结构很简单:

/声音

class.lua —用于在Lua中创建类的库
font.ttf
主lua
Paddle.lua
push.lua —用于简化渲染的库

Main.lua —入口点

在启动游戏时,Love2d会查找名为main.lua的文件。 在这里,您可以将所有游戏逻辑拼接在一起,并覆盖Love2d游戏循环方法。 我们需要做的第一件事是导入类并推送库并声明一些变量。 我们还需要引入桨和球类。

红色框中出现的所有内容都定义为冲突。 如您所见,这是准确性和性能之间的权衡。 这就是为什么在正确的图像中有更多的框。 使用该模型,您将需要运行4个检查,而不是使用左侧模型的检查。

太好了,所有内容都被盒子包围。 那“轴对齐”部分呢? 这要简单得多。 Love2d和其他图形引擎使用坐标系,在这种情况下使用x和y轴。 如果两个框都对准同一根轴,则排除冲突要容易得多。

以及我们该怎么做? 我很高兴你问。 有四个问题要问,如果您对任何一个问题回答“是”,则不会发生冲突:

  1. 矩形1的左边缘在矩形2的右边缘右侧吗?
  2. 矩形2的左边缘在矩形1的右边缘右侧吗?
  3. 矩形1的顶部边缘是否在矩形2 的底部边缘下方
  4. 矩形2的顶部边缘是否在矩形1 的底部边缘下方

否则,发生碰撞。 现在您可以了解为什么Pong是一款如此出色的首款游戏。 一切都是一个盒子,最多有一个边界盒子。 继续看一下collides函数,您将看到如何将这些问题转换为Lua。

如果您感到困惑,请在此处查看MDN的解释。 有一个甜美的游乐场,您可以在其中实际移动矩形并查看发生的事情。 我从中得到飞机图的解释也很好,但请记住,即使概念相同,起点也位于左下角。 如果您想深入研究,请在此处查看Gamasutra的说明。 现在,让我们谈谈桨。

Paddle.lua
这是要点:

与没有碰撞检测的Ball非常相似,对吧? 阅读代码后,除了Paddle:move()之外,我认为没有其他需要提及的内容。

Paddle:move()必须首先查看的是是否按下了键。 请记住,在构造拨片时会传递移动键,因此我们检查这些键并根据所按下的键上下移动。 为此,我们使用love.keyboard.isDown(),如果按下某个键,它将返回布尔值true。

作为作业0的一部分,一个简单的AI应该跟随球并尝试将其击回。 我通过检查球拍是否是计算机,然后检查球的当前位置来完成此操作。 如果球在桨叶的y上方或下方一定数量,则桨叶会朝其移动。

这太傻了,不能很好地工作。 我见过的大多数实现都模拟一个不可见的球,以预测该球的前进方向,并使计算机操纵杆移至该位置。 您可以根据当前分数或难度级别来或多或少地提高准确性。 我计划在有更多时间后实施此操作。

最后,我们希望将桨叶限制在屏幕的底部和顶部边缘,因此这是最终检查,也是为什么我要在main.lua中将VIRTUAL_HEIGHT作为screenHeight传递给屏幕。

结论
自从将《毁灭战士1》和《雷神之锤1》带回家以来,我已经尝试过几次尝试开发游戏,而我从没有坚持过。 到目前为止,我很喜欢这门课程,并试图寻找时间来完成它。 我已经完成了Flappy Bird会话,我想我将把它更多地作为教程系列来发表,而不是一篇冗长的文章在我的代码中浏览。

如果您有任何疑问或发现任何令人困惑或不正确的地方,请告诉我。 我将更新本文,并尝试在以后的文章中进行改进。