小学生python游戏编程arcade----碰撞精灵消失问题
创始人
2024-02-08 05:16:33

小学生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 = Falsereturnelse: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 = Falseself.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 = 0self.textures = texture_listdef update(self):# 更新到动画的下一帧。如果我们到了终点,然后删除这个精灵。self.current_texture += 1if 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_xexplosion.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 += 100self.wanjia.bullets +=5self.enemy_reset = Trueelse:self.wanjia.life -= 2print('打错了')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次。
可以关注我,点赞我、评论我、收藏我啦。

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...