[程式] 用XNA製作音樂遊戲,有關音符的碰撞判定?

看板GameDesign (遊戲設計)作者 (睡不醒)時間15年前 (2010/03/27 14:30), 編輯推噓0(001)
留言1則, 1人參與, 最新討論串1/1
上次請教過一些問題之後陸陸續續解決了 但現在又有些新問題出現想請問大家 = =" 1.之前提到的畫面delay情況而造成的音符與音樂不同步的問題 已經用音符強制在指定時間移動到指定位置的方式來解決 但還有個問題是用來控制音符的計時器,和音樂沒有辦法完全match在一起 我的寫法如下 int musicTime = 0; bool musicStart = false; protected override void Update(GameTime gameTime) { // 中間有些預讀音樂檔和播放的程式法略過,主要列計時的方式和時間點 if (musicCue.IsPlaying) { musicStart = true; } if (musicStart == true) { musicTime += gameTime.ElapsedGameTime.Milliseconds; } } 音樂和計時器會不同步...甚至有時後計時器會算到一半停住(為什麼啊??) 是不是有必要另外寫一個類別來計算音樂的時間呢?應該要怎麼寫? 2.我寫了一個音符的類別MoveBall和自動產生音符的類別AutoMoveBall 並另外寫一個音符的控制類別MoveBallManager來管理音符產生時間與位置 List<MoveBall> moveBallList = new List<MoveBall>(); public override void Update(GameTime gameTime) { // 產生音符 if (MusicTime > 3005 ) { AppearMoveBall(); } } private void AppearMoveBall() { spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.FrontToBack, SaveStateMode.None); // 繪製 moveBallList.Add(new AutoMoveBall( Game.Content.Load<Texture2D>(@"buttonImage/mbBabo"), MovePosition, // 控制位置的Vector 2 MoveSpeedx)); // 控制速度的Vector 2 } 其中音符的拍擊判斷是寫在MoveBall類別中 public int Judge { get { if (Math.Abs((int)(moveBallPosition.X - 725)) < 20) return 1; // 表示有打到 else return 0; // 沒事 } } 然後在MoveBallManager裡面當按鍵被按下時做判斷 if (MoveBall.Judge == 1) { // 顯示爆破動畫的程式碼 } 但是當兩個音符太密導致兩個音符的moveBallPosition.X - 725都小於20的時候 會同時被判斷並顯示爆破動畫... 於是我用for迴圈來檢查每一顆音符,並抓出距離最近的一個來判斷 但這麼做在有大量音符時會讓程式產生明顯地延遲,並不是個好方法... 有沒有什麼更好的寫法可以讓程式只判斷最近的一顆呢? 先謝謝各位前輩了! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.160.111.116

04/07 12:43, , 1F
用Queue吧!
04/07 12:43, 1F
文章代碼(AID): #1BhQOKP2 (GameDesign)
文章代碼(AID): #1BhQOKP2 (GameDesign)