getChildByTag的问题(cocos2d iPhone)

时间:2011-08-28 22:17:40

标签: iphone tags cocos2d-iphone joystick

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

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

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

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

BTW:没有错误或崩溃。它只是不起作用。

提前致谢。

1 个答案:

答案 0 :(得分: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示例项目)。