【问题标题】:cocos2d can't add sprite to another spritecocos2d 无法将精灵添加到另一个精灵
【发布时间】:2016-03-11 20:06:03
【问题描述】:

我有一个从 cocos2d 框架扩展 CCSprite 的背景。我已经将这个精灵添加到了游戏层。现在在这个背景类中,我尝试添加其他名为 Star 的 CCSprites,如下所示:

//create the stars
stars = [[CCArray alloc] init];
for (int i = 0; i < 10; i++) 
{
    Star* star = [[Star alloc ] initWithFile:@"star-hd.png"];
    CGSize screensize = [[CCDirector sharedDirector] winSize];
    //CCLOG(@"screensize: %f, %f", screensize.width, screensize.height);
    CGPoint newstarlocation;
    newstarlocation.x = CCRANDOM_0_1() * screensize.width;
    newstarlocation.y = CCRANDOM_0_1() * screensize.height;
    star.position = newstarlocation;
    [self addChild:star z:i];
    [stars addObject:star];
}

但星星不会显示。我尝试了几件事,唯一似乎有效的是当我在游戏层而不是背景上添加星星时。但这不是我想要的。

cocos2d 中不允许嵌套精灵吗?如果允许,我如何嵌套精灵?

【问题讨论】:

  • 代码似乎正确,尝试使用不同的图像 (star.png) 和固定位置(星星的位置是 相对 (即偏移)到父位置(背景精灵)。最后,将星星添加到自己的数组有什么意义呢?毕竟,您可以只使用添加星星的子数组。如果需要,给它们所有相同的标签以区分其他节点。

标签: cocos2d-iphone ccsprite


【解决方案1】:

你不能嵌套精灵,但你可以(应该)嵌套层。

改为创建一个背景层,将背景精灵和星星精灵添加到其中,并将背景层添加到游戏层之前的场景中。这样一来,您就可以将背景与游戏层分开,并在其他所有事物之后,使用任意数量的精灵。

懒惰的例子(在 C++ 中):

CCLayer *backgroundLayer = CCLayer::create();
CCSprite *skySprite = CCSprite::createWithSpriteFrameName("sky_sprite.png"); 
CCSprite *starsSprite = CCSprite::createWithSpriteFrameName("stars_sprite.png");

backgroundLayer->addChild(skySprite);
backgroundLayer->addChild(starsSprite);

CCLayer *gameLayer = CCLayer::create();

scene->addChild(backgroundLayer);
scene->addChild(gameLayer);    

【讨论】:

    【解决方案2】:

    只是为了进一步阐明 Steffen 的观点(顺便说一下,他拥有最好的 tut 书籍之一)。星星可能不会出现,称它们为“star-hd.png”。相反,您应该参考“star.png”。 Cocos2d 会自动在您的图像上查找后缀 '-hd' 和 '-ipad' 以查看哪个图像应该与哪个设备相关联。您可以通过查看 AppDelegate.m 文件来更改程序查找的后缀,您会在该文件中找到此代码。

    suffixes are going to be used
    [sharedFileUtils setiPhoneRetinaDisplaySuffix:@"-hd"];      // Default on iPhone RetinaDisplay is "-hd"
    [sharedFileUtils setiPadSuffix:@"-hd"];                 // Default on iPad is "ipad"
    [sharedFileUtils setiPadRetinaDisplaySuffix:@"-ipadhd"];    // Default on iPad RetinaDisplay is "-ipadhd"
    

    【讨论】:

      【解决方案3】:

      我不明白你为什么要嵌套精灵,不仅如此,它是否非常有效。编写一个包含精灵和子精灵的 Star 类。

      它允许你这样做,因为 cocos2d 喜欢CCNode,几乎所有东西都来源于它。这并不意味着CCSprite 处理绘制他们的孩子。 CCLayerCCSprite 都可以添加 CCNodes。只是它们的处理程序不同。

      在这方面你也会更有效率,因为你可以批量处理精灵,这比直接将精灵绘制到游戏层要高效得多。

      【讨论】: