【问题标题】:Creating multiple identical CCSprites创建多个相同的 CCSprite
【发布时间】:2012-11-09 18:29:56
【问题描述】:

是否有一种干净有效的方法来创建任意数量的相同 CCSprite?

我真的只需要一个标签来引用它们以便以后删除。

例如,在我的游戏中,我在 HUD 中显示生命数:

- (void)displayOneLife
{
    CGPoint positionOne = ccp(90, 450);

    CCSprite *life1 = [CCSprite spriteWithFile:@"life.png"];
    [life1 setPosition:positionOne];
    [life1 setScale:0.5f];
    [self addChild:life1 z:5 tag:1];
}

- (void)displayTwoLives
{
    CGPoint positionOne = ccp(90, 450);
    CGPoint positionTwo = ccp(105, 450);

    CCSprite *life1 = [CCSprite spriteWithFile:@"life.png"];
    CCSprite *life2 = [CCSprite spriteWithFile:@"life.png"];

    [life1 setScale:0.5f];
    [life2 setScale:0.5f];

    [life1 setPosition:positionOne];
    [life2 setPosition:positionTwo];

    [self addChild:life1 z:5 tag:1];
    [self addChild:life2 z:5 tag:2];
}

- (void)displayThreeLives
{
    CGPoint positionOne = ccp(90, 450);
    CGPoint positionTwo = ccp(105, 450);
    CGPoint positionThree = ccp(120, 450);

    CCSprite *life1 = [CCSprite spriteWithFile:@"life.png"];
    CCSprite *life2 = [CCSprite spriteWithFile:@"life.png"];
    CCSprite *life3 = [CCSprite spriteWithFile:@"life.png"];

    [life1 setPosition:positionOne];
    [life2 setPosition:positionTwo];
    [life3 setPosition:positionThree];

    [life1 setScale:0.5f];
    [life2 setScale:0.5f];
    [life3 setScale:0.5f];

    [self addChild:life1 z:5 tag:1];
    [self addChild:life2 z:5 tag:2];
    [self addChild:life3 z:5 tag:3];
}

【问题讨论】:

标签: iphone objective-c cocos2d-iphone ccsprite


【解决方案1】:

实际上,CCSprite 的构造函数是在 cocos 的纹理缓存中查找的,如果缓存中已经包含该纹理,则 il 会重用其纹理。所以你可以通过删除 *texture 来进一步简化(我相信这里泄露了),然后使用这样做:

- (void)displayLifes:(int) nrOfLifes
{
    CGPoint position = ccp(90, 450);    

    for(int i = 1 ; i <= nrOfLifes ; i++)
    {
        CCSprite *life = [CCSprite spriteWithFile:@"life.png"];
        [life setPosition:position];
        [life setScale:0.5f];
        [self addChild:life z:5 tag:i];
         position.x += 15;
    }
}

【讨论】:

  • 确实,纹理没有重复,不知道。无论如何,最好避免缓存搜索,所以我仍然认为提供纹理是最佳选择。至于泄漏,我最近习惯了 ARC,感谢您的提醒。干杯!
  • 实际上,他创建自动释放纹理时不会泄漏。
  • 一般情况下是这样,但这个创建者不是自动发布的。通常在 cocos 中,一个 [CCSomething somethingWith:parameters] 是自动释放的。但是 [[CCSomething alloc] initWithParameters:parameters] 不是。
  • 真的吗?))))伙计,你以为我不知道吗?)看看他的例子。他只是在创建后将自动释放发送到此纹理
  • 啊。对不起M,我第一次没看到。实际上,我很少假设谁知道什么,并且您也不应该假设您是该论坛的唯一读者:),尽管您知道很多。这里不是个人的意思
【解决方案2】:

使用您的图像创建一个CCTexture2D,然后使用该纹理初始化所有精灵。 这样你只加载一次图像。

希望这会有所帮助。

编辑:

此外,您可以动态添加它们。像这样:

- (void)displayLifes:(int) nrOfLifes
{
    CGPoint position = ccp(90, 450);
    CCTexture2D *texture = [[[CCTexture2D alloc] initWithImage:[UIImage imageNamed:@"life.png"]]autorelease];

    for(int i = 1 ; i <= nrOfLifes ; i++)
    {
         CCSprite *life = [CCSprite spriteWithTexture:texture];
         [life setPosition:position];
         [life setScale:0.5f];
         [self addChild:life z:5 tag:i];

         position.x += 15;
    }
}

干杯!

【讨论】:

  • 带有纹理的精灵是一个糟糕的构造函数。它会引起问题,例如,当您使用 zwo[tex 或纹理打包器将图像打包到图集中时。所以,你应该接受 YvesLeBorg 的回答,因为这个回答可能会在以后引起问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多