作者crushcrush (睡不醒)
看板GameDesign
标题[程式] 用XNA制作音乐游戏,有关音符的碰撞判定?
时间Sat Mar 27 14:30:42 2010
上次请教过一些问题之後陆陆续续解决了
但现在又有些新问题出现想请问大家 = ="
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
1F:→ help0430:用Queue吧! 04/07 12:43