http://blog.sysuschool.com/u/mygod/index.html
请稍候,载入中。。。
 
请稍候,载入中。。。
2019/4/13 12:04:00
博文:python之pygame模块(二)


结合飞机游戏,整理下类和类的私有方法。

前篇已述基于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()


mygod | 阅读全文 | 回复(0) | 引用通告 | 编辑
发表评论:
请稍候,载入中。。。
公告
请稍候,载入中。。。
时间记忆
请稍候,载入中。。。
最新日志
请稍候,载入中。。。
最新评论
请稍候,载入中。。。
最新回复
请稍候,载入中。。。
我的好友
我的相册
站点信息
请稍候,载入中。。。
生活因感动而精彩,理想在创造中放飞
Powered by Oblog.