アニメーションのトラックをListからArrayに変更し、アニメーションの指定方法を大幅修正
@@ -17,9 +17,11 @@ | ||
17 | 17 | /// </summary> |
18 | 18 | public class MikuMikuDanceXNA |
19 | 19 | { |
20 | + /// <summary> | |
21 | + /// モーショントラックの最大トラック数 | |
22 | + /// </summary> | |
23 | + public const int MotionTrackCap = 30; | |
20 | 24 | |
21 | - internal const int MotionTrackCap = 6;//モーショントラックのデータ確保数 | |
22 | - | |
23 | 25 | #if XBOX//スレッド用の定数を用意したが、XBoxのGC回避のために使えない…… |
24 | 26 | internal const int NumThread = 4;//使用するスレッド数 |
25 | 27 | #else |
@@ -16,18 +16,15 @@ | ||
16 | 16 | //親のモデル |
17 | 17 | MMDModel mmdModel; |
18 | 18 | //現在のモーション一覧 |
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);//オブジェクトプール | |
21 | 22 | |
22 | - | |
23 | - | |
24 | 23 | /// <summary> |
25 | 24 | /// 一秒あたりのフレーム数 |
26 | 25 | /// </summary> |
27 | 26 | public int FramePerSecond { get; set; } |
28 | 27 | |
29 | - | |
30 | - | |
31 | 28 | /// <summary> |
32 | 29 | /// 親のモデルクラスからアニメーションプレイヤーを生成 |
33 | 30 | /// </summary> |
@@ -34,36 +31,43 @@ | ||
34 | 31 | /// <param name="model">親のモデルクラス</param> |
35 | 32 | internal AnimationPlayer(MMDModel model)//内部からのみ |
36 | 33 | { |
37 | - mmdMotion.Capacity = MikuMikuDanceXNA.MotionTrackCap; | |
38 | 34 | for (int i = 0; i < MikuMikuDanceXNA.MotionTrackCap; i++) |
39 | - trackPool.Add(new MotionTrack()); | |
35 | + mmdMotion[i] = new MotionTrack(); | |
40 | 36 | mmdModel = model; |
41 | 37 | FramePerSecond = 30;//MMDは30フレーム/秒が標準 |
42 | 38 | } |
43 | 39 | |
44 | 40 | /// <summary> |
45 | - /// モーションをセット | |
41 | + /// 開いているトラックにモーションをセット | |
46 | 42 | /// </summary> |
47 | 43 | /// <param name="motion">セットするMMDモーションデータ</param> |
48 | 44 | /// <param name="SetStartPos">0フレームのデータでポーズを初期化する</param> |
49 | - /// <returns>セットしたモーションの番号</returns> | |
45 | + /// <returns>セットしたトラックの番号。開いているトラックが無ければ-1</returns> | |
50 | 46 | public int SetMotion(MMDMotion motion, bool SetStartPos) |
51 | 47 | { |
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; | |
65 | 56 | } |
66 | 57 | /// <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> | |
67 | 71 | /// モーションをストップする |
68 | 72 | /// </summary> |
69 | 73 | public void Stop(int index) |
@@ -75,7 +79,7 @@ | ||
75 | 79 | /// </summary> |
76 | 80 | public void StopAll() |
77 | 81 | { |
78 | - for (int i = 0; i < Count; i++) | |
82 | + for (int i = 0; i < mmdMotion.Length; i++) | |
79 | 83 | { |
80 | 84 | Stop(i); |
81 | 85 | } |
@@ -100,7 +104,7 @@ | ||
100 | 104 | /// <param name="bLoopPlay">ループプレイ</param> |
101 | 105 | public void StartAll(GameTime gameTime, bool bLoopPlay) |
102 | 106 | { |
103 | - for (int i = 0; i < Count; i++) | |
107 | + for (int i = 0; i < mmdMotion.Length; i++) | |
104 | 108 | { |
105 | 109 | Start(i, gameTime, bLoopPlay); |
106 | 110 | } |
@@ -123,20 +127,7 @@ | ||
123 | 127 | { |
124 | 128 | return mmdMotion[index].IsLoopPlay; |
125 | 129 | } |
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 | + | |
140 | 131 | |
141 | 132 | /// <summary> |
142 | 133 | /// アニメーションの更新 |
@@ -144,10 +135,10 @@ | ||
144 | 135 | /// <remarks>モデルのUpdateから呼ばれるので、ユーザーが呼ぶ必要はありません</remarks> |
145 | 136 | internal void Update(int motionIndex) |
146 | 137 | { |
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++) | |
148 | 139 | { |
149 | 140 | //再生中かどうかチェック |
150 | - if (mmdMotion[i].IsPlay) | |
141 | + if (!mmdMotion[i].IsEmpty && mmdMotion[i].IsPlay) | |
151 | 142 | { |
152 | 143 | //現在の再生フレームを更新 |
153 | 144 | //InnerUpdate(mmdMotion[i].motion, mmdMotion[i].GetFrame(FramePerSecond)); |
@@ -15,8 +15,10 @@ | ||
15 | 15 | decimal beforeMS = 0; |
16 | 16 | decimal LossTime = 0; |
17 | 17 | |
18 | + internal bool IsEmpty = true; | |
19 | + | |
18 | 20 | 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; } | |
20 | 22 | |
21 | 23 | internal void Stop() |
22 | 24 | { |