2009-11-20 1 views
2

모두 1942 년 (고전 슈팅 게임)과 같은 슈팅 게임을 만들었지 만, 여기서는 질문입니다. 전투기가 직선을 발사하면 FPS가 5 ~ 6으로 떨어집니다. 약 7 ~ 8 화면에서 글 머리 기호, 사실, 플레이어의 8 총알이 총알이 화면에서 비행 할 때이 전투기의 중심으로 다시 보이지 않는 될 것입니다, 게임에 나타납니다, 모든 총알은 개별 스프라이트, 그냥 좋아하는 :Cocos2d - 슈팅 게임 문제

Sprites * bullet1 = [Sprite spriteWithFile:@"bullet.png"]; 

........

Sprites * bullet8 = [Sprite spriteWithFile:@"bullet.png"]; 

많은 b를 저장할 수있는 방법이 있습니까? ullets 하나씩 정의하는 대신 ?? 적들이 너무 많이 발사 할 수 있기 때문에 FPS가 0에 가까워 질 수도 있습니다 .....

아무도 도와 줄 수 있습니까 ??

NSMutableArray * bulletsBuilder = [[NSArray alloc] init]; 

for(int i = 0; i < MAX_NUMBER_OF_SPRITES; ++i) { 
    [bullets addObject:[Sprite spriteWithFile:@"bullet.png"]]; 
} 

NSArray * bullets = [NSArray arrayWithArray:bulletsBuilder]; 
[bulletsBuilder release]; 

을 그리고 나중에 자신의 ID를 사용하여 액세스 :

답변

3

당신은 코코스를 사용하고 있기 때문에 "총알 풀"이있는 것처럼 할 수 있습니다. 내가 할 일은 게임을 시작할 때 총알을 많이 할당하는 것입니다. 얼마나 많은 총알이 필요한지 대략 확인하고 미리 할당하십시오.

게임의 엔티티가 총알을 발사해야하는 경우이 풀에 총알을 묻기 만하면 "미리 할당 된"글 머리 기호에 속성을 부여하고 화면에 글 머리 기호가 나타나며 해당 글 머리 기호가 충돌/사라져서 그 총알을 총알 수영장으로 돌려 보내라. 문제가 무엇

/*You pre-allocate your bullets.*/ 
for(int i = 0; i < MAX_BULLETS; i++) 
{ 
    Bullet *aBullet = [[Bullet alloc] init]; 
    [bulletsArray addObject:aBullet]; 

    [aBullet release]; 
} 

//Then in game when you fire: 

Bullet *aBullet = [PoolManager bulletWithSprite:myBulletSprite]; // Where myBulletSprite is PRE allocated and you don't allocate sprites in Game. 
1

당신은 배열의 스프라이트를 저장할 수

Sprite * spr = [bullets objectAtIndex:spriteIndex]; 
-1

코어 애니메이션 레이어는 경량과 성능을 도움이 될 것입니다. 이미지를 한 번로드 한 다음 총알 이미지를 CALayers 배열의 내용으로로드 할 수 있습니다. 이런 식으로 뭔가 :

// bulletImage is an instance variable 
bulletImage = [UIImage imageNamed:@"bullet.png"]; 

bulletLayers = [[NSMutableArray alloc] init]; 
for (i = 0; i < 9; ++i) 
{ 
    CALayer *bulletLayer = [CALayer layer]; 
    [bulletLayer setBounds:[bulletImage bounds]]; 
    [bulletLayer setPosition:gunBarrelOrigin]; 
    [bulletLayer setContents:(id)[bulletImage CGImage]]; 
    [bulletLayers addObject:bulletLayer]; 
} 

// Use the array of layers. 
// ... 

당신이 당신의 Sprite 클래스에서 뷰 또는 레이어를 사용하고 있는지 당신은 지정하지 않은,하지만 같은 이미지를 여러 번로드하는 경우, 당신은 확실히 불필요한 오버 헤드를 만드는.

+0

코코스는 이미 레이어 클래스를 통해 레이어를 지원합니다. – arul

0

:

당신은 몇 가지 코드를 필요로하는 경우? 스프라이트 배치를 사용하십시오! 그것은 여러 스프라이트의 렌더링 속도를 높일 수있는 특별한 레이어입니다.

  1. CCSpriteBatchNode * batch = [CCSpriteBatchNode batchNodeWithFile : @ "bullet.png"];
    • Texture Atlas가 아니라면 다른 스프라이트를 사용하여 렌더링 할 수 없습니다.
  2. 그런 다음 하나의 스프라이트를로드하고 필요한만큼 많은 스프라이트를 배치 자체에 추가하십시오. for (; i> 10;) {[batch addSprite : sprite];}
  3. 에 추가하십시오.