结合飞机游戏,整理下类和类的私有方法。
前篇已述基于pygame.sprite.Sprite类创建GameSprite类,GameSprite类含属性(image、rect、speed)和方法(update()),再基于GameSprite定义子类Hero类、Enemy类、Background类、Bullet类,这些子类根据游戏需求,对__init__()和update()方法进行了重写(继承性重写或完全重写),这些保存到一个文件中plane_sprites.py,在主游戏文件中可以import,这里用from plane_sprites import *,这样调用类时,不用写模块名。
在主游戏文件中,import导入pygame和plane_sprites,定义一个PlaneGame类(基于object)就可以了,貌似都这么干,一个游戏就一个类,不知道多关卡的游戏怎么整的?游戏运行,只要用PlaneGame类创建一个对象,如game=PlaneGame(),然后调用对象的start_game()之类的方法即可,如game.start_game() 。
按python的类结构要求,PlaneGame类中须用__init__(self)方法定义属性,然后定义一堆的方法,这些方法有实例方法(给实例出来的对象调用的),有私有方法(不给实例对象用,只在类中调用的),还有静态方法和类方法(本例有一个game_over方法是静态方法)
一、定义__init__(self)方法(def __init__(self):) 作用就是对游戏初始化(该方法在创建实例对象时自动执行),本例中,该方法中包括创建游戏窗口对象、创建游戏时钟对象(后述)、设置事件定时器(后述)及创建游戏的各种精灵组。其中创建精灵组代码太多,另外写了一个方法,象这种方法不需要在外调用,故了私有方法定义(方法名前加两个下划线),私有__create_sprites(self)方法代码如下: def __create_sprites(self):
# 创建背景精灵和精灵组 bg1 = Background() bg2 = Background(True) self.back_group = pygame.sprite.Group(bg1, bg2)
# 创建敌机的精灵组(开始时空的,用add方法追加) self.enemy_group = pygame.sprite.Group()
# 创建英雄的精灵和精灵组(就一个) self.hero = Hero() self.hero_group = pygame.sprite.Group(self.hero) 在初始化方法中调用即可,如self.__create_sprites()
二、在PlaneGame类中定义的实例方法 在PlaneGame类外调用的方法其实就一个start_game(),运行游戏!
三、在PlaneGame类中定义的私有方法
除了start_game()方法外其他都是私有方法(还有一个静态方法),具体如,start_game方法中设置循环执行的事件触发、碰撞检测、精灵组更新(更新和绘制)方法,都是私有方法,代码如: def start_game(self): print("游戏开始...")
while True: # 1. 设置刷新帧率 self.clock.tick(FRAME_PER_SEC) # 2. 事件监听(私有方法) self.__event_handler() # 3. 碰撞检测(私有方法) self.__check_collide() # 4. 更新/绘制精灵组(私有方法) self.__update_sprites() # 5. 更新显示 pygame.display.update()
四、PlaneGame类中的静态方法 这里就__game_over()方法,用于结束游戏的,用在碰撞检测方法中,发生碰撞时调用该方法,代码如: @staticmethod def __game_over(): print("游戏结束") pygame.quit() exit()
|