ページ 11

モデルのアニメーションが再生が再生されません

Posted: 2011年12月25日(日) 19:58
by LisetteLander
アニメーションが再生されず、エラーもでないので手も足もでません。どうしたらいいでしょうか?
ディレクトリは同じ階層にmodel000.pmmが入っています。

アニメーションの表示方法は
①指定されているアニメーションのトータル時間を取得する
//float animation_total_time = MV1GetAttachAnimTotalTime(m_H_Model,m_attach);
②毎フレームカウントする
//ms_animation_count++;(コンストラクタで初期化)
③毎フレーム/2のモーションを再生するためのフレーム変数に代入するする。
//now_animation_time = (float)(ms_animation_count/2);
(MMDで作成したモーションファイル.pmmは30FPSで出力されるため毎秒60カウントしている変数を2で割った値をそのまま適用)
④トータル時間とフレーム変数を比較してフレーム変数が大きかったら初期化し、ループを図る。

unit.cppにてDrawString()でおっかけてみました。
結果は
17行目 常に表示
19行目 全く無し
21行目 常に表示
25行目 全く無し

理想では25行目が1秒間に2フレームだけ文字表示されます

main.cpp

コード:

#include "player.h"
#include "attendant.h"
#include "control.h"
#include "camera.h"
//引越予定

int ProcessLoop(int status){
	if(ScreenFlip()!=0)return -1;
	if(ProcessMessage()!=0)return -1;
	if(ClearDrawScreen()!=0)return -1;
	if(status==99)return-1;
	return 0;
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE),SetGraphMode(X_WINDOW,Y_WINDOW,16),DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

		enum{
			START,
			MAINGAME,
			GAMEEND=99
		}GAME_STATUS;
		GAME_STATUS=START;//ゲーム内メインステータス

		Cplayer Player;//ファイル分割前・引越し予定
		Ccontrol Control;//ファイル分割前・引越し予定
		Ccamera Camera;//ファイル分割前・引越し予定

		float cx=0.0f,cy=20.0f,cz=-50.0f;

		while(ProcessLoop(GAME_STATUS)==0){

				Control.gpUpdateKey();//呼び出し・引越し予定

				switch(GAME_STATUS){
					case START://引越し予定
						GAME_STATUS=MAINGAME;
						Player.Model_Load("model/model.pmd");
						Camera.CameraSetPosAng(VGet(cx,cy,cz),VGet(0,0,0));
						break;

					case MAINGAME:
						Player.Model_Change_Animation(Player.STAND);
						Player.Model_Poseing_Animation();
						Player.Model_Draw();
						break;

					case GAMEEND://終了処理だがprocessloopがやってくれる
						break;

					default:
						break;
				}
		}

		DxLib_End(); // DXライブラリ終了処理
        return 0;
}

unit.h(playerクラスは継承しただけです)

コード:

#ifndef DEF_unit_base
#define DEF_unit_base

#include "DxLib.h"
#include "define.h"
class Cunit{//ユニットの基本的なベース・モデル操作とHP・志望フラグだけ
	//基本的に"人"の継承元とする

protected:
	int m_H_Model;//モデルのハンドル
	int m_animation_num;//アニメーションの種類
	int m_attach;//現在のアタッチ。デタッチ用に格納しておく
	MATRIX m_pos_angle;//モデルの向きと位置
	bool m_flagdead,m_flagexist;//死亡フラグ,存在フラグ
	int m_hp;
	static int ms_animation_count;//アニメーションの再生時のカウンタ・多分一秒で60増えるはず
	Cunit();
public:
	//モデルアニメーション用
	enum {STAND}m_Model;
	void Model_Change_Animation(int);//アニメーションのデタッチと指定したアニメーションの種類の格納
	void Model_Poseing_Animation();//格納されている(はず)のアニメーションをゲームが60FPSの前提の速度で再生
...
unit.cpp

コード:

#ifndef DEF_unitbase
#define DEF_unitbase

#include "unit_base.h"

int Cunit::ms_animation_count;

Cunit::Cunit(){//継承した時コンストラクタが呼び出されるかどうかはわからない
	m_flagdead=0;
	m_flagexist=0;
	ms_animation_count=0;
}//コンストラクタ

void Cunit::Model_Poseing_Animation(){
	float animation_total_time = MV1GetAttachAnimTotalTime(m_H_Model,m_attach);//指定されているアニメーションの時間を取得
	float now_animation_time;

	if(animation_total_time == 0){//アニメーションが無かったらnow_timeを0にし続ける
		now_animation_time = 0;		//アニメーションはどんなposeもあるとする(無いのがあったらそこだけ呼ばないとか
	}else{
		now_animation_time = (float)(ms_animation_count/2);	//ゲームは60FPSを想定しMMDのモーションは30FPSとして
		ms_animation_count++;								//60FPSのカウント・一秒間に30FPSをカウントするために切り詰める
	}
	if(ms_animation_count>(int)animation_total_time){//
		ms_animation_count=0;//loop
	}
	MV1SetAttachAnimTime(m_H_Model, m_attach, now_animation_time);//アニメーションの適用
}

void Cunit::Model_Change_Animation(int animation){//クラスメンバの列挙体で指定してください。
	MV1DetachAnim(m_H_Model, m_attach);  //デタッチ
	m_animation_num = animation;
	m_attach = MV1AttachAnim(m_H_Model,m_animation_num);  
}

...

Re: モデルのアニメーションが再生が再生されません

Posted: 2011年12月26日(月) 00:19
by zxc
  アニメーションは多分直りませんが、とりあえず
「main.cpp」の11行目の return が効いていないと思います。

Re: モデルのアニメーションが再生が再生されません

Posted: 2011年12月26日(月) 15:14
by LisetteLander
すいません、自己解決しました。
model000.pmmファイルではなくmodel000.vmdファイルでした。