0

我有一个名为 Level1 的场景,它从名为 GameLayer 的层中获取英雄和敌人。我听说这样做的一种有效方法是使用标签并使用 getChildByTag 检索它。我试过这个,但我遇到了很多问题。我正在使用 SneakyInput。在Level1,有一个leftJoystick(用于敌人移动)和一个rightJoystick(用于发射弹丸)。我的 GameLayer 中有一个 addEnemy 和 addHero 方法,我称之为。我提到的一切都有效。

在我的 Level1 场景中,我有一个名为 moveHero 的方法(显然应该用操纵杆移动英雄。)。通过基本调试,我知道问题出在 geteChildByTag 行。我通过NSLog测试了英雄的位置,它说的是0,0。这很奇怪,因为在屏幕上你可以看到英雄。但我也意识到我在调用 addHero 方法时没有使用 getChildByTag。

我希望我在这里很清楚。我已将 GameLayer.h 和 GameLayer.m 上传到 4shared。http://www.4shared.com/file/PqhjoMFy/GameLayer.html

希望你能看看它并指出我正确的方向。

顺便说一句:没有错误或崩溃。它只是不工作。

提前致谢。

4

1 回答 1

0

getChildByTag 永远不会崩溃,它是一个非常漂亮的编码方法,它只是循环遍历对象的子数组并检查是否有任何对象匹配,这样您就不会遇到断言问题。

您的代码存在一些严重问题。

首先..

GameLayer *heroInstance = [[GameLayer alloc] init];
CCSprite *hero = (CCSprite *)[heroInstance getChildByTag:1];
NSLog(@"Hero position X: %f", hero.position.x);
NSLog(@"Hero position Y: %f", hero.position.y);

这永远不会起作用, heroInstance 是一个全新的对象,它没有子对象,而且您刚刚在这里创建了内存泄漏。

你的英雄是 spritesheet 的子元素,它是场景的子元素。

要引用您的孩子,您必须在 spritesheet 上调用 getChildByTag(您可能需要通过在场景中调用 getChildByTag 来引用它。

像这样的东西。

[[self getChildByTag:spritesheet] getChildByTag:hero];

此外,使用枚举,这样您就不必记住某些标签是什么数字(查看 cocos2d 示例项目)。

于 2011-08-30T14:50:36.140 回答