軽量化のために物理演算をモデルごとにずらそうとしているのですが、垂直同期を切って自前で待機している場合物理演算の反映がされないようです。
こちらの改善方法はございますでしょうか…
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
int ModelHandle;
int PosX, PosZ, PosY;
SetWaitVSyncFlag(FALSE);
// DXライブラリの初期化
if (DxLib_Init() < 0)
{
// エラーが発生したら直ちに終了
return -1;
}
// 次に読み込むモデルの物理演算モードをリアルタイム物理演算にする
MV1SetLoadModelUsePhysicsMode(DX_LOADMODEL_PHYSICS_REALTIME);
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel("teio/model.pmx");
int anim = MV1AttachAnim(ModelHandle, 0);
// 描画先を裏画面に変更
SetDrawScreen(DX_SCREEN_BACK);
// カメラに映る範囲( カメラからの距離の範囲 )を設定
SetCameraNearFar(10.0f, 1000.0f);
// カメラの位置と向きを設定
SetCameraPositionAndTarget_UpVecY(VGet(0.0f, 19.0f, -22.5f), VGet(0.0f, 10.0f, 0.0f));
// 座標をリセット
PosX = 0;
PosY = 0;
PosZ = 0;
int cnt = 0;
float time = 0;
// ウインドウが閉じられるまでループ
while (ProcessMessage() == 0)
{
auto waits = GetNowHiPerformanceCount();
// 画面をクリア
ClearDrawScreen();
// キーボードの上下左右でモデルの座標を変更
// ( シフトキーを押しながら上下キーでモデルを上下に移動 )
if (CheckHitKey(KEY_INPUT_LSHIFT))
{
if (CheckHitKey(KEY_INPUT_DOWN)) PosY--;
if (CheckHitKey(KEY_INPUT_UP)) PosY++;
}
else
{
if (CheckHitKey(KEY_INPUT_LEFT)) PosX--;
if (CheckHitKey(KEY_INPUT_RIGHT)) PosX++;
if (CheckHitKey(KEY_INPUT_DOWN)) PosZ--;
if (CheckHitKey(KEY_INPUT_UP)) PosZ++;
}
// モデルの座標をセット
MV1SetPosition(ModelHandle, VGet(PosX * 0.5f, PosY * 0.5f, PosZ * 0.5f));
time += 30.f / GetFPS()*0.2f;
if (time >= MV1GetAttachAnimTotalTime(ModelHandle, anim)) {
time = 0.f;
}
MV1SetAttachAnimTime(ModelHandle, anim, time);
MV1SetAttachAnimBlendRate(ModelHandle, anim, 1.f);
// 物理演算を60分の1秒経過したという想定で実行
if (time == 0.f) {
MV1PhysicsResetState(ModelHandle);
}
else {
if (cnt == 0) {
MV1PhysicsCalculation(ModelHandle, 1000.0f / 60.0f*2.f);
}
}
++cnt %= 2;
// 3Dモデルの描画
MV1DrawModel(ModelHandle);
// 裏画面の内容を表画面に反映
ScreenFlip();
while ((GetNowHiPerformanceCount() - waits) <= (1000 * 1000 / 60)) {}
}
// モデルハンドルの削除
MV1DeleteModel(ModelHandle);
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}