python飞机大战pygame游戏之敌机出场实现方法详解
本文实例讲述了python飞机大战pygame游戏之敌机出场实现方法。分享给大家供大家参考,具体如下:
目标
使用定时器添加敌机
- 设计Enemy类
01.使用定时器添加敌机
运行备课代码,观察敌机的出现规律:
- 游戏启动后,每隔1秒会出现一架敌机
- 每架敌机向屏幕下方飞行,飞行速度各不相同
- 每架敌机出现的水平位置也不尽相同
- 当敌机从屏幕下方飞出,不会再飞回到屏幕中
1.1定时器
- 在pygame中可以使用pygame.time.set_timer()来添加定时器
- 所谓定时器,就是每隔一段时间,去执行一些动作
set_timer(eventid,milliseconds)->None
- set_timer可以创建一个事件
- 可以在游戏循环的事件监听方法中捕获到该事件
- 第1个参数事件代号需要基于常量pygame.USEREVENT来指定
- USEREVENT是一个整数,再增加的事件可以使用USEREVENT+1指定,依次类推…
- 第2个参数是事件触发间隔的毫秒值
定时器事件的监听
- 通过pygame.event.get()可以获取当前时刻所有的事件列表
- 遍历列表并且判断event.type是否等于eventid,如果相等,表示定时器事件发生
1.2定义并监听创建敌机的定时器事件
pygame的定时器使用套路非常固定:
- 定义定时器常量——eventid
- 在初始化方法中,调用set_timer方法设置定时器事件
- 在游戏循环中,监听定时器事件
1)定义事件
- 在plane_sprites.py的顶部定义事件常量
#敌机的定时器事件常量 CREATE_ENEMY_EVENT=pygame.USEREVENT
在PlaneGame的初始化方法中创建用户事件
#4.设置定时器事件-每秒创建一架敌机 pygame.time.set_timer(CREATE_ENEMY_EVENT,1000)
2)监听定时器事件
- 在__event_handler方法中增加以下代码:
def__event_handler(self): foreventinpygame.event.get(): #判断是否退出游戏 ifevent.type==pygame.QUIT: PlaneGame.__game_over() elifevent.type==CREATE_ENEMY_EVENT: print("敌机出场...")
02.设计Enemy类
- 游戏启动后,每隔1秒会出现一架敌机
- 每架敌机向屏幕下方飞行,飞行速度各不相同
- 每架敌机出现的水平位置也不尽相同
- 当敌机从屏幕下方飞出,不会再飞回到屏幕中
- 初始化方法
- 指定敌机图片
- 随机敌机的初始位置和初始速度
- 重写update()方法
- 判断是否飞出屏幕,如果是,从精灵组删除
2.1敌机类的准备
- 在plane_sprites新建Enemy继承自GameSprite
- 重写初始化方法,直接指定图片名称
- 暂时不实现随机速度和随机位置的指定
- 重写update方法,判断是否飞出屏幕
classEnemy(GameSprite): """敌机精灵""" def__init__(self): #1.调用父类方法,创建敌机精灵,并且指定敌机的图像 super().__init__("./images/enemy1.png") #2.设置敌机的随机初始速度 #3.设置敌机的随机初始位置 defupdate(self): #1.调用父类方法,让敌机在垂直方向运动 super().update() #2.判断是否飞出屏幕,如果是,需要将敌机从精灵组删除 ifself.rect.y>=SCREEN_RECT.height: print("敌机飞出屏幕...")
2.2创建敌机
演练步骤
- 在__create_sprites,添加敌机精灵组
- 敌机是定时被创建的,因此在初始化方法中,不需要创建敌机
- 在__event_handler,创建敌机,并且添加到精灵组
- 调用精灵组的add方法可以向精灵组添加精灵
- 在__update_sprites,让敌机精灵组调用update和draw方法
演练代码
- 修改plane_main的__create_sprites方法
#敌机组 self.enemy_group=pygame.sprite.Group()
修改plane_main的__update_sprites方法
self.enemy_group.update() self.enemy_group.draw(self.screen)
定时出现敌机
elifevent.type==CREATE_ENEMY_EVENT: self.enemy_group.add(Enemy())
2.3随机敌机位置和速度
- 导入模块
- 在导入模块时,建议按照以下顺序导入
1.官方标准模块导入 2.第三方模块导入 3.应用程序模块导入
修改plane_sprites.py增加random的导入
importrandom
使用pygame.Rect提供的bottom属性,在指定敌机初始位置时,会比较方便
- bottom=y+height
- y=bottom-height
- 修改初始化方法,随机敌机出现速度和位置
def__init__(self): #1.调用父类方法,创建敌机精灵,并且指定敌机的图像 super().__init__("./images/enemy1.png") #2.设置敌机的随机初始速度1~3 self.speed=random.randint(1,3) #3.设置敌机的随机初始位置 self.rect.bottom=0 max_x=SCREEN_RECT.width-self.rect.width self.rect.x=random.randint(0,max_x)
2.4移出屏幕销毁敌机
- 敌机移出屏幕之后,如果没有撞到英雄,敌机的历史使命已经终结
- 需要从敌机组删除,否则会造成内存浪费
检测敌机被销毁
- del内置方法会在对象被销毁前调用,在开发中,可以用于判断对象是否被销毁
def__del__(self): print("敌机挂了%s"%self.rect)
代码实现
判断敌机是否飞出屏幕,如果是,调用kill()方法从所有组中删除
defupdate(self): super().update() #判断敌机是否移出屏幕 ifself.rect.y>=SCREEN_RECT.height: #将精灵从所有组中删除 self.kill()
更多关于Python相关内容可查看本站专题:《Python游戏开发技巧总结》、《Python数据结构与算法教程》、《PythonSocket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。