2013-01-24 3 views
0

나는 현재 만들고있는 앱으로 거의 끝났지 만, 내가 필요로하는 기능 하나를 찾아내는 데 어려움을 겪고있다. 나는 임의의 간격과 위치에 화면에 떨어지는 5 가지 스프라이트를 가지고있다. 내 문제는 내 코드에서 특정 시간 (예 : 20 초) 동안 한 번에 하나의 스프라이트 만 표시된다는 것입니다. 그런 다음 20 초 후에 더 많은 시간이 동시에 떨어집니다. 스프라이트를 삭제할 때 내 메서드가 어떻게 표시되는지는 다음과 같습니다.스프라이트의 모양을 지연시키는 방법은 무엇입니까?

//The init method 
-(id) init 
{ 
if((self=[super init])) { 
    //Enable touch 
    self.isTouchEnabled = YES; 

    //Allocate and initialise 
    sprites = [[NSMutableArray alloc]init]; 

    CGSize winSize = [[CCDirector sharedDirector]winSize]; 

    //Add the sprites 
    [self schedule:@selector(scheduleDrop:)interval:2.0]; 
} 
return self; 
} 

//Method to drop sprites 
-(void)spriteDrop 
{ 
    CGSize winSize = [[CCDirector sharedDirector]winSize]; 

int RandomX = (arc4random() % 200); 

NSString *strSprite = @"1.png"; 

switch(arc4random() % 5){ 
    case 1: 
     strSprite = @"1.png"; 
     break; 
    case 2: 
     strSprite = @"2.png"; 
     break; 
    case 3: 
     strSprite = @"3.png"; 
     break; 
    case 4: 
     strSprite = @"4.png"; 
     break; 
    case 5: 
     strSprite = @"5.png"; 
     break; 
} 

sprite = [CCSprite spriteWithFile:strSprite]; 
sprite.position = ccp(RandomX, 500); 
sprite.scaleX = 40/sprite.contentSize.width; 
sprite.scaleY = 150/winSize.height; 

int posMinY = sprite.contentSize.width/2; 
int posMaxY = winSize.height - sprite.contentSize.height/2; 
int range = posMaxY - posMinY; 
int actual = (arc4random()%range); 
currentPos = actual; 

[self addChild:baby]; 

int minDur = 2.0; 
int maxDur = 5.0; 
int rangeDur = maxDur - minDur; 
int actualDur = (arc4random()%rangeDur) + minDur; 

id drop = [CCMoveTo actionWithDuration:actualDur position:ccp(actual, -sprite.contentSize.height/2)]; 
id dropDone = [CCCallFuncN actionWithTarget:self selector:@selector(spriteDropDone:)]; 
[sprite runAction:[CCSequence actions:drop, dropDone, nil]]; 

sprite.tag = 1; 
[sprites addObject: sprites]; 
} 

//This is the method that schedules the drop 
-(void)scheduleDrop:(ccTime)dt 
{ 
[self spriteDrop];} 

이 문제를 해결할 수있는 누군가가 있기를 바랍니다.

답변

1

시간이 지남에 따라 변경 될 스프라이트 수를 변경하거나 유형 (시각적으로)을 변경하려면 확실하지 않습니다.

한 가지 해결책은 ivar _numberOfSpritesToBeDropped를 사용하는 것입니다. 이는 요청 된 시간 간격 (예를 들어, 20 초)에서 스케줄러에 의해 제어되는 방법에서 증가 될 수있다. 그런 다음 스프라이트의 분산을 제어하는 ​​방법에서이 ivar를 사용하면됩니다.

20 분마다 다른 종류의 스프라이트를 추가하기 만하면됩니다. 초 당신은 단순히

switch(arc4random() % _numberOfSpritesToBeDropped)... 

사이드 노트에 임의의 문을 바꿀 것 : 당신의 spriteDrop 방법은 단순히 스프라이트를 떨어보다 더 많은 일을 할 것 같다 그것은 확실히 두 가지 방법으로 분할 할 보증합니다.

이 아마도 같은 우리의 아래 토론, 뭔가를 바탕 :

NSInteger _maximumCurrentNumberOfSpritesAllowed; 

-(id) init{ 
    self = [super init]; 

    if(self) { 
     [self setup]; 
    } 
    return self; 
} 


-(void) setup{ 
    self.isTouchEnabled = YES; 
    sprites = [[NSMutableArray alloc]init]; 
    _maximumCurrentNumberOfSpritesAllowed = 1; 
    [self schedule:@selector(scheduleDrop:)interval:2.0]; 
} 


-(void)spriteDrop{ 
    if (sprites.count < _maximumCurrentNumberOfSpritesAllowed) { 

     CGSize winSize = [[CCDirector sharedDirector]winSize]; 

     NSString *spriteName = [self randomSpriteName]; // I'd consider doing something similar with the position etc. as well 
     sprite = [CCSprite spriteWithFile:spriteName]; 

     int RandomX = (arc4random() % 200); 
     sprite.position = ccp(RandomX, 500); 
     sprite.scaleX = 40/sprite.contentSize.width; 
     sprite.scaleY = 150/winSize.height; 

     int posMinY = sprite.contentSize.width/2; 
     int posMaxY = winSize.height - sprite.contentSize.height/2; 
     int range = posMaxY - posMinY; 
     int actual = (arc4random()%range); 
     currentPos = actual; 

     [self addChild:baby]; 

     int minDur = 2.0; 
     int maxDur = 5.0; 
     int rangeDur = maxDur - minDur; 
     int actualDur = (arc4random()%rangeDur) + minDur; 

     id drop = [CCMoveTo actionWithDuration:actualDur position:ccp(actual, -sprite.contentSize.height/2)]; 
     id dropDone = [CCCallFuncN actionWithTarget:self selector:@selector(spriteDropDone:)]; 
     [sprite runAction:[CCSequence actions:drop, dropDone, nil]]; 

     sprite.tag = 1; 
     [sprites addObject: sprites]; 
    } 
} 


-(NSString *)randomSpriteName{ 
    NSString *strSprite; 
    switch(arc4random() % 5){ 
     case 1: 
      strSprite = @"1.png"; 
      break; 
     case 2: 
      strSprite = @"2.png"; 
      break; 
     case 3: 
      strSprite = @"3.png"; 
      break; 
     case 4: 
      strSprite = @"4.png"; 
      break; 
     case 5: 
      strSprite = @"5.png"; 
      break; 
     default: 
      strSprite = @"1.png"; 
      break; 
    } 

    return strSprite; 
} 


// Call this method with a scheduler at whatever interval you'd like 
-(void) increaseMaximumNumberOfSpritesAllowed{ 
    _maximumCurrentNumberOfSpritesAllowed++; 
} 

//This is the method that schedules the drop 
-(void)scheduleDrop:(ccTime)dt{ 
    [self spriteDrop]; 
} 
+0

그것은 내가 변경할 것을 포기 스프라이트의 수입니다. 나는 아직도 cocos2d와 objective-c를 배우고 있으므로 나는 ivar을 어떻게 사용하는지 이해하지 못한다. 좋은 예가있는 예나 링크를 보여 주시겠습니까? – user1597438

+0

ivar는 클래스 와이드 변수입니다. 다음과 같은 메소드보다 먼저 구현 파일에 NSInteger를 정의하면됩니다. NSInteger _nameOfIvar; –

+0

내가 볼 수 있듯이 스프라이트의 번호는 전혀 보내지지 않습니다. 항상 2 초마다 새로운 것을 만드는 것입니다. 아, 그리고 spriteDropDone 메서드는 무엇을합니까? –

관련 문제