無事軽くなったようで何よりです
> コンテンツとして面白くなるように、動画では何かと大げさに表現することもありますが、
> どうか気にしないでくださいませ;
本来必要の無い苦労をお掛けしてしまったことは事実なので
申し訳ない気持ちに変わりはありませんが、
そう言っていただけると救われます m(_ _;m
> 可変fps
MHFは触ったことが無いのでわかりませんが、「弾当てゲーム」の「描画部分だけ可変レート」を
発展させて「ソフトの進行処理」も可変にしたものです
キャラクターの行動やアニメーションの再生時間進行を全て「経過時間」を考慮するようにすると、
どんなに fps が下がってもソフト内の進行速度は下がることがなくなります
可変fpsのサンプルを作ってみました、サンプルプログラム実行用フォルダの中にある
DxChara.x があれば実行できます、解説はプログラムの後で・・・
#include "DxLib.h"
#define SPEED (800.0f) // モデルの移動スピード
#define SPACE (250.0f) // 1体辺りの描画間隔
// 描画モデル数の初期値
int DrawModelNum = 1 ;
// WinMain
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
float FrameTime ;
LONGLONG PrevTime ;
int ModelHandle ;
int i, j ;
float HalfSize ;
float DrawX ;
int AnimAttachIndex ;
float AnimPlayTime ;
// ウインドウモード
ChangeWindowMode( TRUE ) ;
// VSYNC待ちをしない
SetWaitVSyncFlag( FALSE ) ;
// DXライブラリ初期化処理
if( DxLib_Init() == -1 )
return -1; // エラーが起きたら直ちに終了
// モデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// カメラのセット
SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 2769.0f, -2600.0f ), VGet( 0.0f, 170.0f, -380.0f ) ) ;
// アニメーションのアタッチ
AnimAttachIndex = MV1AttachAnim( ModelHandle, 0 ) ;
// アニメーションの再生時間をリセット
AnimPlayTime = 0.0f ;
// 最初のフレームの経過時間は60分の1秒
FrameTime = 1.0f / 60.0f ;
// 最初の時間を取得しておく
PrevTime = GetNowHiPerformanceCount() ;
// 描画位置を初期化
DrawX = 0.0f ;
// メインループ
while( ProcessMessage() == 0 )
{
ClearDrawScreen() ;
// 上下キーで描画モデルの数を増減
switch( GetInputChar( TRUE ) )
{
case CTRL_CODE_DOWN :
if( DrawModelNum > 1 ) DrawModelNum -- ;
break ;
case CTRL_CODE_UP :
DrawModelNum ++ ;
break ;
}
// 左右キーで描画位置を移動
if( CheckHitKey( KEY_INPUT_LEFT ) )
{
DrawX -= SPEED * FrameTime ;
}
if( CheckHitKey( KEY_INPUT_RIGHT ) )
{
DrawX += SPEED * FrameTime ;
}
// アニメーション処理
AnimPlayTime += 6000.0f * FrameTime ;
if( AnimPlayTime >= MV1GetAttachAnimTotalTime( ModelHandle, AnimAttachIndex ) )
{
AnimPlayTime -= MV1GetAttachAnimTotalTime( ModelHandle, AnimAttachIndex ) ;
}
MV1SetAttachAnimTime( ModelHandle, AnimAttachIndex, AnimPlayTime ) ;
// モデルの描画
HalfSize = ( DrawModelNum - 1 ) * SPACE / 2.0f ;
for( i = 0 ; i < DrawModelNum ; i ++ )
{
for( j = 0 ; j < DrawModelNum ; j ++ )
{
MV1SetPosition( ModelHandle, VGet( -HalfSize + j * SPACE + DrawX, 0.0f, -HalfSize + i * SPACE ) ) ;
MV1DrawModel( ModelHandle ) ;
}
}
// 情報描画
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "FrameTime:%.4f秒", FrameTime ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "FPS:%.3f", 1.0f / FrameTime ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "DrawNum:%d", DrawModelNum * DrawModelNum ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "DrawX:%.1f", DrawX ) ;
DrawString( 0, 480 - 16, "操作 キーボード上下:描画モデル増減 キーボード左右キー:描画位置移動", GetColor( 255,255,255 ) ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
// このフレームの経過時間を算出
FrameTime = ( float )( GetNowHiPerformanceCount() - PrevTime ) / 1000000.0f ;
// 今の時間を保存
PrevTime = GetNowHiPerformanceCount() ;
}
// DXライブラリ使用の終了処理
DxLib_End() ;
// ソフトの終了
return 0 ;
}
実行すると DxChara.x が歩くモーションが流れている状態で1体だけ描画されています
画面左上には1フレームに経過した時間とそこから導き出されるFPSと描画されている
モデルの数とモデルの描画X座標が表示されています
キーボードの上キーを押すと描画されるモデルの数がガンガン増えていきます
増えると共にfpsは下がりますが、モデルの歩くモーションの流れる早さは変わりません
キーボードの左右キーを押すとモデルの描画位置が左右に移動しますが、この移動の速度も
fpsに関わらず一定です
なぜそうなっているかと言いますと、「モーションの再生時間をどれだけ進めるか」や
「どれだけ描画位置を変化させるか」の計算に1フレームの経過時間(変数 FrameTime )を
使用しているからです、この方式を使うと理論上はfpsがどんなに下がってもソフトの進行速度は
下がらなくなります
マシンに掛かる負荷やPCの性能によってfpsが変動し続けるのでオンラインシステムを構築する場合に
経過フレーム数を基準とした同期処理はできなくなりますが、この方式だと30fps固定にするより更に
実行できる環境が増えると思います
アクション要素があったりすると高性能PCを持っている方が有利になってしまいますが・・・