0

在 ch08 中潜入“用 ios5 学习 cocos2d 游戏开发”时

EnemyCache.m

-(id) init
{
    if ((self = [super init]))
    {
        // get any image from the Texture Atlas we're using
        CCSpriteFrame* frame = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"monster-a.png"];
        batch = [CCSpriteBatchNode batchNodeWithTexture:frame.texture];
        [self addChild:batch];

        [self initEnemies];
        [self scheduleUpdate];
    }

    return self;
}

所以批次是纹理“monster-a.png”

inEnemyEntity.minitWithType方法

switch (type)
{
    case EnemyTypeUFO:
        enemyFrameName = @"monster-a.png";
        bulletFrameName = @"shot-a.png";
        break;
    case EnemyTypeCruiser:
        enemyFrameName = @"monster-b.png";
        bulletFrameName = @"shot-b.png";
        shootFrequency = 1.0f;
        initialHitPoints = 3;
        break;
    case EnemyTypeBoss:
        enemyFrameName = @"monster-c.png";
        bulletFrameName = @"shot-c.png";
        shootFrequency = 2.0f;
        initialHitPoints = 15;
        break;

    default:
        [NSException exceptionWithName:@"EnemyEntity Exception" reason:@"unhandled enemy type" userInfo:nil];
}

if ((self = [super initWithSpriteFrameName:enemyFrameName]))
{
    //...
}

所以返回的对象可能在 3 个不同的帧中。由于只有包含在该纹理中的 CCSprites 才能添加到 CCSpriteBatchNode中,显然 'monster-b.png' 不包含在 'monster-a.png' 中,为什么仍然可以将不同的敌人添加到批处理中?

4

1 回答 1

1

可以将多个图像合二为一。这样的图像称为图集。所以所有的怪物都在一个大纹理中。对每个图像的访问是使用 .plist 配置文件完成的,其中存储了有关具体图像在大纹理中放置位置的信息。

它很有意义,因为它是一个昂贵的操作来切换纹理。更快的是将您需要的所有内容放入一个纹理并使用批处理。此外,由于纹理存储在 GPU 上的 (2^n, 2^m) 缓冲区中并提供大纹理,因此它在 GPU 上占用的内存也更少,您可以最大限度地减少纹理中的可用空间。例如,加载每 65 像素大小为 65 的图像将创建每 128 像素 128 的纹理。

于 2012-06-19T15:13:30.840 回答