在Pygame中,颜色是以RGB值指定的。
bg_color = (230,230,230)#设置背景色
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坐标。
每当用户按键时,都将在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 #向右移动飞船
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仍将只存储整数部分,但是缓解了连续调整过程中的小数部分的丢失现象。
for bullet in bullets.copy():
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
在for循环中,不应从列表或编组中删除条目,因此必须遍历编组的副本。(Why?这一点还希望大佬看到的时候能够解释一下)