• R/O
  • SSH
  • HTTPS

mmdx: Commit


Commit MetaInfo

Revision17 (tree)
Zeit2010-03-02 01:52:17
Autorwilfrem

Log Message

アニメーションが処理が遅延しても曲に合うように時間基準をGameTimeからStopwatchをに変更

Ändern Zusammenfassung

Diff

--- trunk/MikuMikuDanceXNA/Model/AnimationPlayer.cs (revision 16)
+++ trunk/MikuMikuDanceXNA/Model/AnimationPlayer.cs (revision 17)
@@ -5,6 +5,7 @@
55 using MikuMikuDance.XNA.Motion;
66 using Microsoft.Xna.Framework.Graphics;
77 using System.Threading;
8+using System.Diagnostics;
89
910 namespace MikuMikuDance.XNA.Model
1011 {
@@ -11,22 +12,38 @@
1112 class OneTrack
1213 {
1314 public MMDMotion motion;
14- public decimal frame;
15+ Stopwatch timer = new Stopwatch();
1516 public bool IsLoopPlay;
1617
17- public void Step(decimal time)
18+ public void SetLoopPlay(bool value) { IsLoopPlay = value; }
19+ public void Reset() { motion = null; timer.Reset(); IsLoopPlay = false; }
20+
21+ internal void Stop()
1822 {
19- frame += time;
23+ timer.Stop();
2024 }
21- public void SetFrame(int value)
25+
26+ internal void Start()
2227 {
23- frame = value;
28+ timer.Start();
2429 }
25- public void SetLoopPlay(bool value) { IsLoopPlay = value; }
26- public void Reset() { motion = null; frame = -1; IsLoopPlay = false; }
27-
28-
29-
30+ internal bool IsPlay
31+ {
32+ get
33+ {
34+ return timer.IsRunning;
35+ }
36+ }
37+ internal decimal GetFrame(decimal FramePerSecond)
38+ {
39+ decimal frame = (decimal)timer.Elapsed.TotalMilliseconds * FramePerSecond / 1000.0m;
40+ if (frame > motion.MaxFrame && !IsLoopPlay)
41+ {
42+ Stop();
43+ return motion.MaxFrame;
44+ }
45+ return frame % motion.MaxFrame;
46+ }
3047 }
3148 /// <summary>
3249 /// モーションファイルからアニメーションを再生するアニメーションプレイヤー
@@ -70,12 +87,11 @@
7087 public int SetMotion(MMDMotion motion, bool SetStartPos)
7188 {
7289 if (trackPool.Count == 0)
73- mmdMotion.Add(new OneTrack() { motion = motion, frame = (SetStartPos ? 0 : -1) });
90+ mmdMotion.Add(new OneTrack() { motion = motion });
7491 else
7592 {
7693 trackPool[0].Reset();
7794 trackPool[0].motion = motion;
78- trackPool[0].frame = -1;
7995 mmdMotion.Add(trackPool[0]);
8096 trackPool.RemoveAt(0);
8197 }
@@ -89,7 +105,7 @@
89105 /// </summary>
90106 public void Stop(int index)
91107 {
92- mmdMotion[index].SetFrame(-1);//フレーム-1=停止
108+ mmdMotion[index].Stop();
93109 }
94110 /// <summary>
95111 /// 全てのモーションをストップする
@@ -111,7 +127,7 @@
111127 {
112128 if (mmdMotion == null)
113129 throw new ApplicationException("モーションデータがセットされてないのにStartを実行した");
114- mmdMotion[index].SetFrame(0);
130+ mmdMotion[index].Start();
115131 mmdMotion[index].SetLoopPlay(bLoopPlay);
116132 }
117133 /// <summary>
@@ -133,7 +149,7 @@
133149 /// <returns>再生中ならtrue</returns>
134150 public bool IsPlay(int index)
135151 {
136- return (mmdMotion[index].frame >= 0);
152+ return (mmdMotion[index].IsPlay);
137153 }
138154 /// <summary>
139155 /// モーションがループプレイかどうかを調べる
@@ -168,24 +184,12 @@
168184 for (int i=0;i<mmdMotion.Count;i++)
169185 {
170186 //再生中かどうかチェック
171- if (mmdMotion[i].frame >= 0)
187+ if (mmdMotion[i].IsPlay)
172188 {
173189 //現在の再生フレームを更新
174- mmdMotion[i].Step((decimal)gameTime.ElapsedGameTime.Ticks / 10000.0m * FramePerSecond / 1000.0m);
175- InnerUpdate(mmdMotion[i].motion, mmdMotion[i].frame);
176- if (mmdMotion[i].frame > mmdMotion[i].motion.MaxFrame)
177- {
178- if (mmdMotion[i].IsLoopPlay)
179- {
180- if (mmdMotion[i].motion.MaxFrame == 0)
181- mmdMotion[i].SetFrame(0);
182- else
183- mmdMotion[i].Step(-mmdMotion[i].motion.MaxFrame);
184- }
185- else
186- mmdMotion[i].SetFrame(-1);
187- }
190+ InnerUpdate(mmdMotion[i].motion, mmdMotion[i].GetFrame(FramePerSecond));
188191
192+
189193 }
190194 }
191195 //こちらではボーンマネージャのUpdateは行わない
Show on old repository browser