python飞机大战系列文章(按顺序)
(一)通过pygame 将自己的图像添加到游戏中
(二)通过pygame让游戏人物 动起来
(三)通过pygame处理用户的鼠标键盘操作(事件和监听
(四)详解pygame中的精灵和精灵组
(五)通过pygame搭建游戏框架
(六)通过pygame让游戏背景图像实现交替滚动
(七)通过pygame来设置飞机大战中 敌机 的速度、位置等
(八)通过pygame来操控游戏人物的移动
(九)通过pygame使游戏人物发射子弹
(十)通过pygame来进行碰撞检测


文章目录

  • 英雄发射子弹需求
  • 所用技巧
  • 定义子弹类
  • 一次发射三枚子弹

英雄发射子弹需求

  • 英雄每隔0.5s发射一次子弹,每次连发三枚子弹

所用技巧

因为是每隔0.5秒发射一次子弹,所以可以用pygame中的定时器

  1. 定义定时器常量—eventid
  2. 在初始化方法中,调用set_timer方法设置定时器时间
  3. 在游戏循环中,监听定时器事件

定义子弹类

**初始化方法:**①指定子弹图片 ②初始速度=-2:子弹需要向上飞行

重写update()方法:判断是否飞出屏幕,如果是,从精灵组删除

步骤

  1. 在Hero的初始化方法中,创建子弹精灵组属性
#创建子弹的精灵组
self.bullets = pygame.sprite.Group()
  1. 修改plane_main.py的__update_sprites方法,让子弹精灵组调用update和draw方法
self.hero.bullets.update()
self.hero.bullets.draw(self.screen)
  1. 实现fire()方法:创建子弹精灵;将子弹的初始位置设置在英雄正上方;将子弹添加到精灵组
def fire(self):print("发射子弹")#创建子弹精灵bullet = Bullet()#设置精灵的位置bullet.rect.bottom = self.rect.y - 20bullet.rect.centerx = self.rect.centerx#将精灵添加到精灵组self.bullets.add(bullet)

一次发射三枚子弹

在fire方法中,添加一个循环:

def fire(self):print("发射子弹")for i in (0,1,2):#创建子弹精灵bullet = Bullet()#设置精灵的位置bullet.rect.bottom = self.rect.y - i*20bullet.rect.centerx = self.rect.centerx#将精灵添加到精灵组self.bullets.add(bullet)

至此,plane_sprites.py代码如下:

import random
import pygame#屏幕大小的常量
SCREEN_RECT = pygame.Rect(0,0,480,700)
#刷新的帧率
FRAME_PER_SEC = 60
#创建敌机的定时器常量
CREATE_ENEMY_EVENT = pygame.USEREVENT
#英雄发射子弹事件
HERO_FIRE_EVENT = pygame.USEREVENT + 1class GameSprite(pygame.sprite.Sprite):"""飞机大战游戏精灵"""def __init__(self, image_name, speed=1):#调用父类的初始化方法super().__init__()#定义对象属性self.image = pygame.image.load(image_name)self.rect = self.image.get_rect()self.speed = speeddef update(self):#在屏幕垂直方向上移动self.rect.y += self.speedclass Background(GameSprite):"""游戏背景精灵"""def __init__(self, is_alt=False):# 调用父类方法实现精灵的创建(image/rect/speed)super().__init__("./images/background.png")# 判断是否是交替图像,如果是,需要设置初始位置if is_alt:self.rect.y = -self.rect.heightdef update(self):#调用父类的方法实现:垂直移动super().update()#判断是否移出屏幕,若移出屏幕,应该将图像设置到图像上方if self.rect.y >= SCREEN_RECT.height:self.rect.y = -self.rect.heightclass Enemy(GameSprite):"""敌机精灵"""def __init__(self):#调用父类方法,创建敌机精灵,同时指定敌机图片super().__init__("./images/enemy1.png")#指定敌机的初始随机速度self.speed = random.randint(1,3)#指定敌机的初始随机位置max_x = SCREEN_RECT.width - self.rect.widthself.rect.x = random.randint(0,max_x)def update(self):#调用父类方法,保持垂直方向上的飞行super().update()#判断是否飞出屏幕,如果是,需要从精灵组删除敌机if self.rect.y >= SCREEN_RECT.height:#print("飞出屏幕,需要从精灵组删除")#kill 方法可以将精灵从所有精灵组中移出,精灵就会被自动销毁self.kill()def __del__(self):# print("敌机挂了 %s" %self.rect)passclass Hero(GameSprite):"""英雄精灵"""def __init__(self):#调用父类方法,设置image speedsuper().__init__("./images/me1.png", 0)#设置英雄初始位置self.rect.centerx = SCREEN_RECT.centerxself.rect.bottom = SCREEN_RECT.bottom - 120#创建子弹的精灵组self.bullets = pygame.sprite.Group()def update(self):#英雄在水平方向移动self.rect.x += self.speed#控制英雄不能离开屏幕if self.rect.x < 0:self.rect.x = 0elif self.rect.right > SCREEN_RECT.right:self.rect.right = SCREEN_RECT.rightdef fire(self):print("发射子弹")for i in (0,1,2):#创建子弹精灵bullet = Bullet()#设置精灵的位置bullet.rect.bottom = self.rect.y - i*20bullet.rect.centerx = self.rect.centerx#将精灵添加到精灵组self.bullets.add(bullet)class Bullet(GameSprite):"""子弹精灵"""def __init__(self):#调用父类方法设施子弹图片 初始速度super().__init__("./images/bullet1.png", -2)def update(self):#调用父类方法,让子弹沿垂直方向飞行super().update()#判断子弹是否飞出屏幕if self.rect.bottom < 0:self.kill()def __del__(self):print("子弹被销毁")

plane_main.py代码如下:

import pygame
from plane_sprites import *class PlaneGame(object):"""飞机大战主游戏"""def __init__(self):print("游戏初始化")#创建游戏窗口self.screen = pygame.display.set_mode(SCREEN_RECT.size)#创建游戏的时钟self.clock = pygame.time.Clock()#调用私有方法,精灵和精灵组的创建self.__create_sprites()#设置定时器事件:创建敌机事件pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)pygame.time.set_timer(HERO_FIRE_EVENT, 500)def __create_sprites(self):#创建背景精灵和精灵组bg1 = Background()bg2 = Background(is_alt=True)self.back_group = pygame.sprite.Group(bg1, bg2)#创建敌机的精灵组self.enemy_group = pygame.sprite.Group()#创建英雄的精灵和精灵组self.hero = Hero()self.hero_group = pygame.sprite.Group(self.hero)def start_game(self):print("游戏开始")while True:#设置刷新帧率self.clock.tick(FRAME_PER_SEC)#事件监听self.__event_handler()#碰撞检测self.__check_collide()#更新/绘制精灵组self.__update_sprites()#更新显示pygame.display.update()def __event_handler(self):for event in pygame.event.get():#判断是否退出游戏if event.type == pygame.QUIT:PlaneGame.__game_over()elif event.type == CREATE_ENEMY_EVENT:#print("敌机出场")#创建敌机精灵enemy = Enemy()#将敌机精灵添加到敌机精灵组self.enemy_group.add(enemy)elif event.type == HERO_FIRE_EVENT:self.hero.fire()#使用键盘提供的方法获取键盘按键 --按键元组keys_pressed = pygame.key.get_pressed()#判断元组中对应的按键索引值 1if keys_pressed[pygame.K_RIGHT]:self.hero.speed = 2elif keys_pressed[pygame.K_LEFT]:self.hero.speed = -2else:self.hero.speed = 0def __check_collide(self):passdef __update_sprites(self):self.back_group.update()self.back_group.draw(self.screen)self.enemy_group.update()self.enemy_group.draw(self.screen)self.hero_group.update()self.hero_group.draw(self.screen)self.hero.bullets.update()self.hero.bullets.draw(self.screen)#没有使用对象属性和类属性,所以定义为静态方法@staticmethoddef __game_over():print("游戏结束")pygame.quit()exit()if __name__ == '__main__':#创建游戏对象game = PlaneGame()#启动游戏game.start_game()

运行结果:

(九)通过pygame使游戏人物发射子弹相关推荐

  1. (二)通过pygame让游戏人物 动起来

    python飞机大战系列文章(按顺序) (一)通过pygame 将自己的图像添加到游戏中 (二)通过pygame让游戏人物 动起来 (三)通过pygame处理用户的鼠标键盘操作(事件和监听 (四)详解 ...

  2. Python学习日记-第二十六天-飞机大战(发射子弹和碰撞检测)

    系列文章目录 1.发射子弹 2.碰撞检测 一.发射子弹 1.1   添加发射子弹事件 Pygame的定时器使用套路非常固定: 定义定时器常量--eventtid 在初始化方法中,调用set_timer ...

  3. python3 pygame的发射子弹自编程序

    这是主程序1.py #1.py主程序 import sys import pygame from settings import Settings from ship import Ship from ...

  4. Python“飞机大战”上下左右移动空格发射子弹

    下载点此去 最后面有运行视频 一.项目背景 作为一名学习计算机的学生,在以往,我认为学习计算机要么就是无所不能的黑客,要么就是能制作出各种软件程序的大神.我选择pygame板块,制作一款能随意更改游戏 ...

  5. pygame 笔记-8 背景音乐子弹音效

    游戏哪能没有音效?这节我们研究下如何加背景音乐,其实也很简单: # 加载背景音乐 pygame.mixer.music.load(music_base_path + "music.mp3&q ...

  6. Python案例:飞船向右发射子弹

    一.功能要求 1.按上下方向键,可以上下移动飞船,但是不能移出上下边界. 2.按空格键,飞船水平向右发射子弹,子弹越出右边界就销毁. 二.案例演示 (一)运行效果 (二)实现步骤 1.创建Python ...

  7. 如何用java让坦克发射子弹_java怎么制作坦克大战

    对于一些小游戏的实现方法是很多小伙伴们都好奇的,也有很多小游戏是由Java而制作的,那么你知道java怎么制作坦克大战吗?接下来的内容中我们就一起去看看吧. 详情请参照注释,这里就不多废话了,实现一下 ...

  8. Python_从零开始学习_(52) 飞机大战_发射子弹

    1.  设计 英雄 和 子弹 类 英雄需求 游戏启动后,  英雄 出现在屏幕的 水平中间 位置,  距离 屏幕底部 120 像素 英雄 每隔 0.5 秒发射一次子弹,  每次 连发三枚子弹 英雄 默认 ...

  9. 27飞机大战_发射子弹

    1.  设计 英雄 和 子弹 类 英雄需求 游戏启动后,  英雄 出现在屏幕的 水平中间 位置,  距离 屏幕底部 120 像素 英雄 每隔 0.5 秒发射一次子弹,  每次 连发三枚子弹 英雄 默认 ...

最新文章

  1. ssh 别名登录小技巧
  2. 寒假每日一题(入门组)【week3 完结】
  3. 猿辅导、作业帮忙“圈钱”,跟谁学、有道、51Talk狂“烧钱”,在线教育钱途在哪?
  4. 京东 你访问的页面需要验证证书_SSL证书安全认证有什么原理?
  5. recycleview 使用详解,添加头部尾部,混合item,侧滑菜单,跳转到指定位置,实现九宫格布局
  6. PyTorch | torch.linspace()创建均分数列张量 | torch.linspace()如何使用?| torch.linspace()使用方法 | torch.linspace例子
  7. 《数据分析实战:基于EXCEL和SPSS系列工具的实践》一3.4 数据量太大了怎么办
  8. Master of Typing 3 for mac (打字大师3)支持m1
  9. python实现判断一个字符串是否是合法IP地址
  10. Unity中屏幕坐标、视口坐标和世界坐标、局部坐标与其之间的相互转换
  11. php中10的几次方,C++中10的几次方怎么表示
  12. stm32学习探究:利用TB6612驱动直流电机
  13. malloc(): smallbin double linked list corrupted:
  14. 反病毒工具-C32ASM
  15. 什么是智能合约安全审计
  16. 支付宝:批量付款到支付宝账户有密接口
  17. 不定式作各种成份和现在分词作各种成份
  18. 微信小程序实现点餐系统
  19. js网页动画,如何做一款高逼格不失真的动画
  20. [luoguP2862] [USACO06JAN]把牛Corral the Cows(二分 + 乱搞)

热门文章

  1. c++提取文件名中数字
  2. “被标记为恶意拓展程序并已被系统阻止安装”解决方法
  3. python的基本数据类型一
  4. 实验三 垃圾邮件分类
  5. Flex事件机制(一)
  6. Git clone来的文件一般保存在哪
  7. 20分钟了解TypeScript
  8. 水果食用大全 -- 果品食疗 - 李
  9. JAVA毕业设计购物网站设计计算机源码+lw文档+系统+调试部署+数据库
  10. 商品管理系统--分类、品牌、属性、商品、价格、图片管理