Python-项目实战--飞机大战-敌机出场(6)

news2024/10/1 9:39:31

目标

  • 使用定时器添加敌机

  • 设计Enemy

1.使用定时器添加敌机

敌机出现出现的规律:

  • 游戏启动后,每隔1秒会出现一架敌机

  • 每架敌机向屏幕下方飞行,飞行速度各不相同

  • 每架敌机出现的水平位置也不尽相同

  • 当敌机从屏幕下方飞出,不会再飞回到屏幕中

1.1定时器

  • pygame中可以使用pygame.time.set_timer()来添加定时器

  • 所谓定时器,就是每隔一段时间,去执行一些动作

set_timer(eventid, milliseconds) -> None
  • set_timer可以创建一个事件

  • 可以在游戏循环事件监听方法中捕获到该事件

  • 第一个参数事件代号需要基于常量pygame.USEREEVENT来指定

  • USEREVENT是一个整数,再增加的事件可以使用USEREVENT + 1指定,依次类推...

  • 第2个参数是事件触发间隔的毫秒值

定时器事件的监听

  • 通过pygame.event.get()可以获取当前时刻所有的事件列表

  • 遍历列表并且判断event.type是否等于eventid,如果相等,表示定时器事件发生

1.2定义并监听创建敌机的定时器事件

pygame定时器使用方法非常固定:

  • 定义定时器常量 -- eventid

  • 初始化方法中,调用set_timer方法设置定时器事件

  • 游戏循环中,监听定时器事件

定义事件

  • plane_sprites.py的顶部定义事件常量

# 创建敌机的定时器常量
CREATE_ENEMY_EVENT = pygame.USEREVENT
class PlaneGame(object):
    """飞机大战主游戏"""

    def __init__(self):
        print("游戏初始化")

        # 1.创建游戏的窗口
        self.screen = pygame.display.set_mode(SCREEN_RECT.size )
        # 2.创建游戏的时钟
        self.clock = pygame.time.Clock()
        # 3.调用私有方法,精灵和精灵组的创建
        self.__create_sprites()

        # 4.设置定时器事件 - 创建敌机 1s
        pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)
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("敌机出场...")

2.设计Enemy类

  • 游戏启动后,每隔1秒出现一架飞机

  • 每架敌机向屏幕下方飞行,飞行速度各不相同

  • 每架敌机出现的水平位置也不尽相同

  • 当敌机从屏幕下方飞出,不会再飞回到屏幕中

初始化方法

  • 指定敌机图片

  • 随机敌机的初始位置初始速度

重写update()方法

  • 判断是否飞出屏幕,如果是,从精灵组删除

2.1敌机类的准备

在plane_sprites.py中添加敌机类
class Enemy(GameSprite):
    """敌机精灵"""

    def __init__(self):

        # 1.调用父类方法,创建敌机精灵,同时指定敌机图片
        super().__init__("./images/enemy1.png")

        # 2.指定敌机的初始随机速度

        # 3.指定敌机的初始随机位

    def update(self):

        # 1.调用父类方法,保持垂直方向的飞行
        super().update()

        # 2.判断是否飞出屏幕,如果是,需要从精灵组删除敌机
        if self.rect.y >= SCREEN_RECT.height:
            print("飞出屏幕,需要从精灵组删除...")

2.2创建敌机

演练步骤

  • __create_sprites,添加敌机精灵组

  • 敌机是定时被创建的,因此在初始化方法中,不需要创建敌机

  • __event_handler,创建敌机,并且添加到精灵组

  • 调用精灵组add方法可以向精灵组添加精灵

  • __update_sprites,让敌机精灵组调用updatedraw方法

演练代码

  • plane_main.py__create_sprites方法中创建敌机精灵组

# 创建敌机的精灵组
self.enemy_group = pygame.sprite.Group()
  • 修改plane_main.py_update_sprites方法

self.enemy_group.update()
self.enemy_group.draw(self.screen)
  • 修改plane_main.py__event_handler方法定时出现敌机

elif event.type == CREATE_ENEMY_EVENT:
    print("敌机出场...")
    # 创建敌机精灵
    enemy = Enemy()

    # 将敌机精灵添加到敌机精灵组
    self.enemy_group.add(enemy)          

2.3随机敌机位置和速度

导入模块

  • 在导入模块时,建议按照以下顺序导入

官方标准模块导入
第三方模块导入
应用程序模块导入
import random
import pygame
  • 修改plane_sprites.py增加random的导入

import random

随机位置

使用pygame.Rect提供的bottom属性,在指定敌机初始位置时,会比较方便

  • bottom = y + height

  • y = bottom - height

代码实现

  • 修改plane_sprites.pyEnemy类的初始化方法

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()方法从所有组中删除

  • 修改plane_sprites.pyEnemy类的update方法

def update(self):

    # 1.调用父类方法,保持垂直方向的飞行
    super().update()

    # 2.判断是否飞出屏幕,如果是,需要从精灵组删除敌机
    if self.rect.y >= SCREEN_RECT.height:
        print("飞出屏幕,需要从精灵组删除...")
        # kill方法可以将精灵从所有精灵组中移出,精灵就会被自动销毁
        self.kill()

内容总结于:https://space.bilibili.com/37974444

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/338307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

常见的历史漏洞之 weblogic+ Thinkphp5

数据来源 本文仅用于信息安全的学习,请遵守相关法律法规,严禁用于非法途径。若观众因此作出任何危害网络安全的行为,后果自负,与本人无关。 01 Weblogic相关介绍 》Weblogic介绍 》Weblogic特征 》历史漏洞 02 Weblogic漏洞利…

代码覆盖率工具OpenCppCoverage在Windows上的使用

OpenCppCoverage是用在Windows C上的开源的代码覆盖率工具,源码地址为https://github.com/OpenCppCoverage/OpenCppCoverage ,最新发布版本为0.9.9.0,License为GPL-3.0。 从https://github.com/OpenCppCoverage/OpenCppCoverage/releases 下载…

python制作贪吃蛇小游戏,畅玩无限制

前言 大家早好、午好、晚好吖 ❤ ~ 现在这年头,无论玩个什么游戏都有健康机制, 这让我们愉悦玩游戏得步伐变得承重起来, 于是无聊之下我写了个贪吃蛇小游戏,来玩个快乐 代码展示 导入模块 import random import sys import …

关于一笔画问题的一些思考(欧拉路Fleury算法、逐步插入回路法、以及另一种可能的解法)

前言这是一个经典的图论问题了最近复习离散的时候又恰好看到了,发现自己以前的解法似乎有点bug然后开始出反例卡自己,结果发现卡不掉?然后再好好想了想,发现这个看起来有问题的做法可能确实没问题。注意:欧拉路、欧拉回…

透射式光电对管测量脉搏硬件电路设计

目录 前言 一、脉搏测量方法 二、脉搏测量原理 2.1 脉搏信号处理整体电路 2.2 信号采集电路 2.3 信号放大电路 2.4 波形整形电路 总结 前言 脉搏测量仪的设计是通过检测心跳的血液变化,产生不同的反射信号,用传感器将脉搏的跳动转换为电信号&…

Servlet实现表白墙

目录 一、表白墙简介 二、代码实现 1、约定前后端交互的接口 2、后端代码实现 3、前端代码实现 三、效果演示 一、表白墙简介 在表白墙页面中包含三个文本框,分别表示表白者,表白对象,表白内容,在文本框中输入内容之后&…

基于Web Speech API给ChatGPT加上语音功能,距离MOSS又近了一步

目录 前言 起步 实现过程 webkitSpeechRecognition speechSynthesis 小例子 遇到的问题 效果展示 总结 前言 去年写了两篇关于接入ChatGPT的文章:微信接入ChatGPT,使用NodeChatGPTWechaty做一个微信机器人_DieHunter1024的博客-CSDN博客 站在巨…

ChatGPT接入个人微信企业微信(国内通用)

ChatGPT近期以强大的对话和信息整合能力风靡全网,可以写代码、改论文、讲故事,几乎无所不能,这让人不禁有个大胆的想法,能否用他的对话模型把我们的微信打造成一个智能机器人,可以在与好友对话中给出意想不到的回应&am…

controller-runtime源码学习

本文基于controller-runtime v0.11.2版本进行源码学习 kubebuilder、operator-sdk这些框架都是在controller-runtime基础上做了一层封装,方便开发者快速生成项目的脚手架,本文会以kuebuilder搭建工程作为使用controller-runtime的demo进行源码分析 1、k…

paddle表情识别部署

表情识别模块1.环境部署1.1同样采用fastDeploy库1.2相关模型2.封装成静态库2.1参考[百度Paddle中PP-Mattingv2的部署并将之封装并调用一个C静态库](https://blog.csdn.net/weixin_43564060/article/details/128882099)2.2项目依赖添加2.3生成成功3.test3.1创建emotion_test项目…

多传感器融合定位十二-基于图优化的建图方法其一

多传感器融合定位十二-基于图优化的建图方法其一1. 基于预积分的融合方案流程1.1 优化问题分析1.2 预积分的作用1.3 基于预积分的建图方案流程2. 预积分模型设计3. 预积分在优化中的使用3.1 使用方法3.2 残差设计3.3 残差雅可比的推导3.3.1 姿态残差的雅可比3.3.2 速度残差的雅…

Python3.10新特性之match语句示例详解

这篇文章主要为大家介绍了Python3.10新特性之match语句示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪正文在Python 3.10发布之前,Python是没有类似于其他语言中switch语句的&…

Clip-path实现按钮流动边框动画

前言 &#x1f44f;Clip-path实现按钮流动边框动画&#xff0c;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现步骤 添加div标签 <div>苏苏_icon</div>添加样式 div {position: relative;width: 220px;height: 6…

1947抓住那头牛(队列 广度优先搜索)

目录 题目描述 解析 解题思路 代码部分 代码部分 运行结果 看看len数组中各个位置的标记值 为什么这样做一定是最短路径&#xff1a; 题目描述 农夫知道一头牛的位置&#xff0c;想要抓住它。农夫和牛都位于数轴上&#xff0c;农夫起始位于点N(0<N<100000)&…

Java八股文(Java面试题)

JDK、JRE、JVM 三者之间的关系&#xff1f;JDK&#xff08;Java Development Kit&#xff09;&#xff1a;是Java开发工具包&#xff0c;是整个Java的核心&#xff0c;包括了Java运行环境JRE、Java工具和Java基础类库。它能够创建和编译程序。JRE&#xff08;Java Runtime Envi…

MySQL-字符集和比较规则

在计算机中只能存储二进制数据&#xff0c;那该怎么存储字符串呢&#xff1f;当然是建立字符与二进制数据的映射关系 了&#xff0c;建立这个关系最起码要搞清楚两件事&#xff1a; 界定清楚字符范围&#xff1a;需要把哪些字符映射成二进制数据&#xff1f;编码与解码&#x…

九龙证券|外资强势出手!这只科创板百元股,被疯狂加仓

本周&#xff0c;北上资金净买入29.32亿元&#xff0c;连续第13周加仓A股。分商场看&#xff0c;北上资金加仓重点倾向于沪市的白马蓝筹股&#xff0c;沪股通取得50.34亿元&#xff0c;深股通则被净卖出21.02亿元。 食品饮料本周取得逾23亿元的增持&#xff0c;居职业首位&…

leaflet 读取上传的geojson文件,转换为wkt文件(057)

第057个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中上传geojson文件,解析geojson文件并转换为WKT,并在地图上显示图片。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共128行)安装 @terraf…

软件测试/自动化测试/测试开发/性能测试经典好书推荐

目录 前言 测试理论与实践 性能测试 安全测试 自动化测试 编程语言与开发技能 管理技能 前言 软件测试入行容易进阶难。从测试小白成长为测试经理、总监级别人才&#xff0c;要跨越长长的技术栈升级之路&#xff0c;挑战非常高的综合能力要求。 大牛都是相似的&#xf…

五分钟看懂Java字节码:极简手册

字节码新手很容易被厚厚的 JVM 书籍劝退&#xff0c;即使我看过相关书籍&#xff0c;工作真正用到时也全忘了&#xff0c;还得现学。 等我有了一定的字节码阅读经验&#xff0c;才发现字节码其实非常简单&#xff0c;只需要三步就能快速学会&#xff1a; 先了解 JVM 的基本结…