前言
事件函数部分最后总结了一下,实际上我们能需要调用的函数也就这几个:
- check_events:检查键鼠事件
- update_bullets:子弹更新
- update_aliens:外星人更新
- update_screen:屏幕更新
主函数
首先上面的我们都需要,不需要写它干什么, 然后我们在主函数中添加一个飞船更新即可,至于记分牌和按钮则是在屏幕更新中实现。
只不过我们需要注意一下,子弹、外星人和飞船更新都是在游戏状态为开始时才需要更新。
# 开始游戏的主循环
while True:
gf.check_events(ai_setting,screen,stats,sb,play_button,Ship,aliens,bullets)
if stats.game_active:
Ship.update()
#先更新子弹再更新外星人,目的是判断是否能装撞上
gf.update_bullets(ai_setting,screen,stats,sb,Ship,aliens,bullets)
gf.update_aliens(ai_setting,stats,screen,sb,Ship,aliens,bullets)
gf.update_screen(ai_setting,screen,stats,sb,Ship,aliens,bullets,play_button)
另外我们需要对写好的类进行创建,以及创建屏幕这样的问题:
# 初始化游戏并创建一个屏幕对象
pygame.init()
screen = pygame.display.set_mode((ai_setting.screen_width, ai_setting.screen_height))#参数是一个元组,宽度&高度
pygame.display.set_caption("Alien Invasion")
#创建设置类
ai_setting = setting()
#创建一个按钮
play_button = Button(ai_setting,screen,"Play")
#创建一个用于存储游戏统计信息的实例
stats = GameStats(ai_setting)
#创建记分牌
sb = Scoreboard(ai_setting,screen,stats)
#创建一个飞船
Ship = ship(ai_setting,screen)
#创建子弹编组
bullets = Group()
#创建一个外星人编组
aliens = Group()
#创建外星人,因为最开始我们没法通过其他函数调用create_fleet
gf.create_fleet(ai_setting,stats,screen,Ship,aliens)
然后再加上开始的文件导入,主函数就成了:
import pygame #负责建立游戏
from pygame.sprite import Group
from setting import setting #屏幕对象设置
from ship import ship #飞船的类
from alien import Alien #外星人的类
from game_stats import GameStats
from button import Button
from Scoreboard import Scoreboard
import game_functions as gf #控制退出等操作
def run_game():
# 初始化游戏并创建一个屏幕对象
pygame.init()
ai_setting = setting()
screen = pygame.display.set_mode((ai_setting.screen_width, ai_setting.screen_height))#参数是一个元组,宽度&高度
pygame.display.set_caption("Alien Invasion")
#创建一个按钮
play_button = Button(ai_setting,screen,"Play")
#创建一个用于存储游戏统计信息的实例
stats = GameStats(ai_setting)
#创建记分牌
sb = Scoreboard(ai_setting,screen,stats)
#创建一个飞船
Ship = ship(ai_setting,screen)
#创建子弹编组
bullets = Group()
#创建一个外星人编组
aliens = Group()
#创建外星人
gf.create_fleet(ai_setting,stats,screen,Ship,aliens)
# 开始游戏的主循环
while True:
gf.check_events(ai_setting,screen,stats,sb,play_button,Ship,aliens,bullets)
if stats.game_active:
Ship.update()
#先更新子弹再更新外星人,目的是判断是否能装撞上
gf.update_bullets(ai_setting,screen,stats,sb,Ship,aliens,bullets)
gf.update_aliens(ai_setting,stats,screen,sb,Ship,aliens,bullets)
gf.update_screen(ai_setting,screen,stats,sb,Ship,aliens,bullets,play_button)
run_game()
不过在这时,却显示了一个报错,找不到图像文件,所以没办法我将相对路径改为绝对路径。
如果有这个问题的小伙伴也可以改一下,问题就能解决了。
结束了?
目前我已经将外星人游戏项目整体讲解了一遍,加深了整体的印象。
对于多个文件的py项目,我得到了以下的几个重点:
- 对于游戏中的元素,我们应当创建类,同时类中的方法应当为针对单一类的方法。比如alien类要创建多个对象,我们就不应该将多个对象的方法写在这里;子弹和外星人的碰撞事件也不应该在这里
- 对于游戏的事件部分,每一个函数应当实现一个功能就行了,重构对于后期的二次开发是很重要的。
- 大型项目(虽然这个还不算大)一定要想明白有什么东西,然后在开始写;开始只写一个简单的功能,然后不断往上叠加,不能好高骛远,想着一遍成。(另一个系列的Verilog小游戏,当时就想着一遍成,然后有一个模块重写了无数遍,天天熬夜脱发)
基本上就这样了。
结束了,再来一次
在后面的博客中,我将对一些比较好的点子进行实现,比如大子弹、声音特效,还有将一些不合适的地方进行重构。