发布时间:2022-08-07 19:03:29来源:网络整理浏览:43
前言
在下一篇文章中,我们将介绍飞船的左右连接,以及配置飞船的相应速度并相应限制飞船的运动范围。最后,重塑技术方法;并简要总结了最近的几份文件。本篇将为大家介绍武装飞船的最后一部分——飞船炮弹射箭的部分。
射箭
拿出来,我们添加射箭功能。我们将编写在玩家按下空格键时发射炮弹的代码。炮弹将在屏幕上排列并在到达屏幕顶部边缘时消失。
1、添加炮弹设置
首先,更新 .py 以在其 () 的末尾存储新类所需的值:
class Settings():
"""存储《外星人入侵》的所有设置类"""
def __init__(self):
"""初始化游戏的设置"""
# 屏幕的设置
self.screen_width = 900
self.screen_height = 600
self.bg_color = (230, 230, 230)
# 飞船的设置
self.ship_speed_factor = 1.5
# 子弹设置
self.bullet_speed_factor = 1
self.bullet_width = 3
self.bullet_height = 15
self.bullet_color = 60, 60, 60
此设置会创建一个 3 像素高和 15 像素高的深蓝色炮弹。炮弹的速度略低于船的速度。
2、创建类
为下面的存储类创建文件.py,如下:
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):
"""一个对飞船发射的子弹进行管理的类"""
def __init__(self, ai_settings, screen, ship):
"""在飞船所处的位置创建一个子弹对象"""
super().__init__()
self.screen = screen
# 在(0,0)处创建一个表示子弹的矩形,再设置正确的位置
self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, ai_settings.bullet_height)
self.rect.centerx = ship.rect.centerx
self.rect.top = ship.rect.top
# 存储用小数表示的子弹位置
self.y = float(self.rect.y)
self.color = ai_settings.bullet_color
self.speed_factor = ai_settings.bullet_speed_factor
def update(self):
"""向上移动子弹"""
# 更新表示子弹位置的小数值
self.y -= self.speed_factor
# 更新表示子弹的rect位置
self.rect.y = self.y
def draw_bullet(self):
"""在屏幕上绘制子弹"""
pygame.draw.rect(self.screen, self.color, self.rect)
该类继承了我们从 导出的类。通过使用精灵,可以对游戏中的相关元素进行分组,从而同时操作组中的所有元素。要创建一个shell实例,需要传递(),然后ship实例,还要调用super()来继承。
首先,我们创建 shell 的属性 rect。贝壳不是基于图像的,为此我们必须使用 .Rect() 类从空白开始创建一个菱形。创建该类的实例时,必须提供圆左上角的 x 和 y 坐标,以及正方形的长度和高度。我们在 (0,0) 处创建圆,但后面的两行代码将它连接到正确的位置,因为外壳的初始位置取决于船的当前位置。外壳是从提取的。
此外,我们将外壳的矩形设置为船的矩形。炮弹应该从船底射出,为此我们将代表炮弹的矩形的 top 属性设置为船的 rect 的 top 属性,以使炮弹看起来像是从船上射出的。
我们将外壳的 y 坐标存储为十进制值,以便我们可以微调外壳的速度。我们将外壳的颜色和速度设置分别存储在 self.color 和 self. 中。
() 管理外壳的位置。发射shell后,shell在屏幕中向下连接,这意味着y坐标会不断减小,所以为了更新shell的位置,我们除以self的值。来自self.y。拿出来,我们把 self.rect.y 设置为 self.y 的值。属性允许我们随着游戏的进行调整游戏的行为,或者根据需要增加炮弹的速度。炮弹发射后,其 x 坐标保持不变,因此炮弹将沿直线垂直移动。
当我们需要绘制外壳时,我们调用()。函数 draw.rect() 用存储在 self.color 中的颜色填充代表弹丸的矩形占据的屏幕部分。
3、将 shell 分组存储
定义了类和必要的设置后,就可以编写代码,让玩家每次按下空格键时都会发射炮弹。首先,我们将在 .py 中创建一个组来存储所有可用的 shell,以便我们可以管理所有被触发的 shell。该组将是 ..Group 类的一个实例;..Group 类似于列表射击外星人,但提供了有助于开发游戏的额外功能。在主循环中,我们将使用该组在屏幕上绘制贝壳,并更新每个贝壳的位置:
import sys
import pygame
from settings import Settings
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
def run_game():
# 初始化游戏并创建一个屏幕对象
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
pygame.display.set_caption("Alian Invasion")
# 创建一艘飞船
ship = Ship(ai_settings, screen)
# 创建一组一个用于存储子弹的编组
bullets = Group()
# 开始游戏的主循环
while True:
# 监视键盘和鼠标事件
gf.check_events(ai_settings, screen, ship, bullets)
ship.update()
# 每次循环时都重绘屏幕
bullets.update()
gf.update_screen(ai_settings, screen, ship, bullets)
run_game()
我们将 Group 类导出到 . 首先,我们创建了一个 Group 实例并命名它。该组是在 while 循环之外创建的,因此每次运行循环时都无需创建新的 shell 组。
这里需要注意的是,如果在循环内部创建这样的组,游戏会在运行时创建上千个子弹组,让游戏慢如蜗牛。如果游戏卡住了,请仔细查看主 while 循环中发生的情况。
我们将传递给 () 和 ()。在( )中,我们需要处理玩家按下空格键的时间;在 ( ) 中,我们需要更新屏幕上的轮廓。
当我们在一个组上调用()时,该组将在其中的每个精灵上手动调用(),因此 .() 行将在组中的每个外壳上调用 .() 。
4、开火
在 .py 中,我们还需要更改 () 以在玩家按下空格键时发射炮弹。我们不需要 (),因为当玩家抬起空格键时没有任何反应。我们还需要 () 以确保在调用 flip() 之前在屏幕上重绘每个 shell。以下是 .py 的相关代码更改:
import sys
import pygame
from bullet import Bullet
def check_keydown_events(event, ai_settings, screen, ship, bullets):
"""响应按键"""
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
elif event.key == pygame.K_SPACE:
# 创建一颗子弹,并将其加入到编组bullets中
new_bullet = Bullet(ai_settings, screen, ship)
bullets.add(new_bullet)
def check_keyup_events(event, ship):
"""响应松开"""
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False
def check_events(ai_settings, screen, ship, bullets):
"""响应按键和鼠标事件"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
check_keydown_events(event, ai_settings, screen, ship, bullets)
elif event.type == pygame.KEYUP:
check_keyup_events(event, ship)
def update_screen(ai_settings, screen, ship, bullets):
"""更新屏幕上的图像,并切换到新屏幕"""
# 每次循环时都重绘屏幕
screen.fill(ai_settings.bg_color)
# 在飞船和外星人后面重绘所有子弹
for bullet in bullets.sprites():
bullet.draw_bullet()
ship.blitme()
# 让最近绘制的屏幕可见
pygame.display.flip()
编组传递给 ()。当玩家按下空格键时,会创建一个新的 shell(名称的实例)并使用方法 add() 将其添加到组中。代码 .add(new) 将新的 shell 存储到组中。
在()的定义中,我们需要添加赋值;在调用 () 时,我们还需要将其作为形参传递。
此外,我们在 () 中添加了一个数组,用于在屏幕上绘制贝壳。.() 方式返回一个包含组中所有精灵的列表。为了绘制所有在屏幕上发射的炮弹,我们遍历组中的精灵并在每个精灵上调用()。
如果此时运行.py,就可以左右连接航天器,发射任意数量的炮弹。炮弹沿着屏幕向下移动并在到达屏幕底部时消失。实际上,我们在 .py 中更改了炮弹的大小、颜色和速度。
5、删除丢失的外壳
当前的外壳在到达屏幕顶部时会消失,这仅仅是因为它们没有被绘制到屏幕外。贝壳实际上仍然存在,并且它们的 y 坐标为正且越来越小。这是一个问题,因为它们将继续消耗内存和处理能力。
我们需要删除那些早已消失的shell,否则游戏会做越来越多无用的工作,并且会显得越来越慢。因此,我们需要测量代表弹丸的矩形的属性为零的情况,这表明弹丸已经穿过屏幕顶部:
import sys
import pygame
from settings import Settings
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
def run_game():
# 初始化游戏并创建一个屏幕对象
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
pygame.display.set_caption("Alian Invasion")
# 创建一艘飞船
ship = Ship(ai_settings, screen)
# 创建一组一个用于存储子弹的编组
bullets = Group()
# 开始游戏的主循环
while True:
# 监视键盘和鼠标事件
gf.check_events(ai_settings, screen, ship, bullets)
ship.update()
# 每次循环时都重绘屏幕
bullets.update()
# 删除已消失的子弹
for bullet in bullets.copy():
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
print(len(bullets))
gf.update_screen(ai_settings, screen, ship, bullets)
run_game()
在 for 循环中,不应从列表或编辑组中删除项目,因此必须遍历组的副本。我们使用方法 copy() 来设置 for 循环,这允许我们在循环内更改它。我们检查每个外壳,看看它是否从屏幕顶部消失了。如果是这样,它将被删除。最后,我们用一个 print 语句来显示我们目前有多少个 shell,从而验证那些已经消失的 shell 确实被删除了。
如果这段代码没有问题,当我们在发射炮弹后查看终端窗口时,会发现随着炮弹在屏幕顶部一个接一个地消失,炮弹的数量会逐渐减少到0.运行游戏并确认外壳已被移除。删除后,删除此打印语句。如果我们把这句话留在原地,游戏率会大大提高,因为将输出写入终端比将图形绘制到游戏窗口需要更多的时间。
6、限制shell数量
许多射箭游戏都会限制同时出现在屏幕上的炮弹数量,以鼓励玩家故意射箭。游戏“外星人入侵”中有以下限制。
首先,在 .py 中存储允许的最大 shell 数量:
class Settings():
"""存储《外星人入侵》的所有设置类"""
def __init__(self):
"""初始化游戏的设置"""
# 屏幕的设置
self.screen_width = 900
self.screen_height = 600
self.bg_color = (230, 230, 230)
# 飞船的设置
self.ship_speed_factor = 1.5
# 子弹设置
self.bullet_speed_factor = 1
self.bullet_width = 3
self.bullet_height = 15
self.bullet_color = 60, 60, 60
self.bullets_allowed = 3
这将未消失的 shell 数量限制为 3。在 .py 的 () 中,我们在创建新 shell 之前检查未消失的 shell 数量是否大于此设置:
import sys
import pygame
from bullet import Bullet
def check_keydown_events(event, ai_settings, screen, ship, bullets):
"""响应按键"""
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
elif event.key == pygame.K_SPACE:
# 创建一颗子弹,并将其加入到编组bullets中
if len(bullets) < ai_settings.bullets_allowed:
new_bullet = Bullet(ai_settings, screen, ship)
bullets.add(new_bullet)
def check_keyup_events(event, ship):
"""响应松开"""
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False
def check_events(ai_settings, screen, ship, bullets):
"""响应按键和鼠标事件"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
check_keydown_events(event, ai_settings, screen, ship, bullets)
elif event.type == pygame.KEYUP:
check_keyup_events(event, ship)
def update_screen(ai_settings, screen, ship, bullets):
"""更新屏幕上的图像,并切换到新屏幕"""
# 每次循环时都重绘屏幕
screen.fill(ai_settings.bg_color)
# 在飞船和外星人后面重绘所有子弹
for bullet in bullets.sprites():
bullet.draw_bullet()
ship.blitme()
# 让最近绘制的屏幕可见
pygame.display.flip()
当玩家按下空格键时我们检测到的厚度。如果 len() 大于 3,我们创建一个新的 shell;但是如果已经有 3 个炮弹没有消失,那么当玩家按下空格键时不会发生任何事情。如果你现在运行游戏,屏幕上最多只有 3 个炮弹。
7、创建函数()
一旦编写并检测了 shell 管理代码,就可以将其移动到模块中,以使主程序文件 .py 尽可能简单。我们创建一个名为的新函数并将其添加到 .py 的末尾:
import sys
import pygame
from bullet import Bullet
def check_keydown_events(event, ai_settings, screen, ship, bullets):
"""响应按键"""
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
elif event.key == pygame.K_SPACE:
# 创建一颗子弹,并将其加入到编组bullets中
if len(bullets) < ai_settings.bullets_allowed:
new_bullet = Bullet(ai_settings, screen, ship)
bullets.add(new_bullet)
def check_keyup_events(event, ship):
"""响应松开"""
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False
def check_events(ai_settings, screen, ship, bullets):
"""响应按键和鼠标事件"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
check_keydown_events(event, ai_settings, screen, ship, bullets)
elif event.type == pygame.KEYUP:
check_keyup_events(event, ship)
def update_screen(ai_settings, screen, ship, bullets):
"""更新屏幕上的图像,并切换到新屏幕"""
# 每次循环时都重绘屏幕
screen.fill(ai_settings.bg_color)
# 在飞船和外星人后面重绘所有子弹
for bullet in bullets.sprites():
bullet.draw_bullet()
ship.blitme()
# 让最近绘制的屏幕可见
pygame.display.flip()
def update_bullets(bullets):
"""更新子弹的位置,并删除已消失的子弹"""
# 更新子弹的位置
bullets.update()
# 删除已消失的子弹
for bullet in bullets.copy():
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
() 的代码是从 .py 中剪切和粘贴的,它只需要一个参数,即编组。
.py 中的 while 循环变得更简单:
import sys
import pygame
from settings import Settings
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
def run_game():
# 初始化游戏并创建一个屏幕对象
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
pygame.display.set_caption("Alian Invasion")
# 创建一艘飞船
ship = Ship(ai_settings, screen)
# 创建一组一个用于存储子弹的编组
bullets = Group()
# 开始游戏的主循环
while True:
# 监视键盘和鼠标事件
gf.check_events(ai_settings, screen, ship, bullets)
ship.update()
gf.update_bullets(bullets)
gf.update_screen(ai_settings, screen, ship, bullets)
run_game()
我们使主循环包含尽可能少的代码,这样只需查看函数名称,您就可以快速了解游戏中发生了什么。主循环检测玩家的输入,然后更新船的位置和任何没有消失的炮弹的位置。拿起后,我们使用更新后的位置来绘制新屏幕。
8、创建函数()
触发 shell 的代码被移到了下面的一个单独的函数中,因此 () 中只使用了一行代码来触发 shell,使得 elif 代码块非常简单:
import sys
import pygame
from bullet import Bullet
def check_keydown_events(event, ai_settings, screen, ship, bullets):
"""响应按键"""
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
elif event.key == pygame.K_SPACE:
# 创建一颗子弹,并将其加入到编组bullets中
fire_bullet(ai_settings, screen, ship, bullets)
def fire_bullet(ai_settings, screen, ship, bullets):
"""如果还没有到达限制,就发射一颗子弹"""
if len(bullets) < ai_settings.bullets_allowed:
new_bullet = Bullet(ai_settings, screen, ship)
bullets.add(new_bullet)
def check_keyup_events(event, ship):
"""响应松开"""
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False
def check_events(ai_settings, screen, ship, bullets):
"""响应按键和鼠标事件"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
check_keydown_events(event, ai_settings, screen, ship, bullets)
elif event.type == pygame.KEYUP:
check_keyup_events(event, ship)
def update_screen(ai_settings, screen, ship, bullets):
"""更新屏幕上的图像,并切换到新屏幕"""
# 每次循环时都重绘屏幕
screen.fill(ai_settings.bg_color)
# 在飞船和外星人后面重绘所有子弹
for bullet in bullets.sprites():
bullet.draw_bullet()
ship.blitme()
# 让最近绘制的屏幕可见
pygame.display.flip()
def update_bullets(bullets):
"""更新子弹的位置,并删除已消失的子弹"""
# 更新子弹的位置
bullets.update()
# 删除已消失的子弹
for bullet in bullets.copy():
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
该函数只包含当玩家按下空格键时触发 shell 的代码;在 () 中,我们在玩家按下空格键时调用 ()。我们再次运行 .py 并确认在发射 shell 时仍然没有错误。
总结
在下一篇文章中,我们将介绍飞船的左右连接,以及配置飞船的相应速度并相应限制飞船的运动范围。最后,重塑技术方法;并简要总结了最近的几份文件。这篇文章给你在飞船中投射炮弹和箭的功能;主要包括添加炮弹设置、创建类、将炮弹分组、发射、删除消失炮弹和限制炮弹数量。最后,在 .py 中创建了两个新函数,进一步简化了 .py 中的代码。至此,我们《异形入侵》中的第一个大模块——武装飞船已经介绍给大家了。我们通过四篇文章详细介绍了这个功能。因为这个项目的疗效是动态的,所以很难截图。有兴趣的可以使用这个功能涉及的代码自己实现,看看这个模块的动态疗效。为了让你更好的吸收项目中用到的知识点,我们每篇文章只允许你实现一个“外星入侵”的功能,所以希望你能仔细阅读,仔细看代码,理解深意,让我们把这个项目的价值最大化。虽然这个项目已经很典型了,代码到处都是,但是,如果只是粘贴复制,对你的知识学习没有任何价值,你还是要重温一遍,然后你就会知道每一行代码的含义或者我们后面要介绍的知识点都用到了哪些。只有这样,这个项目才会发挥不同的价值。希望大家努力学习,巩固基础知识。它是一种强调实际操作的语言。它是众多编程语言中最简单也是最好的点。学好语言后,学习java、go、C还是比较简单的。其实它也是一门流行的语言,对人工智能的实现有很大的帮助。因此射击外星人,值得您花时间学习。生活无止境,努力无止境。我们每晚努力工作,努力学习,不断提高自己的能力。我相信我们会学到一些东西。来吧!!!这个项目将发挥不同的价值。希望大家努力学习,巩固基础知识。它是一种强调实际操作的语言。它是众多编程语言中最简单也是最好的点。学好语言后,学习java、go、C还是比较简单的。其实它也是一门流行的语言,对人工智能的实现有很大的帮助。因此,值得您花时间学习。生活无止境,努力无止境。我们每晚努力工作,努力学习,不断提高自己的能力。我相信我们会学到一些东西。来吧!!!这个项目将发挥不同的价值。希望大家努力学习,巩固基础知识。它是一种强调实际操作的语言。它是众多编程语言中最简单也是最好的点。学好语言后,学习java、go、C还是比较简单的。其实它也是一门流行的语言,对人工智能的实现有很大的帮助。因此,值得您花时间学习。生活无止境,努力无止境。我们每晚努力工作,努力学习,不断提高自己的能力。我相信我们会学到一些东西。来吧!!!学好语言后,学习java、go、C还是比较简单的。其实它也是一门流行的语言,对人工智能的实现有很大的帮助。因此,值得您花时间学习。生活无止境,努力无止境。我们每晚努力工作,努力学习,不断提高自己的能力。我相信我们会学到一些东西。来吧!!!学好语言后,学习java、go、C还是比较简单的。其实它也是一门流行的语言,对人工智能的实现有很大的帮助。因此,值得您花时间学习。生活无止境,努力无止境。我们每晚努力工作,努力学习,不断提高自己的能力。我相信我们会学到一些东西。来吧!!!
007球探网即时比分 足球手机版下载_007球探网即时比分 足球手机版「EV2.0」下载
热门手游
下载02s515排水检查井下载_02s515排水检查井「EV2.0」下载
热门手游
下载0515返利网下载_0515返利网「Ve2.2」下载
热门手游
下载03g101图集下载_03g101图集「V1.25」下载
热门手游
下载1.70合击下载_1.70合击「VE1.10」下载
热门手游
下载1 2 fan club下载_1 2 fan club「EV2.0」下载
热门手游
下载1.70金币版下载_1.70金币版「V1.2」下载
热门手游
下载.net framework 3.0下载_.net framework 3.0「VE1.10」下载
热门手游
下载