当前位置: 首页 > news >正文

关于制作一个Python小游戏(三)

目录

前言:

在前面我们已经了解过了关于制作pygame的使用和在里面游戏中的简单操作的内容了,今天我们主要讲的就是关于敌机的出现和如何去操控游戏中英雄飞机和敌机的出现

1.敌机的设计:

1.1敌机出场的实现:

1.1.1游戏启动后,每个一秒钟出现一架敌方飞机

1.1.2每架敌机向屏幕下方飞行,飞行速度随机

1.1.3每架敌机出现的水平位置不同(0, 480-敌机宽度)

1.1.4当敌机从屏幕下方飞出,不再飞回屏幕

1.2.定时器:

1..2.1而我们常用pygame.time.set_timer()来定义定时器

1.2.2用set_timer去创建一个事件,在游戏循环中监听这个事件,然后做出响应(每隔一秒钟,创建敌机)

1.2.3 定时器事件的监听:

2.英雄飞机的设计

2.1英雄飞机的出场:

2.1.1外观与动画: 

2.1.2 初始位置:

2.1.3控制方式:

 2.1.4移动边界:

2.1.5 射击与武器系统

2.1.6 碰撞检测:

 2.1.7生命值与死亡判定

结语:今天我先告诉大家关于如何设计敌机,和英雄飞机的前期工作,到后面几篇开始我们就会今日到关于实际代码的操作和运行,以上的内容都是来自于个人学习的成果,也欢迎大家给我提一点建议,或者给我的文章哪里还有问题,也欢迎大家斧正


前言:

在前面我们已经了解过了关于制作pygame的使用和在里面游戏中的简单操作的内容了,今天我们主要讲的就是关于敌机的出现和如何去操控游戏中英雄飞机和敌机的出现

1.敌机的设计:

1.1敌机出场的实现:

首先我们先明确一下需求,这是我们想要敌机达到的效果

1.1.1游戏启动后,每个一秒钟出现一架敌方飞机

1.1.2每架敌机向屏幕下方飞行,飞行速度随机

1.1.3每架敌机出现的水平位置不同(0, 480-敌机宽度)

1.1.4当敌机从屏幕下方飞出,不再飞回屏幕

1.2.定时器:

每隔一段时间,去执行一些代码

1..2.1而我们常用pygame.time.set_timer()来定义定时器

# 设置定时器,每隔1秒触发ID为USEREVENT + 1的事件  
pygame.time.set_timer(USEREVENT + 1, 1) 

1.2.2用set_timer去创建一个事件,在游戏循环中监听这个事件,然后做出响应(每隔一秒钟,创建敌机)

# 设置定时器事件,每隔1000毫秒(1秒)触发一次 
ENEMY_CREATE_EVENT = pygame.USEREVENT + 1  
pygame.time.set_timer(ENEMY_CREATE_EVENT, 1000)  

1.2.3 定时器事件的监听:

pygame中,定时器事件是通过pygame.event.get()函数来监听的,就像监听其他任何事件一样。当定时器到达设定的时间间隔时,它会将一个自定义事件(在这个例子中是ENEMY_CREATE_EVENT)添加到事件队列中。然后,你可以在游戏的主循环中遍历这个事件队列,检查是否有定时器事件被触发,并相应地执行代码 

# 游戏主循环  
running = True  
while running:  # 处理事件队列  for event in pygame.event.get():  if event.type == pygame.QUIT:  running = False  # 检查定时器事件  elif event.type == ENEMY_CREATE_EVENT:  # 创建敌机并添加到列表中  enemies.append(Enemy())  

这里先讲到敌机的设计,接下来就关于英雄飞机,玩家的飞机了

2.英雄飞机的设计

2.1英雄飞机的出场:

先设计好对英雄飞机的操作要求:

2.1.1外观与动画:  

  • 设计一个独特且符合游戏风格的飞机模型。

 

# 设置颜色  
WHITE = (255, 255, 255)  
RED = (255, 0, 0)  
GREEN = (0, 255, 0)  
BLUE = (0, 0, 255)  

2.1.2 初始位置

  • 确定英雄飞机在游戏屏幕上的初始出现位置,通常是屏幕底部中央或稍偏左/右。
  • 设置飞机的初始速度、方向和生命值。

 

  def __init__(self):  # 通过调用函数来实现print('游戏初始化')# 1要创建游戏窗口self.screen = pygame.display.set_mode((480, 700)

2.1.3控制方式

  • 使用键盘方向键或←→↑↓键来控制飞机的上下左右移动。
  • 可以添加特殊按键来控制特殊技能或武器的发射(如鼠标右键发射子弹)。
 # 事件监听def __event_handler(self):# 获取按键keypressed = pygame.key.get_pressed()if keypressed[pygame.K_RIGHT]:  # 右键self.hero.speed = 2  # 将飞机的速度改为2elif keypressed[pygame.K_LEFT]:  # 左键self.hero.speed = -2elif keypressed[pygame.K_UP]:  # 上键self.hero.upanddown = -2elif keypressed[pygame.K_DOWN]:  # 下键self.hero.upanddown = 2

 

 2.1.4移动边界

  • 设置游戏屏幕的边界,确保飞机不会移动到屏幕之外。
  • 当飞机触及屏幕边缘时,应平滑地停止移动或反弹。

 

  def update(self):self.rect.x+=self.speedself.rect.y+=self.upanddown#控制飞机不能离开屏幕if self.rect.x<0:self.rect.x=0elif self.rect.x>480-self.rect.width:self.rect.x=480-self.rect.widthif self.rect.y<0:self.rect.y=0elif self.rect.y>700-self.rect.height:self.rect.y=700-self.rect.height

 

2.1.5 射击与武器系统

  • 设计飞机的射击方式,如连续射击、蓄力射击或特殊技能射击。
  • 确定子弹的速度、伤害值和射击频率。
  • 可以为飞机添加多种武器或升级系统,以增强其攻击力。。
#子弹类
class Bullet(GameSprites):#调用父类方法,设置图片和初始速度def __init__(self):super().__init__('images/bullet1.png',-2)def update(self):#调用父类方法,让子弹沿垂直方向飞行super().update()#飞出屏幕就死掉if self.rect.y<0-self.rect.height:self.kill()#KILL仅仅是把他从精灵组中删除def __del__(self):#直接消除对象,还是内置函数print('子弹被销毁')

 

2.1.6 碰撞检测

  • 实现飞机与敌机或障碍物之间的碰撞检测逻辑。
  • 当发生碰撞时,根据碰撞对象的类型(敌机、障碍物等)执行相应的动作(如减少生命值、触发爆炸效果等)。

 

  # 碰撞检测def __check_collide(self):# 子弹与敌机碰撞ret1 = pygame.sprite.groupcollide(self.hero.bullet_group,self.enemy_group, True, True)if ret1:print(ret1)# 敌机和英雄碰撞ret2 = pygame.sprite.groupcollide(self.enemy_group,self.hero_group, True, True)if len(ret2):pygame.quit()

 2.1.7生命值与死亡判定

  • 设置飞机的初始生命值以及受到伤害时生命值的减少方式。
  • 当生命值耗尽时,触发飞机的死亡动画并结束游戏或重新开始

结语:今天我先告诉大家关于如何设计敌机,和英雄飞机的前期工作,到后面几篇开始我们就会今日到关于实际代码的操作和运行,以上的内容都是来自于个人学习的成果,也欢迎大家给我提一点建议,或者给我的文章哪里还有问题,也欢迎大家斧正

相关文章:

  • Batch Nomalization 迁移学习
  • 【框架学习 | 第一篇】一篇文章读懂MyBatis
  • 2024.1.28 校招 实习 内推 面经
  • 【嵌入式——QT】Model/View
  • 【PHP】PHP通过串口与硬件通讯,向硬件设备发送数据并接收硬件返回的数据
  • 基于Springboot免费搭载轻量级阿里云OSS数据存储库(将本地文本、照片、视频、音频等上传云服务保存)
  • 揭秘共享旅游卡项目变现的6种方式,至少有4种适合创业者!
  • STM32/GD32——I2C通信协议
  • Nodejs web服务器之GET、POST请求初次体验
  • 2024《》
  • 论文研读_多目标部署优化:无人机在能源高效无线覆盖中的应用(ImMOGWO)精简版
  • 100个Linux操作命令和20个常用脚本
  • docker中的具名和匿名挂载
  • MySQL CTEs通用表表达式:进阶学习-递归查询
  • Qt将Unicode转换成UTF8中文
  • idea + plantuml 画流程图
  • JavaScript-Array类型
  • Java编程基础24——递归练习
  • JS实现简单的MVC模式开发小游戏
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • SpringCloud集成分布式事务LCN (一)
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 搭建gitbook 和 访问权限认证
  • 分布式任务队列Celery
  • 关于Java中分层中遇到的一些问题
  • 在electron中实现跨域请求,无需更改服务器端设置
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # Panda3d 碰撞检测系统介绍
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #前后端分离# 头条发布系统
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (26)4.7 字符函数和字符串函数
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C语言)fread与fwrite详解
  • (二)pulsar安装在独立的docker中,python测试
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (六)vue-router+UI组件库
  • (算法)前K大的和
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .form文件_一篇文章学会文件上传
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 反射的使用
  • .net 提取注释生成API文档 帮助文档
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET企业级应用架构设计系列之技术选型
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • @Transactional 详解
  • []C/C++读取串口接收到的数据程序
  • []T 还是 []*T, 这是一个问题