ディレクトリ:
bokoboko000L.vmd
bokoboko.pmd
ソースコード:
#includ <DxLib.h>
#includ <windows.h> // WinMainの注釈用
#includ <cstdio>
#includ <cmath> // sin, cos関数用
// グローバル変数
float CameraX = 0.0f; // カメラのX座標
float CameraZ = -30.0f; // カメラのZ座標(初期値として後方に配置)
float CameraY = 10.0f; // カメラのY座標(高さ)
float MoveSpeed = 0.5f; // カメラの移動速度
// グリッドを描画する関数
void DrawGrid(int gridSize, int gridStep)
{
int gridColor = GetColor(200, 200, 200); // グリッドの色を薄いグレーに変更
for (int x = -gridSize; x <= gridSize; x += gridStep)
{
// Z軸に平行な線を描画(色を強くするため、太い線を表現)
DrawLine3D(VGet((float)x, 0.0f, (float)-gridSize), VGet((float)x, 0.0f, (float)gridSize), gridColor);
}
for (int z = -gridSize; z <= gridSize; z += gridStep)
{
// X軸に平行な線を描画(色を強くするため、太い線を表現)
DrawLine3D(VGet((float)-gridSize, 0.0f, (float)z), VGet((float)gridSize, 0.0f, (float)z), gridColor);
}
}
// プログラムは WinMain から始まります
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow)
{
ChangeWindowMode(TRUE); // ウィンドウモードで起動
int ModelHandle, AttachIndex;
float TotalTime, PlayTime = 0.0f; // アニメーション再生時間を保持
SetGraphMode(800, 600, 32); // ウィンドウサイズを800x600に設定
SetBackgroundColor(0, 0, 0); // 背景を黒に設定
if (DxLib_Init() == -1) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
SetDrawScreen(DX_SCREEN_BACK); // 描画先画面を裏画面にセット
// カメラの初期設定
SetCameraNearFar(0.1f, 100.0f);
// モデルの読み込み(PMDファイル)
ModelHandle = MV1LoadModel("C:\\Users\\PC\\Downloads\\ボコボコにしてやんよ\\ボコボコにしてやんよ\\bokoboko.pmd");
if (ModelHandle == -1)
{
MessageBox(NULL, "モデルの読み込みに失敗しました。", "エラー", MB_OK);
DxLib_End();
return -1;
}
AttachIndex = MV1AttachAnim(ModelHandle, 0, -1, FALSE);
TotalTime = MV1GetAttachAnimTotalTime(ModelHandle, AttachIndex);
// 色の定義(白色)
int siro = GetColor(255, 255, 255);
while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
{
// アニメーションの再生時間を進める
PlayTime += 0.086f; // 60FPS想定で時間を進める
if (PlayTime > TotalTime)
{
PlayTime = 0.0f; // アニメーションをループさせる
}
// アニメーションの進行に合わせてキャラクターを再生
MV1SetAttachAnimTime(ModelHandle, AttachIndex, PlayTime);
// カメラ移動処理 (W, A, S, Dキーで移動)
if (CheckHitKey(KEY_INPUT_W) != 0)
{
PlayTime = 0.0f;
// 前進(Z軸方向にプラス)
CameraZ += MoveSpeed;
}
if (CheckHitKey(KEY_INPUT_S) != 0)
{
// 後退(Z軸方向にマイナス)
CameraZ -= MoveSpeed;
}
if (CheckHitKey(KEY_INPUT_A) != 0)
{
// 左移動(X軸方向にマイナス)
CameraX -= MoveSpeed;
}
if (CheckHitKey(KEY_INPUT_D) != 0)
{
// 右移動(X軸方向にプラス)
CameraX += MoveSpeed;
}
if
// カメラの位置とターゲット(正面に固定)
VECTOR CameraPosition = VGet(CameraX, CameraY, CameraZ);
VECTOR CameraTarget = VGet(CameraX, CameraY, CameraZ + 1.0f); // カメラの向きは常にZ軸方向に設定
SetCameraPositionAndTarget_UpVecY(CameraPosition, CameraTarget);
// 画面のクリア
ClearDrawScreen();
// グリッドの描画
DrawGrid(40, 4); // グリッドサイズを大きく、ステップ間隔も大きくしました
// 3Dモデルの描画
MV1DrawModel(ModelHandle);
// 2Dテキストの描画 - カメラ位置の表示
DrawFormatString(0, 0, siro, "Camera X: %.2f", CameraX); // カメラのX位置を表示
DrawFormatString(0, 20, siro, "Camera Z: %.2f", CameraZ); // カメラのZ位置を表示
DrawFormatString(0, 40, siro, "PlayTime: %.2f", PlayTime); // アニメーションの再生時間を表示
// 矢印キーの状態を表示
if (CheckHitKey(KEY_INPUT_UP)) {
DrawString(0, 60, "↑ Up key pressed", siro); // ↑キーが押されている場合
}
if (CheckHitKey(KEY_INPUT_DOWN)) {
DrawString(0, 80, "↓ Down key pressed", siro); // ↓キーが押されている場合
}
if (CheckHitKey(KEY_INPUT_LEFT)) {
DrawString(0, 100, "← Left key pressed", siro); // ←キーが押されている場合
}
if (CheckHitKey(KEY_INPUT_RIGHT)) {
DrawString(0, 120, "→ Right key pressed", siro); // →キーが押されている場合
}
// 画面更新
ScreenFlip();
}
// モデルの解放とDXライブラリの終了
MV1DeleteModel(ModelHandle);
DxLib_End();
return 0;
}
デスクトップマスコットのキャラクターを操作できるようにしたいです。
やりたいこと★
フレームの取得がしたい:どうすれば、vmdのアニメーションのフレームを操作できますか?
モデルの消滅させたくない:vmdの動画が終わるとキャラクターが消滅してしまいます。
Shift+で走る。
右キーをおせば右に向いて歩く
左キーをおせば左向いて歩く
上キーを押せばジャンプする。
下キーを押せば画面にづいてくる。nearの調整で透過させない
httpps://bowlroll.net/file/9451 モデル。