- (void) loadStartingTiles //16 by 24
{
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:
@"clonespritesheet.plist"];
for(int x = 0; x < 16; x++) //minus 1 for one at the begining
{
for(int y = 0; y < 26; y++)
{
CCSprite *tempsprite;
switch (currentscreen[x][y])
{
case 0:
tempsprite = [CCSprite spriteWithSpriteFrameName:@"block0.png"];
break;
case 1:
tempsprite = [CCSprite spriteWithSpriteFrameName:@"block1.png"];
break;
}
tempsprite.position = ccp(y*20+10,(16-x)*20-10); //+10 for align for tile size
[self addChild:tempsprite z:3];
[tiles addObject:tempsprite];
}
}
}
所以我从一个int数组中创建了一堆sprite,告诉他们应该在哪里,然后我将它们添加到nsmutable数组tile中。然后我慢慢地将阵列中的所有内容向左移动,并且我输掉大约20 FPS。什么是制作瓷砖系统的更有效方法?我的目标是稍后制作随机生成的瓷砖。
- (void) manageTiles:(CGFloat)dt
{
int tileamount = [tiles count];
for(int i = 0; i < tileamount; i++)
{
CCSprite *tempsprite = [tiles objectAtIndex:i];
tempsprite.position = ccp(tempsprite.position.x-20*dt,tempsprite.position.y);
}
}
编辑:awnser是
int themap = -20;
- (void) manageTiles:(CGFloat)dt
{
tiles.position = ccp(tiles.position.x-10*dt,tiles.position.y);
NSLog(@"%d",themap);
if(tiles.position.x < themap)
{
CCSprite *tempsprite;
for(int i = 0; i < 16; i++)
{
[tiles removeChildAtIndex:0 cleanup:YES];
}
for(int i = 0; i < 16; i++)
{
switch (tilewall[i])
{
case 0:
tempsprite = [CCSprite spriteWithSpriteFrameName:@"block1.png"];
break;
case 1:
tempsprite = [CCSprite spriteWithSpriteFrameName:@"block1.png"];
break;
}
tempsprite.position = ccp((themap*-1)+500+10,((16-i)*20-10));
[tiles addChild:tempsprite];
}
themap = themap-20;
}
}
答案 0 :(得分:1)
将tempsprite
变量预加载到循环之外:
CSprite *sprite0 = [CCSprite spriteWithSpriteFrameName:@"block0.png"];
CSprite *sprite1 = [CCSprite spriteWithSpriteFrameName:@"block1.png"];
然后在循环中将它们引用给它们:
switch (currentscreen[x][y])
{
case 0:
tempsprite = sprite0;
break;
case 1:
tempsprite = sprite1;
break;
}
甚至更好:
tempsprite = currentscreen[x][y] ? sprite1 : sprite0;
哦,你的内循环应该是24,而不是26。
答案 1 :(得分:1)
您出错的地方是,您没有使用CCSpriteBatchNode。 CCSpriteBatchNode将在一个绘制操作中绘制所有切片,而不是每个切片执行一次绘制操作。缺点是,批处理节点中的每个tile都具有相同的zOrder(在某种程度上),并且每个批处理节点都必须使用一个源spritesheet。所以基本上如果你想在不同的zOrders上使用不同的图层,或者为图块使用不同的源图像的不同图层,则必须创建多个批处理节点,每个节点一个。
http://www.cocos2d-iphone.org/api-ref/0.99.5/interface_c_c_sprite_batch_node.html