python外星人入侵小项目(一)
python外星人入侵小项目(二)
重构:模块 game_functions
函数check_events()
我们将首先把管理事件的代码移到一个名为check_events()
的函数中,以简化run_game()
并隔离事件管理循环。通过隔离事件循环,可将事件管理与游戏的其他方面(如 更新屏幕)分离。 将check_events()
放在一个名为game_functions
的模块中:
game_functions.py
import sys
import pygame
def check_events():
"""响应按键和鼠标事件"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
下面来修改alien_invasion.py
,使其导入模块game_functions
,并将事件循环替换为对函数check_events()
的调用:
alien_invasion.py
import sys
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)
while True:
gf.check_events()
# 监视键盘和鼠标事件
for event in pygame.event.get():
if event.type == pygame.QUIT: sys.exit()
# 让最近绘制的屏幕可见
# 每次循环时都重绘屏幕
screen.fill(ai_settings.bg_color)
ship.blitme()
pygame.display.flip()
run_game()
函数 update_screen()
为进一步简化run_game()
,下面将更新屏幕的代码移到一个名为update_screen()
的函数中,并将这个函数放在模块game_functions.py
中:
game_functions.py
import sys
import pygame
def check_events():
"""响应按键和鼠标事件"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
def update_screen(ai_settings, screen, ship):
"""更新屏幕上的图像,并切换到新屏幕"""
# 每次循环时都重绘屏幕
screen.fill(ai_settings.bg_color)
ship.blitme()
# 让最近绘制的屏幕可见
pygame.display.flip()
新函数update_screen()
包含三个形参:ai_settings
、screen
和ship
。现在需要将alien_invasion.py
的while 循环中更新屏幕的代码替换为对函数update_screen()
的调用:
alien_invasion.py
import sys
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)
while True:
gf.check_events()
gf.update_screen(ai_settings,screen,ship)
run_game()