[程式] 用XNA製作音樂遊戲,有關音符的碰撞判定?
上次請教過一些問題之後陸陸續續解決了
但現在又有些新問題出現想請問大家 = ="
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
04/07 12:43, 1F
GameDesign 近期熱門文章
PTT遊戲區 即時熱門文章