質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

1回答

1166閲覧

DirectX キーフレームアニメーションのデータを読み込むとデータが壊れてる

piced

総合スコア60

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2021/08/27 19:35

編集2021/08/28 17:25

ゲーム制作をしています。
ゲームに2Dのキーフレームアニメーションを実装しようとしています。
やや混乱しており、支離滅裂な説明で申し訳ないのです。

#問題が発生した経緯
アニメーションを製作できるエディター的な環境をゲーム内に実装して、
ゲーム全体を完成させる前に、アニメーションをいくつか作成しました。
具体的には、可変長配列のキーフレームのデータをfwrite()の"wb"で保存しました。
この段階ではfread()の"rb"で読み込みも正常です。

その後、アニメーションとは関係のないDollクラスやPlayerクラスに変更を加えた後、
再びアニメーションを読み込んだところ、
キャラの各部位の角度やオフセットの情報がめちゃくちゃになっていました。
ですがアニメーションの長さなど、一部のデータは無事でした。

#質問
0.
PlayerやDoll関係ないクラスを変更して読み込めなくなることはあるのでしょうか。
私的には「関係ないクラス」と思っているつもりで、
何かしら関係を持ってしまっているのでしょうか。

そもそも実装方法がおかしいといった根本的な問題や、
実装方法の提案などありましたら教えていただきたいです。

#各クラスの説明
自分はUnityのコードスタイルをマネしており、
そこから推測していただけるとわかりやすいかもしれません。

  • Player

操作するオブジェクトです。描画は行わず、キャラの表現はDollに任せています。

  • Doll

MotionData.Keyframes[キーフレーム番号].partsData[パーツ番号]から
メンバのm_partsの制御を行います。
partsDataから情報を読み取り、Partsのローカル位置、ローカル角度、ローカル拡縮、
テクスチャ原点、可視/不可視を更新します。
ローカル位置、ローカル角度、ローカル拡縮、テクスチャ原点については、
滑らかに表現するため、キーフレーム間で線形補間を行います。

  • Parts

親オブジェクトに常に追従します。
キャラの関節などを表現するためにローカル空間の概念があります。
m_ownerDollは自分を保有しているDoll、
m_parentIndexは親パーツの添え字番号で、
m_ownerDoll.m_parts[]から親パーツへアクセスします。

  • GameObject

Unityでいうtransformと、テクスチャ表示機能があります。
これが位置や角度、オフセットといった情報を持っています。
詳細はTransform2D.h、TextureRenderer.hを参照ください。

#ヘッダ

C++

1//Player.h 操作して動かすオブジェクト 2#pragma once 3 4#include "object.h" 5#include "Vector2.h" 6#include "collision2d.h" 7#include "Doll.h" 8//#include "Scene_Test.h" 9class TestScene; 10 11class Player :public GameObject 12{ 13private: 14 TestScene *m_scene; 15 float m_jumpHight; 16 float m_walkSpeed; 17 float m_gravity; 18 Vector2 m_velocity; 19 Collision2D m_collision; 20 Doll::MotionData m_motionList; 21 Doll m_doll; 22 23public: 24 Player(TestScene *ownerScene); 25 void Init(); 26 void Draw()override; 27 void Update(); 28}; 29 30

C++

1//Doll.h Playerに追従してアニメーションを表現する人形 2#pragma once 3#include "object.h" 4#include "parts.h" 5#include "texMgr.h" 6 7class DollEditor; 8 9class Doll :public GameObject 10{ 11 friend DollEditor; //アニメーションエディタ 12 friend Parts; //体のパーツ 13 static const short MAX_PARTS = 16; 14 15 //専用の構造体 16public: 17 struct MotionData //アニメーションのデータ 18 { 19 /*言葉の使い分け 20 キーフレーム:モーション中にあるアンカーポイント 21 フレーム:キーフレームの再生時間の単位 22 */ 23 24 struct KeyFrame 25 { 26 unsigned short frameDuration; //次のキーフレームに代わるまでのフレーム数(60F = 1S) 27 Parts partsData[MAX_PARTS]; //Dollの全パーツの情報を記録するもの 28 29 KeyFrame(); 30 }; 31 unsigned short keyframeNum; //モーションが持つキーフレームの数 32 KeyFrame *keyframes; //モーションのキーフレーム(SetKeyframeLength()で初期化する必要がある) 33 bool doLoop; //モーションをループさせるか 34 //以下キーフレームごとに管理しないパラメータ 35 Vector2 partsOffset[Doll::MAX_PARTS]; 36 TextureManager::TextureType partsTexture[Doll::MAX_PARTS]; 37 38 MotionData(); 39 void SaveMotion(const char *fileName); 40 void LoadMotion(const char *fileName); 41 }; 42 43 //メンバ変数 44private: 45 Parts m_parts[MAX_PARTS]; 46 MotionData m_currentMotion; //現在のモーションデータ 47 unsigned short m_currentFrame; //現在のキーフレームの再生時間の位置(1秒 = 60F) 48 unsigned short m_currentKeyframe; //現在のキーフレーム番号 49 bool m_isPlayingMotion; //モーションの再生/停止を制御 50 51public: 52 Doll(); 53 ~Doll(); 54 void Init()override; 55 void Update(); 56 void Draw()override; 57 void PlayMotion(); 58 void StopMotion(); 59 void ChangeMotion(MotionData); 60};

C++

1//Parts.h 2#pragma once 3#include "object.h" 4class Doll; 5class DollEditor; 6class Parts :public GameObject 7{ 8 friend Doll; 9 friend DollEditor; 10 11private: 12 const Doll *m_ownerDoll; //このパーツを持っているDoll 13 short m_parentIndex; //親パーツのパーツ番号 (m_ownerDollのパーツにアクセスするときに使う) 14 bool m_isVisible; //描画するかどうか (true = 見える) 15 Transform2D m_local; //ローカル空間の情報(ワールド空間はm_transform) 16 17public: 18 static const short NoParentIndex = -1; //親のパーツが無い時の番号 parentIndexで使う 19 20public: 21 Parts(); 22 void Init(const Doll *ownerDoll); 23 void Update(); 24 void Draw()override; 25};

C++

1//GameObject.h 2 3#pragma once 4#include "main.h" 5#include "Transform2D.h" 6#include "TextrureRenderer.h" 7 8 9class GameObject 10{ 11 //メンバ変数 12protected: 13 bool m_active; //true = 活動中 14 Transform2D m_transform; //位置、拡縮、角度の情報 15 TextrureRenderer m_texRenderer; //テクスチャ情報 16 17 //プロトタイプ宣言 18public: 19 virtual void Init(); //初期化 20 virtual void Draw(); //描画処理 21 22 //セッター&ゲッター 23 bool IsActive()const; 24 void SetActive(bool); 25 Transform2D GetTransform()const; 26 void SetTransform(Transform2D); 27 void SetPosition(Vector2); 28 void SetScale(Vector2); 29 void SetAngle(float); 30 TextrureRenderer GetTextrureRenderer()const; 31 void SetTextureRenderer(TextrureRenderer); 32};

C++

1//Transfrom2D.h 2#pragma once 3#include "Vector2.h" 4 5struct Transform2D 6{ 7 Vector2 position; 8 Vector2 scale; 9 float angle; 10 11 Transform2D(); 12 static Transform2D Transition(Transform2D min, Transform2D max, float percent); 13};

C++

1//TextrureRenderer.h 2#pragma once 3 4#include "polygonDrawer.h" 5#include "Transform2D.h" 6#include "Color.h" 7#include "Vector2.h" 8#include "texMgr.h" 9 10struct TextrureRenderer 11{ 12 Texture m_texture; //テクスチャ 13 Vector2 m_polygonSize; //ポリゴン矩形の大きさ(横幅、縦幅) 14 Vector2 m_offset; //原点(この点が中心になるようにずれる) 15 Vector2 m_texUV; //(x,y) = (u,v) 16 Vector2 m_texSize; //x横幅 y縦幅 それぞれ0.0f ~ 1.0f 17 Color m_color; //(red,green,blue,alpha)0.0f~1.0f 18 Transform2D *m_ownerTransform; //位置、角度を参照します 19 20 TextrureRenderer(); 21 ~TextrureRenderer(); 22 void Draw(bool isUI); 23};

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Serbonis

2021/08/28 12:12

>キャラの各部位の角度やオフセットの情報がめちゃくちゃになっていました。 具体的にはどのクラスのどのメンバ変数の事を指していますでしょうか?
piced

2021/08/28 17:29

Transform2Dのposition,angle,scaleと、 TextureRendererのm_offsetです。 なおVector2はxyのfloatを持っています。
fana

2021/08/30 04:34 編集

読込処理で何が起こっているかデバッグしたら良いだけの話ではないのですか? 読込処理の動作を追えば,不適切な結果が いつ/どうやって 生じているのかを突き止めることができると思うのですが. 保存済みのファイルの何バイト目に何がどう入ってるのかをあなたは知っていて, そのファイルの読込処理が妥当であれば何バイト目のデータがどこにどんな形で突っ込まれるのか,とかいう話もまたあなたは知っているわけですから, 話通りに事が進んでいくかどうかを確認してみればよいでしょう. 「変更」前が正しいというなら,変更前後での動作比較をしてみてもよいでしょうし.
guest

回答1

0

自己解決

コメントで指摘されたように、
読み込まれるデータを一つずつ確認していくことで、
原因を突き止めました。

投稿2021/09/20 17:37

piced

総合スコア60

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問