2010-04-24 117 views
3

在「Galaga」(我最喜歡的射手遊戲成長)的背景下製作一款新的射手遊戲。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]; 
} 
} 

無論如何,最明顯的問題是,一旦子彈離開屏幕,它的中心是被重置,所以我重用相同每按一下「火」按鈕的子彈。

理想情況下,我希望用戶能夠在不導致程序崩潰的情況下發送「火災」按鈕。我該如何修改這個現有的代碼,以便每次按下按鈕時都會產生一個子彈對象,然後在它離開屏幕後退出,或者與敵人發生衝突?

感謝您提供任何幫助!

回答

3

你當然不希望爲每一顆子彈,小行星,爆炸動畫等發射定時器,這將是可怕的。

大多數遊戲都基於所謂的有限狀態機。這本質上是一種跟蹤遊戲狀態的方法(即PLAYING,END_GAME,WAITING_FOR_OTHERPLAYERS)並基於此做出決定。這個方法會通過一個定時器反覆調用,就像你爲子彈所做的一樣。我會建議像這樣設置你的遊戲。現在關於這些子彈,當玩家擊中火力按鈕時,將另一顆子彈添加到一系列事物中,即需要隨時調整自己。然後每次通過遊戲循環,當狀態指示時,遍歷它們並告訴它們「更新自己」。這也將是在那裏你會做你的碰撞檢測,並開始爆炸的動畫,刪除去了關屏等

希望幫助的對象,

肯尼

更新:一些僞代碼(即將不會編譯),應該更好地解釋事情。請注意,我總是喜歡傳遞遊戲時間,以便對象不知道實際時間,這是一種很好的做法,因爲它不僅可以重新設置遊戲會話的時間,非常適合調試,有時還可以創建一個整潔的功能,它也意味着所有對象都獲得相同的時間,而不是基於它在數組中的位置而不同於第一個對象的毫秒數。當天的熱點!嗚呼!

// 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 2010-04-24 19:25:04

+0

仍然有問題...請介意給我多一點解釋? :P – user298261 2010-04-25 06:49:26

+0

還是有點困惑。 :( 我想弄清楚爲什麼數組實現以及它應該做什麼。提供更多的細節介紹?我理解僞代碼的其餘部分相當不錯。還有,「fire按鈕按下「的方法應該代表IBAction? 謝謝! – user298261 2010-04-26 07:04:05