继续我们的小游戏,上一篇是搭建我们的基础平台,包括屏幕和放置飞船,现在我要实现的功能是左右移动飞船,为了以后的工作更加清晰,可以对代码进行重构,使得功能模块各司其职,利于扩展。
还是上全部代码吧,其实更改的不多,只是这样更易查看:
先看主程序:
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来控制左右移动,更加清晰。
最后我觉得重构代码这一块挺重要的,各个函数各司其职,清晰明了,便于日后的检查和扩展。