cocos2d无法将精灵添加到另一个精灵

时间:2012-02-13 17:42:28

标签: cocos2d-iphone ccsprite

我有一个从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中不允许嵌套sprite?如果允许,我如何嵌套精灵?

3 个答案:

答案 0 :(得分: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);    

答案 1 :(得分:1)

只是为了进一步澄清斯蒂芬的观点(顺便提一下,那里有最好的书籍之一)。明星可能不会出现称他们为“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"

答案 2 :(得分:-1)

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

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

你也可以更有效率,因为那时你可以精灵批处理,这比直接向游戏层绘制精灵更有效。