• R/O
  • SSH
  • HTTPS

mmdx: Commit


Commit MetaInfo

Revision65 (tree)
Zeit2010-03-20 19:10:23
Autorwilfrem

Log Message

アニメーションのトラックをListからArrayに変更し、アニメーションの指定方法を大幅修正

Ändern Zusammenfassung

Diff

--- trunk/MikuMikuDanceXNA/MikuMikuDanceXNA.cs (revision 64)
+++ trunk/MikuMikuDanceXNA/MikuMikuDanceXNA.cs (revision 65)
@@ -17,9 +17,11 @@
1717 /// </summary>
1818 public class MikuMikuDanceXNA
1919 {
20+ /// <summary>
21+ /// モーショントラックの最大トラック数
22+ /// </summary>
23+ public const int MotionTrackCap = 30;
2024
21- internal const int MotionTrackCap = 6;//モーショントラックのデータ確保数
22-
2325 #if XBOX//スレッド用の定数を用意したが、XBoxのGC回避のために使えない……
2426 internal const int NumThread = 4;//使用するスレッド数
2527 #else
--- trunk/MikuMikuDanceXNA/Motion/AnimationPlayer.cs (revision 64)
+++ trunk/MikuMikuDanceXNA/Motion/AnimationPlayer.cs (revision 65)
@@ -16,18 +16,15 @@
1616 //親のモデル
1717 MMDModel mmdModel;
1818 //現在のモーション一覧
19- List<MotionTrack> mmdMotion = new List<MotionTrack>(MikuMikuDanceXNA.MotionTrackCap);
20- List<MotionTrack> trackPool = new List<MotionTrack>(MikuMikuDanceXNA.MotionTrackCap);//オブジェクトプール
19+ MotionTrack[] mmdMotion = new MotionTrack[MikuMikuDanceXNA.MotionTrackCap];
20+ //List<MotionTrack> mmdMotion = new List<MotionTrack>(MikuMikuDanceXNA.MotionTrackCap);
21+ //List<MotionTrack> trackPool = new List<MotionTrack>(MikuMikuDanceXNA.MotionTrackCap);//オブジェクトプール
2122
22-
23-
2423 /// <summary>
2524 /// 一秒あたりのフレーム数
2625 /// </summary>
2726 public int FramePerSecond { get; set; }
2827
29-
30-
3128 /// <summary>
3229 /// 親のモデルクラスからアニメーションプレイヤーを生成
3330 /// </summary>
@@ -34,36 +31,43 @@
3431 /// <param name="model">親のモデルクラス</param>
3532 internal AnimationPlayer(MMDModel model)//内部からのみ
3633 {
37- mmdMotion.Capacity = MikuMikuDanceXNA.MotionTrackCap;
3834 for (int i = 0; i < MikuMikuDanceXNA.MotionTrackCap; i++)
39- trackPool.Add(new MotionTrack());
35+ mmdMotion[i] = new MotionTrack();
4036 mmdModel = model;
4137 FramePerSecond = 30;//MMDは30フレーム/秒が標準
4238 }
4339
4440 /// <summary>
45- /// モーションをセット
41+ /// 開いているトラックにモーションをセット
4642 /// </summary>
4743 /// <param name="motion">セットするMMDモーションデータ</param>
4844 /// <param name="SetStartPos">0フレームのデータでポーズを初期化する</param>
49- /// <returns>セットしたモーションの番号</returns>
45+ /// <returns>セットしたトラックの番号。開いているトラックが無ければ-1</returns>
5046 public int SetMotion(MMDMotion motion, bool SetStartPos)
5147 {
52- if (trackPool.Count == 0)
53- mmdMotion.Add(new MotionTrack() { motion = motion });
54- else
55- {
56- trackPool[0].Reset();
57- trackPool[0].motion = motion;
58- mmdMotion.Add(trackPool[0]);
59- trackPool.RemoveAt(0);
60- }
61- if (SetStartPos)
62- Update(mmdMotion.Count - 1);
63-
64- return mmdMotion.Count - 1;
48+ int Index = -1;
49+ for (Index = 0; Index < MikuMikuDanceXNA.MotionTrackCap; Index++)
50+ if (mmdMotion[Index].IsEmpty)
51+ break;
52+ if (Index >= MikuMikuDanceXNA.MotionTrackCap)
53+ return -1;
54+ SetMotion(Index, motion, SetStartPos);
55+ return Index;
6556 }
6657 /// <summary>
58+ /// 指定したトラックにモーションをセット
59+ /// </summary>
60+ /// <param name="index">トラック番号(0~MikuMikuDanceXNA.MotionTrackCap)</param>
61+ /// <param name="motion">セットするMMDモーションデータ</param>
62+ /// <param name="SetStartPos">0フレームのデータでポーズを初期化する</param>
63+ public void SetMotion(int index, MMDMotion motion, bool SetStartPos)
64+ {
65+ mmdMotion[index].Reset();
66+ mmdMotion[index].motion = motion;
67+ mmdMotion[index].IsEmpty = false;
68+ Update(index);
69+ }
70+ /// <summary>
6771 /// モーションをストップする
6872 /// </summary>
6973 public void Stop(int index)
@@ -75,7 +79,7 @@
7579 /// </summary>
7680 public void StopAll()
7781 {
78- for (int i = 0; i < Count; i++)
82+ for (int i = 0; i < mmdMotion.Length; i++)
7983 {
8084 Stop(i);
8185 }
@@ -100,7 +104,7 @@
100104 /// <param name="bLoopPlay">ループプレイ</param>
101105 public void StartAll(GameTime gameTime, bool bLoopPlay)
102106 {
103- for (int i = 0; i < Count; i++)
107+ for (int i = 0; i < mmdMotion.Length; i++)
104108 {
105109 Start(i, gameTime, bLoopPlay);
106110 }
@@ -123,20 +127,7 @@
123127 {
124128 return mmdMotion[index].IsLoopPlay;
125129 }
126- /// <summary>
127- /// 現在のモーション数
128- /// </summary>
129- public int Count { get { return mmdMotion.Count; } }
130- /// <summary>
131- /// モーションを外す
132- /// </summary>
133- /// <param name="index">モーションインデックス番号</param>
134- /// <remarks>モーションを消すと、消した番号以降の番号が一つ前にずれるので注意</remarks>
135- public void UnsetMotion(int index)
136- {
137- Stop(index);
138- mmdMotion.RemoveAt(index);
139- }
130+
140131
141132 /// <summary>
142133 /// アニメーションの更新
@@ -144,10 +135,10 @@
144135 /// <remarks>モデルのUpdateから呼ばれるので、ユーザーが呼ぶ必要はありません</remarks>
145136 internal void Update(int motionIndex)
146137 {
147- for (int i = (motionIndex < 0 ? 0 : motionIndex); i < (motionIndex < 0 ? mmdMotion.Count : motionIndex + 1); i++)
138+ for (int i = (motionIndex < 0 ? 0 : motionIndex); i < (motionIndex < 0 ? mmdMotion.Length : motionIndex + 1); i++)
148139 {
149140 //再生中かどうかチェック
150- if (mmdMotion[i].IsPlay)
141+ if (!mmdMotion[i].IsEmpty && mmdMotion[i].IsPlay)
151142 {
152143 //現在の再生フレームを更新
153144 //InnerUpdate(mmdMotion[i].motion, mmdMotion[i].GetFrame(FramePerSecond));
--- trunk/MikuMikuDanceXNA/Motion/MotionTrack.cs (revision 64)
+++ trunk/MikuMikuDanceXNA/Motion/MotionTrack.cs (revision 65)
@@ -15,8 +15,10 @@
1515 decimal beforeMS = 0;
1616 decimal LossTime = 0;
1717
18+ internal bool IsEmpty = true;
19+
1820 public void SetLoopPlay(bool value) { IsLoopPlay = value; }
19- public void Reset() { motion = null; timer.Reset(); IsLoopPlay = false; }
21+ public void Reset() { motion = null; timer.Reset(); IsLoopPlay = false; IsEmpty = true; }
2022
2123 internal void Stop()
2224 {
Show on old repository browser