モデルのアニメーションが再生が再生されません
Posted: 2011年12月25日(日) 19:58
アニメーションが再生されず、エラーもでないので手も足もでません。どうしたらいいでしょうか?
ディレクトリは同じ階層に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
unit.h(playerクラスは継承しただけです)
unit.cpp
ディレクトリは同じ階層に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の前提の速度で再生
...
#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);
}
...