添加飞船图像

让我们将船添加到我们的游戏中。要在屏幕上绘制玩家的船,我们将加载图像,然后使用PyGame Blit() 方法绘制图像。

当您为游戏选择艺术品时,请务必注意许可。 最安全,最便宜的开始方法是使用可以从https://opengameart.org 等网站上使用和修改的自由许可图形。

您可以在游戏中使用几乎任何类型的图像文件,但是当使用 bitmap(.bmp) 文件时,它最简单,因为 pygame 默认情况下加载了位图。 尽管您可以配置 PyGame 使用其他文件类型,但某些文件类型取决于必须在计算机上安装的某些图像库。 您会发现的大多数图像是 .jpg 或 .png 格式,但是您可以使用Photoshop,gimp和Paint等工具将其转换为位图。

特别注意所选图像中的背景颜色。 尝试使用图像编辑器找到具有透明或坚固背景的文件,您可以用任何背景颜色替换。 如果图像的背景颜色与游戏的背景颜色相匹配,您的游戏将看起来最好。 另外,您可以将游戏的背景与图像的背景相匹配。

对于外星人入侵,您可以使用 ship.bmp(图1 2-1)文件,该 https://ehmatthes.githes.github.io/pcc_3e 在本书的资源中可用。该文件的背景颜色与我们在此项目中使用的设置相匹配。 在主 alien_invasion 项目文件夹中制作一个称为图像的文件夹。 将文件 ship.bmp 保存在图像文件夹中。

创建Ship类

为船舶选择图像后,我们需要将其显示在屏幕上。为了使用我们的飞船,我们将创建一个新的飞船模块,其中包含 Ship 类。 这个类将管理玩家飞船的大部分行为:

import pygame


class Ship:
    """A class to manage the ship."""

    def __init__(self, ai_game):
        """Initialize the ship and set its starting position."""
        self.screen = ai_game.screen (1)
        self.screen_rect = ai_game.screen.get_rect() (2)

        # Load the ship image and get its rect.
        self.image = pygame.image.load('images/ship.bmp') (3)
        self.rect = self.image.get_rect()

        # Start each new ship at the bottom center of the screen.
        self.rect.midbottom = self.screen_rect.midbottom (4)

    def blitme(self): (5)
        """Draw the ship at its current location."""
        self.screen.blit(self.image, self.rect)

Pygame 是高效的,因为它允许您像对待矩形(矩形)一样对待所有游戏元素,即使它们的形状并不完全像矩形。 将元素视为矩形是有效的,因为矩形是简单的几何形状。 例如,当 Pygame 需要确定两个游戏元素是否发生碰撞时,如果将每个对象都视为一个矩形,则可以更快地完成此操作。 这种方法通常效果很好,玩游戏的人不会注意到我们没有处理每个游戏元素的确切形状。 在本课程中,我们会将飞船和屏幕视为矩形。

我们在定义类之前导入 pygame 模块。 Ship 的 __init__() 方法有两个参数:self 引用和对 AlienInvasion 类的当前实例的引用。 这将使 Ship 能够访问 AlienInvasion 中定义的所有游戏资源。 然后我们将屏幕分配给 Ship ❶ 的一个属性,这样我们就可以在此类中的所有方法中轻松访问它。 我们使用 get_rect() 方法访问屏幕的 rect 属性并将其分配给 self.screen_rect ❷。 这样做可以让我们将飞船放置在屏幕上的正确位置。

要加载图像,我们调用 pygame.image.load() ❸ 并为其提供船舶图像的位置。 该函数返回代表船舶的表面,我们将其分配给 self.image。 加载图像后,我们调用 get_rect() 来访问船舶表面的 rect 属性,以便稍后使用它来放置船舶。

当您使用矩形(rect)对象时,您可以使用矩形的顶部、底部、左侧和右侧边缘以及中心的 x 和 y 坐标来放置该对象。您可以设置任何这些值来确定矩形(rect)的当前位置。当您将游戏元素居中时,请使用矩形(rect)的 center、centerx 或 centery 属性。 当您在屏幕边缘工作时,请使用顶部(top)、底部(bottom)、左侧(left)或右侧(right)属性。 还有一些组合了这些属性的属性,例如 midbottom、midtop、midleft 和 midright。 当您调整矩形(rect)的水平或垂直位置时,您可以只使用 x 和 y 属性,它们是其左上角的 x 和 y 坐标。 这些属性使您不必执行游戏开发人员以前必须手动执行的计算,并且您将经常使用它们。

在 Pygame 中,原点 (0, 0) 位于屏幕的左上角,坐标随着向下和向右而增加。 在 1200×800 的屏幕上,原点位于左上角,右下角的坐标为(1200, 800)。 这些坐标指的是游戏窗口,而不是物理屏幕。

我们将把船放置在屏幕的底部中心。 为此,请使 self.rect.midbottom 的值与屏幕矩形的 midbottom 属性匹配❹。 Pygame 使用这些 rect 属性来定位船舶图像,使其水平居中并与屏幕底部对齐。

最后,我们定义 blitme() 方法❺,它将图像绘制到屏幕上 self.rect 指定的位置。

在屏幕上绘制飞船

现在让我们更新 Alien_invasion.py,以便它创建一艘船并调用船的 blitme() 方法:

alien_invasion.py
from settings import Settings
from ship import Ship


class AlienInvasion:
    """Overall class to manage game assets and behavior."""

    def __init__(self):
        """Initialize the game, and create game resources."""
        pygame.init()
        self.clock = pygame.time.Clock()
        self.settings = Settings()

        self.screen = pygame.display.set_mode(
            (self.settings.screen_width, self.settings.screen_height))
        pygame.display.set_caption("Alien Invasion")

        self.ship = Ship(self) (1)

    def run_game(self):
        """Start the main loop for the game."""
        while True:
            # Watch for keyboard and mouse events.
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()

            # Redraw the screen during each pass through the loop.
            self.screen.fill(self.settings.bg_color)
            self.ship.blitme() (2)

            # Make the most recently drawn screen visible.
            pygame.display.flip()
            self.clock.tick(60)

我们导入 Ship,然后在创建屏幕后创建 Ship 的实例❶。 对 Ship() 的调用需要一个参数:AlienInvasion 的一个实例。 这里的 self 参数指的是 AlienInvasion 的当前实例。 这是赋予 Ship 访问游戏资源(例如屏幕对象)的参数。 我们将这个 Ship 实例分配给 self.ship。

填充背景后,我们通过调用 ship.blitme() 将船绘制到屏幕上,这样船就出现在背景之上❷。

当你现在运行 alien_invasion.py 时,你应该看到一个空的游戏屏幕,火箭飞船位于底部中心,如图12-2所示。

image 2023 06 21 20 54 55 192
Figure 1. Alien Invasion with the ship at the bottom center of the screen