2012-02-01 4 views
0

6 개의 총을 가진 우주선이있는 OpenGL ES 응용 프로그램에서 작업하고 있습니다. 각 건은 키 프레임 애니메이션을 사용하여 시작점과 끝점의 정점 2 세트 사이를 보간합니다.OpenGL ES 무작위 지연 후 셀렉터 수행

나는 총을 발사해야하는 gunNumber 변수를 전달하는 rotateGun: 메서드가 있습니다. rotateGun:이 발사 될 때, 나는 레이저 발파공을 생성합니다.이 폭발은 내가 그 배의 위치에서 총구를 가리키는 벡터를 통해 배에서 멀어 질 때까지 호출됩니다. 이 모든 것은 잘 작동하지만 지금은 동시에 발사되는 것처럼 보이기 때문에 각 총에 대해 임의의 시간 간격을 추가하고 싶습니다.

performSelector:afterDelay:을 사용하여 시간 지연을 생성하고 rotateGun : 메서드를 실행하려고 시도했지만 작동하지 않습니다. 그런 다음 지연 후 메서드 mainGunFire:을 사용하려고 시도한 다음 주 스레드에서 rotateGun:을 호출합니다 ... 이것은 또한 작동하지 않았습니다. "작동하지 않음"이란 의미는 rotateGun: 메서드 내에서 드로잉 호출이 인쇄되기 바로 전에 NSLog를 삽입했지만 총과 폭발은 발생하지 않습니다.

단순히 performSelectorOnMainThread를 호출하여 rotateGun:을 호출하면 총과 폭발이 이전과 같이 그려지고 폭발이 동시에 발생하는 것처럼 보입니다. 분명히 뭔가를 이해하지 못합니다. 다른 사람이 내 레이저 폭발을 약간 무작위로 랜덤 화하는 방법을 이해할 수 있도록 도와 주시겠습니까? 감사!

// Randomly Fire Gun 
- (void)mainGunFire:(NSNumber *)gunNumber { 

    // Perform the Gun animation and fire on main thread 
    [self performSelectorOnMainThread:@selector(rotateGun:) withObject:gunNumber waitUntilDone:YES]; 

} 

// Draw and Rotate the Guns 
- (void)drawRotateGuns { 

    // Only shoot if this is not a ship life 
    if (self.isLife == NO) { 

     // Gun 1 

     // Set the pass variable to 1 and call the method 
     // after a variable amount of time 
     int randomTime = 0; 
     //[self performSelector:@selector(mainGunFire:) withObject:[NSNumber numberWithInt:1] afterDelay:randomTime]; 
     [self performSelectorOnMainThread:@selector(rotateGun:) withObject:[NSNumber numberWithInt:1] waitUntilDone:YES]; 

     // Gun 2 ... 

     // Gun 3 ... 

    } 
} 
+0

'[의 NSNumber numberWithInt : 1]'- 당신의 접근 방식은 설계 잘못 임의의 값 대신 일반적으로 1을 삽입, 나는 준비가 오픈 소스 엔진을 사용하는 것이 좋습니다)에 대한 – brigadir

+0

확인 감사 입력! – PhilBot

답변

0

가장 간단한 해결책은 (는 각 군에 대한 달라야) some_number!(rand()%some_number) 대신에 (1)의 실험을 사용하는 것이다. 하지만 그다지 크지 않아야합니다.

예를 들어 2를 사용하면 !(rand()%2) == 1 확률은 약 0.5입니다. 따라서 초당 60 프레임을 렌더링하면 초당 약 30 건의 화재가 발생합니다. ! (rand() % 20)의 경우 초당 약 3 발을해야합니다. 당신이 그것을 얻을 수 있기를 바랍니다. 일부 의사 :

if(!(rand()%2)) { 
    [gun1 fire]; 
} 

if(!(rand()%3)) { 
    [gun2 fire]; 
} 
+0

이것은 내가 끝내었던 것과 매우 비슷합니다 - 감사합니다. – PhilBot