自己尝试写了一个飞机大战的游戏,一开始只能处理单个按键的信号:如只能单方向飞退出只能是鼠标点击X,后面重新修改代码实现了ALT+F4的退出功能,与同时按不同方向键出现组合的飞行路径。代码如下:
import sys
import pygame
from pygame.locals import * # key_pressed[]方法所在的包
from alien import Alien
from bullet import Bullet
def check_keydown_events(event, ai_setting, screen, ship, bullets):
if event.key == pygame.K_SPACE:
if len(bullets) < ai_setting.bullets_allowed:
new_bullet = Bullet(ai_setting, screen, ship)
bullets.add(new_bullet)
def check_events(ai_settings, screen, ship, bullets):
key_pressed = pygame.key.get_pressed()
c_exit = False
if key_pressed[K_LALT] and key_pressed[K_F4]: # 实现ALT+F4退出
c_exit = True
for event in pygame.event.get():
if event.type == pygame.QUIT or c_exit:
sys.exit()
elif event.type == pygame.KEYDOWN:
check_keydown_events(event, ai_settings, screen, ship, bullets)
if event.key == pygame.K_RIGHT:
ship.moving_right = True
if event.key == pygame.K_LEFT:
ship.moving_left = True
if event.key == pygame.K_UP:
ship.moving_up = True
if event.key == pygame.K_DOWN:
ship.moving_down = True
elif event.type == pygame.KEYUP:
if event.key == pygame.K_RIGHT:
ship.moving_right = False
if event.key == pygame.K_LEFT:
ship.moving_left = False
if event.key == pygame.K_UP:
ship.moving_up = False
if event.key == pygame.K_DOWN:
ship.moving_down = False
其中from alien import Alien和from bullet import Bullet是自己定义的其它对象,和上面的功能没关系
我把我飞船的类也贴一下,这样好参照着看,我把检测移动的信号写在了上面的那个模块中而移动的方法是在Ship对象中:
class Ship(object):
def __init__(self, screen):
self.screen = screen
self.image = pygame.image.load('image/ship.png').convert()
self.image = pygame.transform.scale(self.image, (60, 60))
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
self.moving_right = False
self.moving_left = False
self.moving_up = False
self.moving_down = False
def update(self):
# if self.moving_right:
# self.rect.centerx += 1
# if self.moving_left:
# self.rect.centerx -= 1
if self.moving_right and self.rect.right < 1200:
self.rect.centerx += 2
if self.moving_left and self.rect.left > 0:
self.rect.centerx -= 1.5
if self.moving_up and self.rect.top > 0:
self.rect.bottom -= 2
if self.moving_down and self.rect.bottom <= self.screen_rect.bottom:
self.rect.bottom += 2
def blit_me(self):
self.screen.blit(self.image, self.rect)