限制飞船在外星人入侵中的航程

Limiting the ship's range in alien invasion

import pygame

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

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

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

        # Start each ship at the bottom centre of the screen
        self.rect.midbottom = self.screen_rect.midbottom

        # Store a decimal value for the ship's horizontal position
        self.x = float(self.rect.x)

        # Movement flag
        self.moving_right = False
        self.moving_left = False

    def update(self):
        """"Update the ship's position based on movement flag."""
        # Update the ship's x value and not the rect.
        if self.moving_right and self.rect.right < self.screen_rect.right:
            self.x += self.settings.ship_speed
        if self.moving_left and self.rect.left > 0:
            self.x -= self.settings.ship_speed

        # Update rect object from self.x
        self.rect.x = self.x

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

update 方法中,我们声明了if 语句,以便飞船停留在屏幕边界内。但是为什么要验证self.rect.left > 0?这意味着什么?

屏幕左边缘是水平位置0。

如果某些东西是从 10 开始绘制的,那么它会非常靠近左边缘。

如果从 0 开始绘制某些内容,则图像的左边缘将与屏幕的左边缘完美对齐。

如果从 0 以下开始绘制某些内容,则意味着它部分(或完全)绘制在屏幕外。

if self.moving_left and self.rect.left > 0:
    self.x -= self.settings.ship_speed

在第二行,我们将船进一步向左移动。然而,如果飞船已经在屏幕的左边缘,我们不想这样做,因为那样它就会离开屏幕。所以在我们移动船之前,先检查一下船是否比屏幕的左边缘更靠右。如果是这样,将船移到左侧是安全的。

值得注意的是,这段代码并不是完成此任务的好方法,但这正是代码的意图。

另一种理解方式:删除那部分线然后玩游戏。您将能够将飞船移出屏幕左侧。