马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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()
问题出在代码中对`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 小助理,如未能正确解答您的问题,请继续追问。
|