小学生python游戏编程arcade----碰撞精灵消失问题

news2024/11/28 12:37:40

小学生python游戏编程arcade----碰撞精灵消失问题

    • 前言
    • 碰撞精灵消失问题
      • 1、多余的精灵不能及时消失
        • 1.1 问题
        • 1.2 失败代码
        • 1.3 记录备忘
        • 1.4 代码实现
      • 2、放置位置
        • 2.1 代码放在ondraw中可以
        • 2.2 在update中也可以
        • 2.3 碰撞中
      • 3、玩家子弹击中敌坦克后的爆炸效果
        • 3.1 爆炸类
        • 3.2 爆炸列表准备(setup中)
        • 3.3 碰撞检测中加入后出现如此错误
        • 3.4 代码修改`
        • 3.5 效果
    • 源码获取

前言

在arcade游戏编程中的碰撞精灵消失问题,敌人子弹打中角色后,如有多个子弹,坦克的消失问题分析,动画爆炸效果的实现及过程中注意事项及错误试验分析

碰撞精灵消失问题

1、多余的精灵不能及时消失

1.1 问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 失败代码

失败代码:

        if self.enemy_reset:
            # 重置坦克及子弹
            # for dr in self.scene[LAYER_tanks]:
            #     dr.remove_from_sprite_lists()
            # for zd in self.scene[LAYER_bullet]:
            #     zd.remove_from_sprite_lists()
            #
            # if len(self.scene[LAYER_tanks])>0:
            #     print('重清空坦克')
            #     for dr in self.scene[LAYER_tanks]:
            #         dr.remove_from_sprite_lists()
            #
            # if len(self.scene[LAYER_bullet])>0:
            #     print('重清空')
            #     for zd in self.scene[LAYER_bullet]:
            #         zd.remove_from_sprite_lists()

1.3 记录备忘

在update,draw中都会出现此问题,通过查看scene原码
发现其有个remove_sprite_list_by_name函数,得以解决
def remove_sprite_list_by_name(
self,
name: str,
) -> None:
“”"
Remove a SpriteList by it’s name.

    This function serves to completely remove the SpriteList from the Scene.

    :param str name: The name of the SpriteList to remove.
    """
    sprite_list = self.name_mapping[name]
    self.sprite_lists.remove(sprite_list)
    del self.name_mapping[name]

1.4 代码实现

        if self.enemy_reset:
            # 重置坦克及子弹
            # for dr in self.scene[LAYER_tanks]:
            #     dr.remove_from_sprite_lists()
            # for zd in self.scene[LAYER_bullet]:
            #     zd.remove_from_sprite_lists()
            #
            # if len(self.scene[LAYER_tanks])>0:
            #     print('重清空坦克')
            #     for dr in self.scene[LAYER_tanks]:
            #         dr.remove_from_sprite_lists()
            #
            # if len(self.scene[LAYER_bullet])>0:
            #     print('重清空')
            #     for zd in self.scene[LAYER_bullet]:
            #         zd.remove_from_sprite_lists()
            self.scene.remove_sprite_list_by_name(LAYER_bullet)
            self.scene.remove_sprite_list_by_name(LAYER_tanks)
            self.scene.add_sprite_list_after(LAYER_bullet, 'wj')
            self.scene.add_sprite_list_after(LAYER_tanks, 'wj')
            print('清空后',len(self.scene[LAYER_bullet]))
            print('清空后坦克',len(self.scene[LAYER_tanks]))
            self.setup_enemy()
            self.enemy_reset = False
            return
        else:
            self.scene.draw()  # 摄相机与scence的顺序不能放错,否则不会移动
            for aa in self.scene[LAYER_tanks]:
                aa.draw_word(aa.left, aa.top + 20)

2、放置位置

2.1 代码放在ondraw中可以

    def on_draw(self):
        self.clear()
        self.camera.use()  # 摄象机
        # if self.enemy_reset:
        #     # 重置坦克及子弹
        #     self.scene.remove_sprite_list_by_name(LAYER_bullet)
        #     self.scene.remove_sprite_list_by_name(LAYER_tanks)
        #     self.scene.add_sprite_list_after(LAYER_bullet, 'wj')
        #     self.scene.add_sprite_list_after(LAYER_tanks, 'wj')
        #     self.setup_enemy()
        #     self.enemy_reset = False
        # else:
        self.scene.draw()  # 摄相机与scence的顺序不能放错,否则不会移动
        for aa in self.scene[LAYER_tanks]:
            aa.draw_word(aa.left, aa.top + 20)

2.2 在update中也可以

    def on_update(self, delta_time: float):
        self.physics_engine.update()  # 运用引擎移动角色
        self.collision_all()

        self.update_remind()
        self.scene['wj'].update()
        
        if self.enemy_reset:
            # 重置坦克及子弹
            self.scene.remove_sprite_list_by_name(LAYER_bullet)
            self.scene.remove_sprite_list_by_name(LAYER_tanks)
            self.scene.add_sprite_list_after(LAYER_bullet, 'wj')
            self.scene.add_sprite_list_after(LAYER_tanks, 'wj')
            self.setup_enemy()
            self.enemy_reset = False

        self.scene[LAYER_bullet].update()
        self.scene[LAYER_explosions].update()

最终先确定放在碰撞中吧

2.3 碰撞中

    # 碰撞检测
    def collision_all(self):
        self.collision_bullet_enemy()
        self.collision_bullet_player()
        if self.enemy_reset:
            # 重置坦克及子弹
            self.scene.remove_sprite_list_by_name(LAYER_bullet)
            self.scene.remove_sprite_list_by_name(LAYER_tanks)
            self.scene.add_sprite_list_after(LAYER_bullet, 'wj')
            self.scene.add_sprite_list_after(LAYER_tanks, 'wj')
            self.setup_enemy()
            self.enemy_reset = False

3、玩家子弹击中敌坦克后的爆炸效果

3.1 爆炸类

# 爆炸动画
class Explosion(arcade.Sprite):
    """ 爆炸动画 """

    def __init__(self, texture_list):
        super().__init__()

        #开始的第一幁
        self.current_texture = 0
        self.textures = texture_list

    def update(self):
        # 更新到动画的下一帧。如果我们到了终点,然后删除这个精灵。
        self.current_texture += 1
        if self.current_texture < len(self.textures):
            self.set_texture(self.current_texture)
        else:
            self.remove_from_sprite_lists()

3.2 爆炸列表准备(setup中)

    # 爆炸
    self.setup_explosion_piclist()
    self.explosions_list = arcade.SpriteList()
    同时在ondraw中增加
            self.explosions_list.draw()

3.3 碰撞检测中加入后出现如此错误

在这里插入图片描述

                    # 爆炸(动画效果)
    def baozha(self,hit_list):
        # 制造爆炸
        explosion = Explosion(self.explosion_texture_list)

        # 位置
        explosion.center_x = hit_list[0].center_x
        explosion.center_y = hit_list[0].center_y

        # 更新爆炸
        explosion.update()

        # 添加列表
        self.explosions_list.append(explosion)
                
                for cc in hit_list:
                    if (self.scene[LAYER_tanks] in cc.sprite_lists):
                        # 磁撞的是敌人 根据子弹伤害及敌人生命值确定争分数及消失
                        cc.remove_from_sprite_lists()
                        # 声音
                        arcade.play_sound(self.hit_sound1)
                        # 爆炸效果
                        self.baozha(hit_list)

3.4 代码修改`

增加# 调用更新
self.scene[LAYER_bullet_player].update()
self.explosions_list.update()

这句很关健

    def collision_bullet_player(self):
        # 调用更新
        ***self.scene[LAYER_bullet_player].update()
        self.explosions_list.update()***
        # 子弹的碰撞检测
        for bullet in self.scene[LAYER_bullet_player]:
            hit_list = arcade.check_for_collision_with_lists(
                bullet,
                [
                    self.scene[LAYER_tanks],
                    # self.scene[LAYER_tree],
                    self.scene['建筑物'],
                ],
            )

            if hit_list:
                bullet.remove_from_sprite_lists()

                for cc in hit_list:
                    if (self.scene[LAYER_tanks] in cc.sprite_lists):
                        # 磁撞的是敌人 根据子弹伤害及敌人生命值确定争分数及消失
                        cc.remove_from_sprite_lists()
                        # 声音
                        arcade.play_sound(self.hit_sound1)
                        # 爆炸效果
                        self.baozha(hit_list)

                        if cc.hz == self.key:
                            self.score += 100
                            self.wanjia.bullets +=5
                            self.enemy_reset = True

                        else:
                            self.wanjia.life -= 2
                            print('打错了')



                    if (self.scene['建筑物'] in cc.sprite_lists):
                        # 磁撞的是建筑物,  制造爆炸
                        for i in range(20):
                            particle = Particle(self.scene[LAYER_explosions])
                            particle.position = cc.position  # 粒子位置,也即敌人位置
                            self.scene[LAYER_explosions].append(particle)

                        smoke = Smoke(30)
                        smoke.position = cc.position  # 烟雾位置
                        self.scene[LAYER_explosions].append(smoke)

                        cc.remove_from_sprite_lists()

                        # 爆炸声音
                        arcade.sound.play_sound(self.hit_sound2)
                return

            # 如过子弹超过屏幕则删掉.
            if (bullet.right < 0) or (bullet.bottom > SCREEN_height) or (
                    bullet.left > (self.tile_map.width * self.tile_map.tile_width) * TILE_Scaling) :
                bullet.remove_from_sprite_lists()

3.5 效果

在这里插入图片描述

源码获取

关注博主后,私聊博主免费获取
需要技术指导,育娃新思考,企业软件合作等更多服务请联系博主

今天是以此模板持续更新此育儿专栏的第 29/50次。
可以关注我,点赞我、评论我、收藏我啦。

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

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

相关文章

2022年铁路行业研究报告

第一章 行业概况 铁路运输是主要的陆上交通运输方式之一&#xff0c;铁路是指在综合交通运输体系中&#xff0c;用于运行火车等交通工具行驶的轨道线路。铁路运输是主要的陆上交通运输方式之一&#xff0c;是通过机车牵引车辆组成列车在铁轨上运送客或货的一种运输方式。相比其…

AVL双旋转思路分析与图解

AVL树双旋转思路分析与图解 首先我们要知道什么情况之下我们是要进行双旋转? 当最小不平衡子树为LR型或者RL型的时候, 那么什么时候最小不平衡子树是RL型或者什么时候又是LR型的? 下面我们就先给出LR型, RL型, LL型, RR型最小不平衡子树的概念: LR型最小不平衡子树: 首先拿…

Linux 动静态库

目录 静态库和动态库 gcc规则使用动静态库的规则&#xff1a; 制作静态库 使用静态库 方法1. 方法2. 制作动态库 使用动态库 方法1&#xff1a; 方法2&#xff1a; 方法3&#xff1a; 方法4&#xff1a; 进程&#xff0c;静态库&#xff0c;动态库 静态库和动态库 …

传统瀑布模型和实际瀑布模型

传统瀑布模型&#xff1a; 瀑布模型是所有模型的基础框架 特点&#xff1a; 线性的开发流程&#xff0c;不能够应对需求的变化。 必须等前一阶段的工作完成后&#xff0c;才能开始后一阶段的工作 前一阶段的输出文档就是后一阶段的输入文档&#xff0c;因此只有前一阶段的输…

Map及其实现类、锁

HashMap、HashTable、ConcurrentHashMap 区别 一.HashMap和HashTable的区别 1、两者父类不同 HashMap是继承自AbstractMap类&#xff0c;而Hashtable是继承自Dictionary类。不过它们都实现了同时实现了map、Cloneable&#xff08;可复制&#xff09;、Serializable&#xff0…

朱松纯教授场景理解相关文章简介

朱松纯教授场景理解相关文章简介 Holistic 3D Scene Parsing and Reconstruction from a Single RGB Image 基于单张图像的整体场景解译与重建 我们提出了一个计算框架来联合解译单帧RGB图像&#xff0c;通过使用一系列的随机语法模型生成的CAD模型构成整体的3D结构。具体地说…

智慧农业SaaS系统

真正的大师,永远都怀着一颗学徒的心&#xff01; 一、项目简介 智慧农业SaaS系统 二、实现功能 监控管理&#xff1a;支持海康摄像头监控。 用户管理&#xff1a;支持用户是系统操作者&#xff0c;该功能主要完成系统用户配置。 岗位管理&#xff1a;支持配置系统用户所属担…

bugku渗透测试 1 writeup(无需VPS)

靶场地址&#xff1a;BugKu渗透测试1 该靶场只需要20金币就可以开启两小时&#xff0c;算的上非常良心实惠了&#xff0c;趁着有空赶紧刷一刷题目 目录 第一场景&#xff1a; 第二场景&#xff1a; 第三场景&#xff1a; 第四场景&#xff1a; 第五场景&#xff1a; 第六…

第五章:面向对象(上)

第五章&#xff1a;面向对象(上) 5.1&#xff1a;面向过程与面向对象 面向过程(POP)与面向对象(OOP) ​ 二者都是一种思想&#xff0c;面向对象是相对于面向过程而言的。面向过程&#xff0c;强调的是功能行为&#xff0c;以函数为最小值&#xff0c;考虑怎么做。面向对象&…

【BOOST C++ 线程】boost::thread库的基本使用方法总结

一、说明 boost::thread的六种使用方法总结&#xff0c;本文初步介绍线程的函数、构造、执行的详细解释。 二、boost::thread的几个函数 函数功能join()让主进程等待子线程执行完毕后再继续执行get_id()获得线程的 id 号detach()标线程就成为了守护线程&#xff0c;驻留后台运…

【项目实战:核酸检测平台】第二章 大卸八块

本章目标 完成项目架构设计和数据库结构设计 重点&#xff1a;全是重点 文章目录本章目标总体设计&#xff08;架构设计&#xff09;技术选型部署结构设计工程文档结构设计第一步&#xff1a;项目和模块命名第二步&#xff1a;约定项目工程文件内容第三步&#xff1a;设计文档…

Hadoop高可用环境搭建-HDFSNameNode高可用搭建、Yarn高可用搭建

本文环境搭建的前提条件&#xff1a;JDK、Zookeeper、Hadoop完全分布式环境搭建完成。如果未满足条件且不会搭建&#xff0c;可以前往博主的主页搜索相关文章进行搭建。 目录 一、HDFSNameNode高可用搭建 二、 Yarn高可用搭建 本文主节点hostname&#xff1a;master&#xff0c…

安装semantic segmentation editor

两天啊&#xff0c; 整整两天&#xff0c;知道这两天我是怎么过的吗&#xff1f;&#xff1f;1 步骤概述&#xff08;以下命令行都是在管理员条件下执行&#xff09;1.1 安装choco1.2 安装meteor1.3 安装semantic segmentation editor2过程3 我还是用Ubuntu安装过3.1Window安装…

【Mysql】主从一致

【Mysql】主从一致&#xff08;一&#xff09;主从复制【1】什么是主从复制【2】为什么需要主从复制【3】mysql复制原理【4】具体步骤【5】mysql主从形式【6】具体操作过程&#xff08;1&#xff09;首先在虚拟机服务器上安装mysql&#xff0c;进行简单的配置&#xff08;2&…

力扣(LeetCode)38. 外观数列(C++)

双指针模拟 初始字符串 sss 已给定&#xff0c;根据 sss 构造下一个外观数列 ttt &#xff0c;构造完毕&#xff0c; ststst &#xff0c;循环 n−1n-1n−1 次&#xff0c;构造出一个外观数列。 构造步骤 : 令 jjj 指向当前元素 &#xff0c; kkk 从 jjj 往右&#xff0c;记录…

新库上线 | CnOpenData招聘公司基本信息扩展数据

招聘公司基本信息扩展数据 一、数据简介 线上招聘是指各公司将其岗位需求、工作地点能力要求和薪酬等招聘信息发布在互联网上&#xff0c;供求职者参考&#xff0c;以线上的方式进行招聘。线上招聘网站是通过互联网相关技术&#xff0c;集结这些线上招聘信息&#xff0c;帮助雇…

Linux下自动删除过期备份和自动异地备份的脚本

每天自动删除过期备份 首先编写一个简单的Shell脚本DeleteExpireBackup.sh&#xff1a; 1 2 3 4 5 6 7 #!/bin/bash # 修改需要删除的路径 location"/database/backup/" # 删除最后修改时间为30天以前的备份文件夹 find $location -mtime 30 -type d | xargs rm …

3dmax渲染大图有斑点怎么办?

嗨喽大家好&#xff0c;经常有后台私信问&#xff1a;3dmax渲染大图老是有斑点怎么办&#xff1f;而且斑点有白色的&#xff0c;还有绿色、黑色甚至彩色。怎么去除这些斑点呢&#xff1f; 其实以上的常见的斑点问题&#xff0c;大部分是灯光设置的问题。今天我们便来盘点下下面…

第二章:字节码指令集与解析案例

一、概述执行模型字节码与数据类型字节码指令分类加载与存储指令局部变量压栈指令常量入栈指令出栈装入局部变量表指令算术运算指令代码举例一代码举例二代码举例三&#xff1a;i 和 i 的区别比较指令的说明类型转换指令宽化类型转换(Widening Numeric Conversions)窄化类型转换…

指纹浏览器是什么?可以用来解决跨境电商的什么问题?

如果你是跨境电商中的一员&#xff0c;那我相信你肯定不陌生指纹浏览器吧&#xff01;毕竟指纹浏览器可以说是每个跨境人必备的工具了&#xff0c;更别说它的一系列功能简直是为跨境电商商家量身打造的&#xff01; 龙哥作为跨境老手&#xff0c;对指纹浏览器不要太熟悉&#x…