ydwb 发表于 2024-11-26 11:47:09

cocos2d python去除图片显示错误

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

    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=bo
            self.add(self.blocks)
      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)

            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()

FishC 发表于 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 = 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 =
            for key in keys_to_remove:
                self.remove(self.blocks)
                del self.blocks
            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 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: cocos2d python去除图片显示错误