2010-04-24 3 views
3

"Galaga"(내 fav shooter 게임 자라기)의 정맥에 새로운 사수 게임을 만듭니다. 여기 iPhone 사수 게임 총알 물리학!

총알 물리학 내가 가지고있는 코드입니다 :

-(IBAction)shootBullet:(id)sender{ 
imgBullet.hidden = NO; 
timer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(fireBullet) userInfo:Nil repeats:YES]; 
} 

-(void)fireBullet{ 
imgBullet.center = CGPointMake(imgBullet.center.x + bulletVelocity.x , imgBullet.center.y + bulletVelocity.y); 
if(imgBullet.center.y <= 0){ 
imgBullet.hidden = YES; 
imgBullet.center = self.view.center; 
[timer invalidate]; 
} 
} 

어쨌든, 명백한 문제는 총알이 화면을 떠나면, 그 중심이되고 재설정 될 것입니다, 그래서 같은를 재사용하고있어 "fire"버튼을 누를 때마다 글 머리 기호를 누르십시오.

이상적으로 사용자가 프로그램을 중단시키지 않고 "불"버튼을 스팸 할 수 있기를 바랍니다. 총알 객체가 매번 버튼을 눌렀을 때 스폰되고 화면을 빠져 나오거나 적과 충돌 할 때마다이 기존 코드를 수정하면 어떻게 될까요?

제공 할만한 도움을 주셔서 감사합니다.

답변

3

당신은 확실히 모든 탄환, 소행성, 폭발 애니메이션 등을 위해 타이머 발사를 원하지 않습니다. 이것은 끔찍할 것입니다.

대부분의 게임은 유한 상태 기계라고 불리는 것을 기반으로합니다. 이것은 본질적으로 게임 상태 (예 : PLAYING, END_GAME, WAITING_FOR_OTHERPLAYERS)를 추적하고이를 토대로 결정을 내리는 방법입니다. 이 방법은 총알에 대한 작업과 마찬가지로 ONE 타이머를 통해 반복해서 호출됩니다. 그렇게 게임을 설정하는 것이 좋습니다. 이제 그 총알에 대해 플레이어가 발사 버튼을 눌렀을 때 시간이 지남에 따라 스스로 조정할 필요가있는 일련의 요소에 또 다른 총알을 추가하십시오. 그런 다음 게임 루프가 진행될 때마다 상태가 지시 할 때마다 반복하여 "업데이트하기"라고 말합니다. 당신이

업데이트 케니 귀하의 충돌 감지를하고 폭발 애니메이션을 시작, 오프 화면 도움 등

희망 갔다 객체,

을 제거 할 곳은 또한 다음과 같습니다 일부 의사 코드 (예 : 컴파일하지 않을 것입니다.) 더 잘 설명해야합니다. 나는 항상 게임 시간을 지나쳐 객체가 실제 시간을 전혀 알지 못하도록하고 싶다. 이것은 게임 세션을 다시 애니메이션 할 수있을뿐만 아니라 디버깅에 유용하며 때로는 깔끔한 기능을 만들 수 있기 때문에 좋은 연습이다. 또한 모든 객체가 배열에있는 위치를 기반으로하는 첫 번째 객체와 다른 밀리 초가 아닌 동일한 시간을 얻음을 의미합니다. 뜨거운 팁! 우 ~ !!

// implementation in MainGame class 

    // After application has had its lunch.... 
- (void) applicationDidFinishLunching { 
    gameTimer = [NSTimer scheduledTimerWithTimeInterval:GAMETIME_INTERVAL target:self selector:@selector(myGameLoop) userInfo:nil repeats:TRUE]; 
} 

- (void) startGame { 
    gameState = PLAYING; 
// And most likely a whole bunch of other stuff 
} 

NSMutableArray * mTransientObjects; 

- (void) fireButtonPressed:(float) atY andTime:(NSTimeInterval) fireTime { 
    // I will assume only a "Y" variable for this game, Galaga style. 
    Bullet * aBullet = [[Bullet alloc] initWithY:atY atTime:fireTime]; 
    [mTransientObjects addObject:aBullet]; 

    [aBullet release]; 
} 

// myGameLoop is called via the timer above firing at whatever interval makes sense for your game 
- (void) myGameLoop { 

switch (gameState) { 
    case PLAYING: 
     for (nextObject in mTransientObjects) 
      [nextObject updateYourself:gameTime]; 

     // Now check for dead object, add explosions to mTransientObjects 
     // Remove dead things, add anything new etc. 
      etc. 
} 

// implementation in Bullet subclass 
// Bullet is SubClass of your overall Sprite class 
- (void) updateYourself:(NSTimerInterval) timeInterval { 
// Do any movement, change of animation frame, start sound....etc. etc. 
} 
+0

나는 gamestates의 문제를 알고 있습니다. 그건 문제가 아니야. 그러나 사용자가 "불"버튼을 눌렀을 때 어떤 일이 발생해야하는지에 대한 설명에 대해서는 여전히 약간 혼란 스럽습니다. 좀 더 자세히 설명 할 수있는 방법이 있습니까? 지금까지 도와 주셔서 감사합니다! – user298261

+0

아직도 문제가 있습니다 ... 좀 더 설명해 주시겠습니까? : P – user298261

+0

조금 혼란 스럽네요. : ( 배열이 구현 된 이유와 그 이유가 무엇인지 알아 내려고 노력 중입니다. 조금 더 자세히 설명해 주시겠습니까? 나머지 의사 코드는 꽤 잘 이해하고 있습니다. 또한 "화재 버튼을 눌렀을 때 "라는 메시지가 나타납니다. 감사합니다. – user298261