Python12_项目一 :外星人入侵游戏03(重构run_game() 且 在限制范围内左右移动飞船)

为了更好地将代码模块化,我们将游戏的主循环重构为两个函数:

check_event() 和 update_screen(),并且,将他们封装到game_function.py文件中

其中,监视键盘和鼠标事件的操作我们叫做check_event(),实时更新屏幕的操作我们叫update_screen()

如下图所示:

然后附上game_function.py文件的代码:

import sys
import pygame


def check_event(ship):          # 响应按键和鼠标事件
    for i in pygame.event.get():
        if i.type == pygame.QUIT:
            sys.exit()

        elif i.type == pygame.KEYDOWN:
            if i.key == pygame.K_RIGHT:
                # 向右移动飞船
                ship.moving_right = True
                # ship.rect.centerx += 10
            elif i.key == pygame.K_LEFT:
                # 向左移动飞船
                # ship.rect.centerx -= 10
                ship.moving_left = True

        elif i.type == pygame.KEYUP:
            if i.key == pygame.K_RIGHT:
                ship.moving_right = False
            elif i.key == pygame.K_LEFT:
                ship.moving_left = False


def update_screen(ai_setting,screen,ship):      # 更新屏幕上的图像,并切换到新屏幕
    # 每次循环时都重绘屏幕
    screen.fill(ai_setting.bg_color)
    ship.blitme()
    # 让最近绘制的屏幕可见
    pygame.display.flip()

 对于在限制范围内的左右移动,首先要解决的是左右移动问题,我们要在ship.py的Shi类中设置一个移动标志

self.moving_right = False

当然,上述代码,只是往右移动的标志,默认为False。当键盘摁下→键时,改变为True,这个代码在上面的check_event()函数中得以体现。然后回到ship.py写移动飞船的函数update(),更新飞船的center值,使其可以移动作为飞船的rect对象。说起来,比较抽象,还是在下面附上更新后的代码。

再附上geng更新后的alien_invasion.py、ship.py、settings.py代码。

特别注意:凡是带02的地方,都是与更新有关的地方!!!

alien_invasion.py更新代码:

# 02 import sys
import pygame
from alien.settings import Setting      # 01
from alien.ship import Ship             # 01
import alien.game_function as gf        # 02


def run_game():          # 初始化游戏,并且创建一个屏幕对象
    pygame.init()        # 初始化背景设置,让Pygame能够正确地工作
    # 01 screen = pygame.display.set_mode((1200, 800))     # 创建一个名为screen 的显示窗口,括号里是元组!!!
    # 01                                                   # 这个游戏的所有图形元素都将在其中绘制
    ai_set = Setting()                                     # 因为导入类而做了代码替换
    screen = pygame.display.set_mode(
        (ai_set.screen_width,ai_set.screen_height)
    )
    # 01 bg_color = (230,230,230)         # 设置背景颜色

    pygame.display.set_caption('外星人入侵')
    # 创建一艘飞船对象
    ship = Ship(ai_set,screen)

    # 为让程序响应事件,我们编写一个事件循环,以侦听事件,并根据发生的事件执行相应的任务。
    while True:  # 游戏的主循环
        # 02 for event in pygame.event.get():    # 监视键盘和鼠标
        # 02     if event.type == pygame.QUIT:   #编写一系列的if 语句来检测并响应特定的事件
        # 02         sys.exit()                  # 我们调用sys.exit() 来退出游戏
        gf.check_event(ship)    # 02
        ship.update()           # 02
        # 01screen.fill(bg_color)                # 每次循环都重绘屏幕
        # 02 screen.fill(ai_set.bg_color)
        # 02 ship.blitme()                       # 调用blitme函数,使飞船出现
        # 02 pygame.display.flip()               # 让最近绘制的屏幕可见
        gf.update_screen(ai_set,screen,ship)     # 02

run_game()

ship.py更新代码:

import pygame


class Ship():
    def __init__(self,ai_setting,screen):         # 初始化飞船,并设置初始位置
        self.screen = screen
        self.ai_setting = ai_setting              # 02
        # 加载飞船图像并获取其外接矩形
        self.img = pygame.image.load('D:\\python\\PyCharm 2016.3.2\\project\\alien\\fei.bmp')
        self.rect = self.img.get_rect()           # 我们使用get_rect() 获取相应surface的属性rect
        self.screen_rect = self.screen.get_rect()

        # 将每艘新飞船放在屏幕底部中央
        # 要将游戏元素居中,可设置相应rect 对象的属性center 、centerx 或centery 。
        self.rect.centerx = self.screen_rect.centerx
        # 要让游戏元素与屏幕边缘对齐,可使用属性top 、bottom 、left 或right ;
        # 要调整游戏元素的水平或垂直位置,可使用属性x 和y ,它们分别是相应矩形左上角的 x 和 y 坐标。
        self.rect.bottom = self.screen_rect.bottom
        # 在飞船的属性center中存储小数数值
        self.center = float(self.rect.centerx)     # 小数形式的位移可以更好的控制飞船移动

        # 移动标志,# 02
        # 飞船不动时,标志moving_right将为False 。
        # 玩家按下右箭头键时,我们将这个标志设置为True ;而玩家松开时,我们将这个标志重新设置为False
        self.moving_right = False
        self.moving_left = False
        self.moving_up = False
        self.moving_down = False

    # 根据移动标志,移动飞船 # 02
    def update(self):
        if self.moving_right and self.rect.right < self.screen_rect.right:      # 控制飞船移动的左右范围
            # 02 self.rect.centerx += 1
            # 02 更新飞船的center值,而不是rect
            self.center += self.ai_setting.ship_speed_factor
        if self.moving_left and self.rect.left > 0:
            # 02 self.rect.centerx -= 1
            self.center -= self.ai_setting.ship_speed_factor

        # 根据self.center更新rect对象
        self.rect.centerx = self.center

    # 我们定义了方法blitme() ,它根据self.rect 指定的位置将图像绘制到屏幕上
    # 在指定位置绘制飞船
    def blitme(self):
        self.screen.blit(self.img,self.rect)    # 把img这个surface对象贴到rect的位置

 settings.py更新代码:

class Setting():            # 存储《外星人入侵》中所有的设置类
    def __init__(self):     # 初始化游戏设置
        self.screen_width = 1200        # 屏幕设置
        self.screen_height = 800
        self.bg_color = (230,230,230)

        self.ship_speed_factor = 1.5    # 02 设置飞船速度

猜你喜欢

转载自blog.csdn.net/qq_35069382/article/details/81222783