我有一个名为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:没有错误或崩溃。它只是不起作用。
提前致谢。
答案 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示例项目)。