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

原创 2018年04月16日 22:36:14

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

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

先看主程序:

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

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

python pygame实战《飞船大战外星人》

pygame小游戏开发
  • kanwenzhang
  • kanwenzhang
  • 2016-08-16 14:56:13
  • 3328

pygame入门小游戏(外星人入侵(6) 外星飞船来啦!【二】)

上节因为并没有使用Sprite,感觉实现击落飞船有点困难,所以咱们接着5,继续...
  • Sunny_Guang
  • Sunny_Guang
  • 2017-11-21 16:06:21
  • 468

python实战游戏开发——添加飞船图像

1、创建Ship类 import pygame # -*- coding: utf-8 -*- class Ship():       def __init__(self,screen):      ...
  • qq_32458499
  • qq_32458499
  • 2017-10-06 10:34:56
  • 898

pygame入门小游戏(外星人入侵(6) 外星飞船来啦!)

既然我们的飞船都能发射子弹了,那么接下来我们添加一些敌机(外星飞船)给游戏增加点乐趣。...
  • Sunny_Guang
  • Sunny_Guang
  • 2017-11-20 21:33:12
  • 200

Python游戏系列之三_控制飞机移动

Python游戏系列之三_控制飞机移动
  • hanhf
  • hanhf
  • 2017-03-24 14:34:57
  • 1973

python 外星人小游戏(驾驶飞船)

  • 2017年12月11日 22:36
  • 5KB
  • 下载

python 外星人入侵游戏的开发

游戏简介:玩家控制着一艘最初出现在屏幕底部中央的飞船,玩家可以使用箭头左右移动飞船,还可以使用空格键进行射击。游戏开始时,一群外星人出现在天空中,他们在屏幕中向下移动。玩家的任务是射杀这些外星人。玩家...
  • username_yunfei
  • username_yunfei
  • 2017-11-08 21:33:12
  • 590

pygame入门小游戏(外星人入侵(7) )

本节介绍了让外星飞船移动,并能够击落外星飞船
  • Sunny_Guang
  • Sunny_Guang
  • 2017-11-23 13:50:35
  • 507
收藏助手
不良信息举报
您举报文章:Pygame实战之外星人入侵NO.2——左右移动飞船
举报原因:
原因补充:

(最多只允许输入30个字)