MMDモーション再生について2
Posted: 2013年10月10日(木) 20:35
アドバイスを元に少し間が空きましたが自分なりにフラグ処理を入れてみました1.スペースキーが押されたら再生時間を初期化して「再生中」のフラグを立てる
2.「再生中」のフラグが立っていたら
2-1.再生時間を進め、再生時間をセットする
2-2.再生時間があらかじめ決めた時間に達したら、「再生中」のフラグを折る
http://dixq.net/g/25.html
やはりキックのモーション再生がうまくいきません
実行結果が150.0fまで0.4fの早さで再生のはずがモーション中の0.4fの場面を表示になってしまいます
bool型も試しましたが結果は変わりませんでした
初心者
環境:[OS]windows7 [コンパイラ名]VC++ 2008EE
DXライブラリ
#include "DxLib.h"
typedef struct{
int playing_flag;
}ch_t;
int Key[256]; // キーが押されているフレーム数を格納する
// キーの入力状態を更新する
int gpUpdateKey(){
char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
for( int i=0; i<256; i++ ){
if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
Key[i]++; // 加算
} else { // 押されていなければ
Key[i] = 0; // 0にする
}
}
return 0;
}
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ch_t ch;
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
int ModelHandle, AttachIndex ;
float TotalTime, PlayTime ;
ch.playing_flag=0 ;
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "Lat式ミク.pmd" ) ;
//奥行0.1~1000までをカメラの描画範囲とする
SetCameraNearFar( 0.1f, 1000.0f ) ;
//(0,10,-20)の視点から(0,10,0)のターゲットを見る角度にカメラを設置
SetCameraPositionAndTarget_UpVecY( VGet( 0, 20, -20 ), VGet( 0.0f, 10.0f, 0.0f ) ) ;
// 3Dモデルの1番目のアニメーションをアタッチする
AttachIndex = MV1AttachAnim( ModelHandle, 0, -1, FALSE ) ;
// アタッチしたアニメーションの総再生時間を取得する
TotalTime = MV1GetAttachAnimTotalTime( ModelHandle, AttachIndex ) ;
// 再生時間の初期化
PlayTime = 0.0f ;
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){
if( Key[KEY_INPUT_SPACE] == 1 ){ // スペースキーが押された瞬間なら
PlayTime = 0.0f ; //再生時間を初期化
ch.playing_flag=0 ; //「再生中」のフラグを立てる
if( ch.playing_flag=1 ){ //「再生中」のフラグが立っていたら
PlayTime += 0.4f ;// 再生時間を進める
MV1SetAttachAnimTime( ModelHandle, AttachIndex, PlayTime ) ;// 再生時間をセットする
}
if( PlayTime = 150.0f ){//再生時間があらかじめ決めた時間に達したら
ch.playing_flag=0 ; //「再生中」のフラグを折る
}
}
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}
#include "DxLib.h"
int Key[256]; // キーが押されているフレーム数を格納する
// キーの入力状態を更新する
int gpUpdateKey(){
char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
for( int i=0; i<256; i++ ){
if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
Key[i]++; // 加算
} else { // 押されていなければ
Key[i] = 0; // 0にする
}
}
return 0;
}
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
int ModelHandle, AttachIndex ;
float TotalTime, PlayTime ;
bool playing_Flag=false ;
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "dat/ソリッド・スネーク ver1.2/ソリッド・スネーク.pmd" ) ;
//奥行0.1~1000までをカメラの描画範囲とする
SetCameraNearFar( 0.1f, 1000.0f ) ;
//(0,10,-20)の視点から(0,10,0)のターゲットを見る角度にカメラを設置
SetCameraPositionAndTarget_UpVecY( VGet( 0, 20, -20 ), VGet( 0.0f, 10.0f, 0.0f ) ) ;
// 3Dモデルの1番目のアニメーションをアタッチする
AttachIndex = MV1AttachAnim( ModelHandle, 0, -1, FALSE ) ;
// アタッチしたアニメーションの総再生時間を取得する
TotalTime = MV1GetAttachAnimTotalTime( ModelHandle, AttachIndex ) ;
// 再生時間の初期化
PlayTime = 0.0f ;
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){
if( Key[KEY_INPUT_SPACE] == 1 ){ // スペースキーが押された瞬間なら
PlayTime = 0.0f ; //再生時間を初期化
playing_Flag=true ; //「再生中」のフラグを立てる
if( playing_Flag=true ){ //「再生中」のフラグが立っていたら
PlayTime += 0.4f ; // 再生時間を進める
MV1SetAttachAnimTime( ModelHandle, AttachIndex, PlayTime ) ; // 再生時間をセットする
}
if( PlayTime = 150.0f ){ //再生時間があらかじめ決めた時間に達したら
playing_Flag=false ; //「再生中」のフラグを折る
}
}
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}