限制飞船在外星人入侵中的航程
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
在第二行,我们将船进一步向左移动。然而,如果飞船已经在屏幕的左边缘,我们不想这样做,因为那样它就会离开屏幕。所以在我们移动船之前,先检查一下船是否比屏幕的左边缘更靠右。如果是这样,将船移到左侧是安全的。
值得注意的是,这段代码并不是完成此任务的好方法,但这正是代码的意图。
另一种理解方式:删除那部分线然后玩游戏。您将能够将飞船移出屏幕左侧。
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
在第二行,我们将船进一步向左移动。然而,如果飞船已经在屏幕的左边缘,我们不想这样做,因为那样它就会离开屏幕。所以在我们移动船之前,先检查一下船是否比屏幕的左边缘更靠右。如果是这样,将船移到左侧是安全的。
值得注意的是,这段代码并不是完成此任务的好方法,但这正是代码的意图。
另一种理解方式:删除那部分线然后玩游戏。您将能够将飞船移出屏幕左侧。