几乎人人都玩过太空入侵者,这款游戏还可能是有些人玩的第一个电脑游戏。
这个“太空入侵者”游戏模式需要相当多的不同编码技术才能完成。一直以来,当人们需要学习一种新的编码语言,常常会写一个太空入侵者游戏。这样将通过对相应语言的语法和功能的练习使学习者得到良好的锻炼。
本教程将分为两部分:
首先,将建立一个基本的入侵者游戏,包括外星人,激光,防御基地和分数。本教程首次出现在The MagPi#74中。点击此处可下载杂志的免费数字副本。开始使用Raspberry Pi编写Space Invaders
第二部分(在MagPi#75中)将添加游戏所有的其它部分,使其成为20世纪70年代出现在游乐场和体育馆的游戏。
如果您已经阅读了本系列的前几集,您就已经了解如何设置一个基本的Pygame Zero程序,这样就可以直接开始编程了。需要一些图形用于游戏的各种元素 - 可以自己设计或从GitHub获得。 Pygame Zero的默认屏幕尺寸为800宽×600高,这对于这个游戏来说是一个很好的尺寸,所以不需要定义WIDTH或HEIGHT。
从玩家开始:?先开始设计玩家船。如果要调用graphic player.png,那么可以通过编写player = Actor(“player”,(400,550))来创建靠近代码顶部的玩家Actor。
要实现比纯黑色窗口更有趣的东西,可以在draw()函数中添加背景。首先绘制它,所有其他内容都将在它之上。通过编写screen.blit('background',(0,0))来使用blit()函数绘制它 - 假设已经调用了背景图像background.png。然后,要绘制玩家,然后添加player.draw()。
player类游戏需要player类来响应按键,所以要检查Pygame Zero键盘对象以查看当前是否按下某些键。创建一个新函数来处理这些输入。调用函数checkKeys(),需要从update()函数调用它。
在checkKeys()函数中,写如果keyboard.left:然后如果player.x> 40:player.x - = 5.需要在checkKeys()函数中将玩家角色对象声明为全局。然后编写一段类似的代码来处理右箭头键; figure1.py显示了这一切是如何组合在一起的。
外星人的概念创建一批外星人,且可以使用任何想要的格式。设置三行外星人,每行六个。有一个名为alien.png的图像,可以将存储在列表中的每个外星人创建一个Actor,以便可以轻松地遍历列表以对它们执行操作。
当创建外星人Actors时,将使用一些数学来设置初始x和y坐标。定义一个设置外星人的函数 - initAliens()是个好主意 – 为了设置其他元素,定义一个函数init(),可以从中调用所有的设置函数。
设计算法为了定位外星人并将它们创建为Actors,可以声明一个列表 - aliens = [] - 然后使用for range(18)创建一个循环:在这个循环中,我们需要创建每个Actor,然后确定它们的x和y坐标将从何处开始。我们可以通过编写:aliens.append(Actor(“alien1”,(210 (a%6)* 80,100 (int(a / 6)* 64))))在循环中完成此操作。这可能看起来有点令人生畏,但我们可以通过说'x是210加上剩下的除以6乘以80'来分解它。
这将提供从210开始的x坐标,每个坐标之间的间距为80。 y计算类似,使用正常除法,使其成为整数,并乘以64。
相信最奇怪的事情撇开这段标题的疑惑,我们将引入外星人状态。正如在前几期中看到的,可以向Actors添加额外的数据,现在将在创建它之后向外星人添加状态变量。将在稍后解释将如何使用它。现在是时候把小家伙放在屏幕上准备采取行动了。
写一个名为drawAlien()的简单函数,然后循环遍历外星人列表,通过写入来绘制它们:for a range(len(aliens)):aliens [a] .draw()。在draw()函数中调用drawAlien()函数。
外星人来了!创建一个函数,在update()函数中调用它来跟踪外星人应该发生的事情。称之为updateAliens()。因为不想在每次更新周期运行时移动外星人,所以将保留一个名为moveCounter的计数器,并在每次更新时递增它();然后,如果它达到某个值(moveDelay),将把计数器归零。
如果计数器为零,我们调用updateAliens()。 updateAliens()函数将计算它们在x和y方向上移动所需的量,以使它们在屏幕上前后移动并在到达边缘时向下移动。
更新外星人为了解决外星人应该移动的地方,将进行一个从0到40的计数器循环。从0到9将移动外星人,在10将他们向下移动,然后从11到29向右移动他们。 30日向下移动,然后从31向左移动。看看figure2.py,了解如何在updateAliens()函数中执行此操作以及该函数如何适合的update()函数。
注意如何使用Pygame Zero函数animate()来使它们顺利移动。可以在图像之间添加切换以使他们的腿移动。
所有的基地都属于我们现在要建立防御基地。要从角色来构造基地,有一些问题需要克服,如还没有在显示时剪裁角色的方法。剪切是一个术语,用于描述只显示图像的一部分。这时需要的一种方法,如果打算让基地缩小,因为它们被外星激光击中。我们要做的是向角色添加一个函数,就像之前已经为它们添加了额外的变量一样。
建立基地我们将制作三个基地,每个基地由三个角色组成。如果想要显示整个图像(base1.png),要创建一个基地角色列表,并使用一些代码(如bases [0] .draw())显示每个角色。想要在基地中添加一个变量来显示想要的高度,还需要编写一个新函数来根据高度变量绘制基数。
看看figure3.py,看看如何编写新函数并将其附加到每个角色。这意味着现在可以使用:bases [b] .drawClipped()从每个基地角色调用此函数,如drawBases()函数所示。
现在可以开始射击吗?为了使这成为一个射击游戏,要添加一些激光。我们需要从玩家船上以及外星人发射激光,并将把它们全部保存在同一个列表中。当通过制作一个Actor并将其添加到列表lasers []来创建一个新的激光器时,可以给Actor一个类型。
在这种情况下,将制作0型外星激光器和1型玩家激光器。还需要添加状态变量。激光器的创建和更新类似于所看到的其他元素; figure4.py(背面)显示了可以使用的功能。
让激光器工作可以在figure4.py中看到,可以通过在checkKeys()函数中添加对SPACE键的检查来从玩家创建激光。使用名为laser2.png的蓝色激光图像。一旦新激光器进入激光器列表,如果在draw()函数中调用drawLasers()函数,它将被绘制到屏幕上。
在updateLasers()函数中,可以遍历激光列表并检查它是哪种类型。因此,如果它是类型1(玩家),就可以将激光移动到屏幕上,然后检查它是否有任何影响。注意底部调用listCleanup()函数。我们稍后会谈到这一点。
碰撞过程先来看看checkPlayerLaserHit()。 可以通过循环外星人列表并使用Actor函数 - 碰撞点((lasers [l] .x,lasers [l] .y))来检测激光是否已击中任何外星人 - 以查看是否发生了碰撞。 如果外星人被击中,这就是状态变量发挥作用的地方。 需要将它们标记为准备移除,而不是仅仅从列表中移除激光和外星人。
这样做的原因是,如果在遍历任何列表时从列表中删除任何内容,那么当到达列表的末尾时,产生是一个元素短缺,并且将创建错误。 因此,要将这些Actors设置为已删除状态,然后使用listCleanup()将其删除。
清理乱七八糟的东西listCleanup()函数创建一个新的空列表,然后运行传递给它的列表,只传输项目到状态为0的新列表。然后返回这个新列表并用作列表继续。现在已经为一种类型的激光器制作了一个系统,可以很容易地类似来实现外星激光器类型。可以像玩家激光器一样创建外星激光器,但是可以使用if randint(0,5)== 0:当我们更新我们的外星人时,可以随机生成它们而不是等待键盘按下。我们将类型设置为0而不是1,并在updateLasers()函数中将它们向下移动到屏幕上。
打击基地到目前为止,还没有看到当激光击中其中一个防守基地时会发生什么。因为正在改变的是基地角色的高度,内置的碰撞检测给不了想要的结果,所以需要编写另一个自定义函数来检查基地角色上的激光碰撞。新函数collideLaser()将根据基地的高度检查激光坐标,和基地的高度比较。
然后在创建时将新函数附加到我们的基地角色上。可以使用新的collideLaser()函数来检查玩家和外星激光器,并在激光击中时移除激光 - 如果它是外星激光,则降低被击中的基地的高度。
激光控制可能想要改变外星人射击的激光器的数量,但是目前玩家船每次更新()循环都会激发激光。如果按住SPACE键,将会发出持续的激光流,这不仅对可怜的外星人有点不公平,而且还会对游戏的速度产生影响。因此需要对发射速度进行一些限制,可以使用另一个内置的Pygame Zero对象:时钟。
如果向玩家角色添加一个变量laserActive并在它触发时将其设置为零,可以在1秒后调用clock.schedule(makeLaserActive,1.0)来调用函数makeLaserActive()。
我被击中了!我被击中了!现在需要了解当玩家船被激光击中时会发生什么。为此要制作一个多帧动画。我们将五个爆炸图像放入列表中,在开头使用普通船舶图像,并将其附加到玩家角色。还需要导入Math模块,然后编写每个draw()循环:player.image = player.images [math.floor(player.status / 6)],它将显示正常的船舶图像,而player.status是0.。如果在玩家船被击中时将其设置为1,就可以开始动画。在update()函数中写:如果player.status> 0:player.status = 1.随着状态值的增加,它将开始一个接一个地绘制帧序列。
初始化在教程结束时处理初始化可能看起来有点奇怪,但是我们一直在添加和更改游戏元素的结构,现在才能真正看到所有的数据需要在比赛开始前进行设置。在步骤04中,创建了一个名为init()的函数,应该调用它来启动游戏。也可以使用此功能重置所有内容以重新开始游戏。如果已经包含了讨论过的所有初始化函数和变量,那么应该有类似于figure5.py的东西。
这么快就ok了!
完成第一部分有几个最后的润色。 可以在代码顶部附近设置一个DIFFICULTY值,并在各种元素上使用它来使游戏更难。还应该添加一个分数,如果外星人被击中,会通过在全局变量分数中加1000,然后在draw()函数中显示在屏幕的右上角。 当游戏结束时(玩家被击中或所有外星人都不见了),应该显示一个合适的消息。
看看完整的清单,看看这些位是如何适应的。当这一切都完成后,就有一个太空入侵者游戏的基础了。 在本系列的下一部分中,我们将在游戏中添加更多内容,例如关卡,生命,声音,奖金外星人和排行榜等。
本节结束了,关于本游戏更详细的制作教程,可以参考MagPi杂志第75期。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved