鱼C论坛

 找回密码
 立即注册
查看: 64|回复: 1

[已解决]cocos2d python去除图片显示错误

[复制链接]
发表于 2024-11-26 11:47:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
以下代码意在点击图片后去除该图片及右侧图片,并更新字典。

    raise Exception("Child not found: %s" % str(child))
Exception: Child not found: <cocos.sprite.Sprite object at 0x000000000636DFD0>
import cocos
from cocos.scene import Scene
from cocos.director import director
import pyglet
class GameLayer(cocos.layer.ColorLayer):
    def __init__(self):
        super().__init__(128, 128, 128, 128)
        cocos.layer.Layer.is_event_handler = True
        self.blocks = {}
        for i in range(18):
            bo = cocos.sprite.Sprite('block.png')
            bo.position = 40+32*i, 240
            self.blocks[i]=bo
            self.add(self.blocks[i])
        print(self.blocks)
        print(len(self.blocks))

    def on_mouse_press(self, x, y, button, modifiers):
        if button == pyglet.window.mouse.LEFT:
            x=round((x-40)/32)
            y=round((y-240)/240)
            print('x=',x)
            for key in self.blocks:
                if key>=x:
                    self.remove(self.blocks[key])

            for key in self.blocks:
                if key>=x:
                    self.blocks.pop(key)
            print(self.blocks)
            print(len(self.blocks))

def main():
    director.init()
    scene = Scene()
    scene.add(GameLayer(), z=0)
    director.run(scene)

if __name__ == "__main__":
    main()
最佳答案
2024-11-26 11:47:58
问题出在代码中对`self.blocks`的处理上。`self.blocks`被定义为一个字典,但在循环中被赋值为一个`Sprite`对象,这会导致后续的字典操作失败。以下是一些建议来修复这个问题:

1. 确保`self.blocks`是一个字典,并且每个`Sprite`对象都被正确地添加到字典中。

2. 在`on_mouse_press`方法中,确保在移除`Sprite`对象时,字典的键和值都被正确处理。

以下是修正后的代码片段:
import cocos
from cocos.scene import Scene
from cocos.director import director
import pyglet

class GameLayer(cocos.layer.ColorLayer):
    def __init__(self):
        super().__init__(128, 128, 128, 128)
        cocos.layer.Layer.is_event_handler = True
        self.blocks = {}
        for i in range(18):
            bo = cocos.sprite.Sprite('block.png')
            bo.position = 40 + 32 * i, 240
            self.blocks[i] = bo  # 使用字典存储Sprite对象
            self.add(bo)
        print(self.blocks)
        print(len(self.blocks))

    def on_mouse_press(self, x, y, button, modifiers):
        if button == pyglet.window.mouse.LEFT:
            x = round((x - 40) / 32)
            y = round((y - 240) / 240)
            print('x=', x)
            keys_to_remove = [key for key in self.blocks if key >= x]
            for key in keys_to_remove:
                self.remove(self.blocks[key])
                del self.blocks[key]
            print(self.blocks)
            print(len(self.blocks))

def main():
    director.init()
    scene = Scene()
    scene.add(GameLayer(), z=0)
    director.run(scene)

if __name__ == "__main__":
    main()

在这个修正中,`self.blocks`被正确地初始化为一个字典,并且每个`Sprite`对象都被存储在字典中。`on_mouse_press`方法中,使用列表推导式来收集需要移除的键,然后在循环中移除这些键对应的`Sprite`对象。


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-11-26 11:47:58 | 显示全部楼层    本楼为最佳答案   
问题出在代码中对`self.blocks`的处理上。`self.blocks`被定义为一个字典,但在循环中被赋值为一个`Sprite`对象,这会导致后续的字典操作失败。以下是一些建议来修复这个问题:

1. 确保`self.blocks`是一个字典,并且每个`Sprite`对象都被正确地添加到字典中。

2. 在`on_mouse_press`方法中,确保在移除`Sprite`对象时,字典的键和值都被正确处理。

以下是修正后的代码片段:
import cocos
from cocos.scene import Scene
from cocos.director import director
import pyglet

class GameLayer(cocos.layer.ColorLayer):
    def __init__(self):
        super().__init__(128, 128, 128, 128)
        cocos.layer.Layer.is_event_handler = True
        self.blocks = {}
        for i in range(18):
            bo = cocos.sprite.Sprite('block.png')
            bo.position = 40 + 32 * i, 240
            self.blocks[i] = bo  # 使用字典存储Sprite对象
            self.add(bo)
        print(self.blocks)
        print(len(self.blocks))

    def on_mouse_press(self, x, y, button, modifiers):
        if button == pyglet.window.mouse.LEFT:
            x = round((x - 40) / 32)
            y = round((y - 240) / 240)
            print('x=', x)
            keys_to_remove = [key for key in self.blocks if key >= x]
            for key in keys_to_remove:
                self.remove(self.blocks[key])
                del self.blocks[key]
            print(self.blocks)
            print(len(self.blocks))

def main():
    director.init()
    scene = Scene()
    scene.add(GameLayer(), z=0)
    director.run(scene)

if __name__ == "__main__":
    main()

在这个修正中,`self.blocks`被正确地初始化为一个字典,并且每个`Sprite`对象都被存储在字典中。`on_mouse_press`方法中,使用列表推导式来收集需要移除的键,然后在循环中移除这些键对应的`Sprite`对象。


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 09:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表