鱼C论坛

 找回密码
 立即注册
查看: 298|回复: 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>
  1. import cocos
  2. from cocos.scene import Scene
  3. from cocos.director import director
  4. import pyglet
  5. class GameLayer(cocos.layer.ColorLayer):
  6.     def __init__(self):
  7.         super().__init__(128, 128, 128, 128)
  8.         cocos.layer.Layer.is_event_handler = True
  9.         self.blocks = {}
  10.         for i in range(18):
  11.             bo = cocos.sprite.Sprite('block.png')
  12.             bo.position = 40+32*i, 240
  13.             self.blocks[i]=bo
  14.             self.add(self.blocks[i])
  15.         print(self.blocks)
  16.         print(len(self.blocks))

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

  25.             for key in self.blocks:
  26.                 if key>=x:
  27.                     self.blocks.pop(key)
  28.             print(self.blocks)
  29.             print(len(self.blocks))

  30. def main():
  31.     director.init()
  32.     scene = Scene()
  33.     scene.add(GameLayer(), z=0)
  34.     director.run(scene)

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

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

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

以下是修正后的代码片段:

  1. import cocos
  2. from cocos.scene import Scene
  3. from cocos.director import director
  4. import pyglet

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

  17.     def on_mouse_press(self, x, y, button, modifiers):
  18.         if button == pyglet.window.mouse.LEFT:
  19.             x = round((x - 40) / 32)
  20.             y = round((y - 240) / 240)
  21.             print('x=', x)
  22.             keys_to_remove = [key for key in self.blocks if key >= x]
  23.             for key in keys_to_remove:
  24.                 self.remove(self.blocks[key])
  25.                 del self.blocks[key]
  26.             print(self.blocks)
  27.             print(len(self.blocks))

  28. def main():
  29.     director.init()
  30.     scene = Scene()
  31.     scene.add(GameLayer(), z=0)
  32.     director.run(scene)

  33. if __name__ == "__main__":
  34.     main()
复制代码


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


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

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

以下是修正后的代码片段:

  1. import cocos
  2. from cocos.scene import Scene
  3. from cocos.director import director
  4. import pyglet

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

  17.     def on_mouse_press(self, x, y, button, modifiers):
  18.         if button == pyglet.window.mouse.LEFT:
  19.             x = round((x - 40) / 32)
  20.             y = round((y - 240) / 240)
  21.             print('x=', x)
  22.             keys_to_remove = [key for key in self.blocks if key >= x]
  23.             for key in keys_to_remove:
  24.                 self.remove(self.blocks[key])
  25.                 del self.blocks[key]
  26.             print(self.blocks)
  27.             print(len(self.blocks))

  28. def main():
  29.     director.init()
  30.     scene = Scene()
  31.     scene.add(GameLayer(), z=0)
  32.     director.run(scene)

  33. if __name__ == "__main__":
  34.     main()
复制代码


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


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-8 04:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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