飞船的移动
思路:当按下特定的方向键后,飞船向指定的方向移动,可以允许不断移动,为实现不断移动,需要设置一个移动标志,默认为False,当按下时,则为True,实现其方向键的移动,除此之外,还要限制飞船的活动范围,防止飞出边界,为此需要更改代码
ship.py完整代码如下
import pygameclass Ship():def __init__(self,ai,screen):"""初始化飞船并设置其初始位置"""self.screen=screenself.ai=ai#加载飞船图像self.image=pygame.image.load('E:\外星人入侵\images\ship.bmp')#获取飞船图像的长宽尺寸self.rect=self.image.get_rect()#获取游戏屏幕的尺寸self.screen_rect=screen.get_rect()#将每艘新飞船放在屏幕底部的中央#飞船的x坐标=屏幕的x中间位置坐标self.rect.centerx=self.screen_rect.centerx#飞船的y坐标=屏幕的底部Y值self.rect.bottom=self.screen_rect.bottom#在飞船的属性center中存储最小数值# self.center=float(0)#飞船移动标志self.moving_right=Falseself.moving_left =Falseself.moving_down = Falseself.moving_up = Falsedef update(self):"""根据移动标志调整飞船的位置"""#更新飞船的center值而不是rectif self.moving_right and self.rect.right<self.screen_rect.right:self.rect.centerx+=1#self.center+=self.ai.speedif self.moving_left and self.rect.left>0:self.rect.centerx-=1if self.moving_up and self.rect.top>self.screen_rect.top:self.rect.centery -= 1# self.center+=self.ai.speedif self.moving_down and self.rect.bottom<self.screen_rect.bottom:self.rect.centery += 1#self.center -= self.ai.speed#根据self.center更新rect对象#self.rect.centerx+=self.centerdef blitme(self):"""指定位置绘制飞船"""#blit(图像,图像绘制的位置坐标)self.screen.blit(self.image,self.rect)
添加update()函数,根据上下左右移动标志,进行飞船的上下左右移动
game_functions.py完整代码如下
import sys
import pygamedef check_keydown_evnet(event,ship):if event.key == pygame.K_RIGHT:# 向右移动飞船ship.moving_right = Trueelif event.key == pygame.K_LEFT:# 向右移动飞船ship.moving_left = Trueelif event.key==pygame.K_UP:ship.moving_up = Trueelif event.key==pygame.K_DOWN:ship.moving_down = Truedef check_keyup_event(event,ship):if event.key == pygame.K_RIGHT:# 向右移动飞船ship.moving_right = Falseelif event.key == pygame.K_LEFT:# 向右移动飞船ship.moving_left = Falseelif event.key==pygame.K_UP:ship.moving_up = Falseelif event.key==pygame.K_DOWN:ship.moving_down = Falsedef check_evens(ship):"""响应按键和鼠标事件"""for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()#检测是否有按键按下elif event.type==pygame.KEYDOWN:check_keydown_evnet(event, ship)elif event.type==pygame.KEYUP:check_keyup_event(event, ship)def update_screen(ai_settings,screen,ship):"""每次更新屏幕上的图像,并切换到新屏幕"""# 背景填充颜色screen.fill(ai_settings.bg_color)# 将飞船绘制到屏幕上ship.blitme()# 让最近绘制的屏幕可见,否则是看不见的pygame.display.flip()
进行相应的按键事件处理,添加判断按键是否按下与松开的相关处理事件,从而实现飞船的上下左右移动
alien_invasion.py完整代码如下
import sysimport pygame
#导入设置类
from settings import Settings
from ship import Ship
import game_functions as gfdef run_game():#初始化游戏并创建一个屏幕对象pygame.init()#实例化settings对象ai=Settings()#创建游戏窗口大小screen=pygame.display.set_mode((ai.screen_width,ai.screen_height))#创建游戏标题pygame.display.set_caption("外星人大战")#实例化飞船对象ship,传入屏幕实参ship=Ship(ai,screen)#开始游戏的主循环while True:#监视键盘和鼠标的事件gf.check_evens(ship)ship.update()gf.update_screen(ai,screen,ship)
if __name__ == '__main__':run_game()
最后实现的效果图如下
总结
实现飞船的上下左右移动,以及边界限制