Pygame实战之外星人入侵NO.2——左右移动飞船

继续我们的小游戏,上一篇是搭建我们的基础平台,包括屏幕和放置飞船,现在我要实现的功能是左右移动飞船,为了以后的工作更加清晰,可以对代码进行重构,使得功能模块各司其职,利于扩展。

还是上全部代码吧,其实更改的不多,只是这样更易查看:

先看主程序:

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来控制左右移动,更加清晰。

最后我觉得重构代码这一块挺重要的,各个函数各司其职,清晰明了,便于日后的检查和扩展。

猜你喜欢

转载自blog.csdn.net/u014483914/article/details/79967484