继续我们的小游戏,上一篇是搭建我们的基础平台,包括屏幕和放置飞船,现在我要实现的功能是左右移动飞船,为了以后的工作更加清晰,可以对代码进行重构,使得功能模块各司其职,利于扩展。
还是上全部代码吧,其实更改的不多,只是这样更易查看:
先看主程序:
import pygame
from settings import Settings
from ship import Ship
import game_functions as gf
def run_game():
pygame.init() #初始化背景设置
ai_settings=Settings() #实例化
screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height)) #调用属性设置屏幕的宽高
pygame.display.set_caption("Alien Invasion") #设置标题
ship=Ship(screen) #实例化Ship
while True:
gf.check_events(ship)
ship.update() #每次循环都访问该函数,保证飞船的位置将在检测到键盘事件后(但在更新屏幕前)更新
gf.update_screen(ai_settings,screen,ship)
run_game()
注意循环体,相较于上一篇我们进行了重构,这里调用了三个函数,展示如下:
import sys
import pygame
def check_events(ship):
for event in pygame.event.get(): #检测键盘鼠标事件
if event.type==pygame.QUIT:
sys.exit() #退出程序
elif event.type==pygame.KEYDOWN:
if event.key==pygame.K_RIGHT:
ship.moving_right=True #若按下右箭头则使ship.rect.centerx加1
elif event.key==pygame.K_LEFT:
ship.moving_left=True #注意这里若同时按下左右箭头将检测到两个不同事件
elif event.type==pygame.KEYUP:
if event.key==pygame.K_RIGHT:
ship.moving_right=False #若松开右箭头则停止ship.rect.centerx加1
elif event.key==pygame.K_LEFT:
ship.moving_left=False
def update_screen(ai_settings,screen,ship):
screen.fill(ai_settings.bg_color) #调用属性设置屏幕的填充颜色
ship.blitme() #显示飞船
pygame.display.flip() #是最近绘制的屏幕可见
对飞船的操作在这里:
import pygame
class Ship():
def __init__(self,screen): #参数screen将制定要将飞船绘制到什么地方
self.screen=screen
self.image=pygame.image.load('images/ship.png') #加载图像
self.rect=self.image.get_rect() #返回一个表示飞船的矩形
self.screen_rect=screen.get_rect() #返回一个表示屏幕的矩形
#get_rect()获取对应的rect属性,使得我们能够像处理矩形一样处理游戏元素,其实我们处理的并不是游戏元素的实际形状
self.rect.centerx=self.screen_rect.centerx #将飞船中心的x坐标设置为表示屏幕的矩形的属性centerx
self.rect.bottom=self.screen_rect.bottom #注意屏幕边缘的表示:top,bottom,left,right
#将每艘飞船放置在屏幕底端中央位置,在pygame中,原点(0,0)位于屏幕左上角
#移动标志
self.moving_right=False
self.moving_left=False
def update(self):
if self.moving_right:
self.rect.centerx += 1
if self.moving_left:
self.rect.centerx -= 1
def blitme(self):
self.screen.blit(self.image,self.rect)
#根据self.rect指定的位置将图像绘制到屏幕中(self.rect就是图像的一个外接矩形)
先看下效果吧,不会截动图,大家看一下左右移动吧
左右移动:
大体梳理一下吧,首先是重构代码,把对于事件的获取和对飞船的处理分别放在不同的函数中,这样只需在主程序中调用即可;要实现飞船的左右移动也就是要改变ship.rect.centerx的值,并且将之与左右箭头联合起来,这样就涉及到左右键事件的获取,用到了pygame.event.get()方法,更进一步,要实现持续移动,对于按键的“按”和“松”都要进行检查,这样用到了pygame.KEYDOWN和pygame.KEYUP,再结合左右键的设置就完美了,这里用新的属性moving_right和moving_left来控制左右移动,更加清晰。
最后我觉得重构代码这一块挺重要的,各个函数各司其职,清晰明了,便于日后的检查和扩展。