《Python编程从入门到实践》(第十二章.武装飞船)

1. 设置背景色 P209

在Pygame中,颜色是以RGB值指定的。

bg_color = (230,230,230)#设置背景色

2. 创建ship类 P212

import pygame

class Ship():

    def __init__(self, ai_settings, screen):
        """初始化飞船并设置其位置."""
        self.screen = screen
        self.ai_settings = ai_settings

        # 加载飞船图像并获取其外接矩形.
        self.image = pygame.image.load('images/ship.bmp')
        self.rect = self.image.get_rect()
        self.screen_rect = screen.get_rect()

        # 将每艘新飞船放在屏幕底部中央.
        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom = self.screen_rect.bottom
        
        # Store a decimal value for the ship's center.
        self.center = float(self.rect.centerx)
        
        # Movement flags.
        self.moving_right = False
        self.moving_left = False
        
    def update(self):
        """Update the ship's position, based on movement flags."""
        # Update the ship's center value, not the rect.
        if self.moving_right and self.rect.right < self.screen_rect.right:
            self.center += self.ai_settings.ship_speed_factor
        if self.moving_left and self.rect.left > 0:
            self.center -= self.ai_settings.ship_speed_factor
            
        # Update rect object from self.center.
        self.rect.centerx = self.center

    def blitme(self):
        """在指定位置绘制飞船"""
        self.screen.blit(self.image, self.rect)
    

处理rect对象时,可使用矩形四角和中心的x和y坐标。
要调整游戏元素的水平或垂直位置,可使用属性x和y,它们分别是相应矩形左上角的x和y坐标。

3. 响应按键 P216

每当用户按键时,都将在Pygame中注册一个事件。事件都是通过方法pygame.event.get()获取的。

#监视键盘和鼠标事件
for event in pygame.event.get():
	if event.type == pygame.QUIT: #单击游戏窗口的关闭按钮
			sys.exit() #退出游戏
	if event.type == pygame.KEYDOWN:  #是否有按键按下
		if event.key  == pygame.K_RIGHT: #是否按下了右箭头
			ship.rect.centerx += 1 #向右移动飞船

4. 调整飞船的速度 P220


self.center = float(self.rect.centerx) #将self.rect.centerx转换成小数,并将结果存储到self.center中

if self.moving_right :
	 self.center += self.ai_settings.ship_speed_factor
if self.moving_left :
	 self.center -= self.ai_settings.ship_speed_factor
            
 # Update rect object from self.center.
	 self.rect.centerx = self.center

rect只能存储数值的整数部分,所以这里先定义了一个可存储小数值的新属性self.center。先调整self.center 的值,最后再赋值给self.rect.centerx。这样做,虽然self.rect.center仍将只存储整数部分,但是缓解了连续调整过程中的小数部分的丢失现象。

5. 删除已消失的子弹 P228

for bullet in bullets.copy():
	if bullet.rect.bottom <= 0:
		bullets.remove(bullet)

在for循环中,不应从列表或编组中删除条目,因此必须遍历编组的副本。(Why?这一点还希望大佬看到的时候能够解释一下)

你可能感兴趣的:(python)