注意:Dxlibの勉強中の初心者さん 丁寧に接していただければ幸いです。
主(kukaniki)は、独学でしております。
3Ⅾキャラクターの表示とアニメーション実現が出来ましたが。
3Ⅾキャラクター.pmdの作り方やアニメーションの探すサイトがわかりません。
〇 情報不足 :
書籍が古いのが多くて情報が少ないです。
Aくん < 愚か者! 自分で探せよ!
kukaniki < ワイ友達おらんしプログラミング教室、月額日ぼったくりだし。
Bくん < いいわけするなよ。
〇 結論 : 棒立ちのアニメーションと走るアニメーションを併用してうまくキーボードの画面を走り回る「しょぼん(´・ω・`)」を作りたいと考えています。
pmdのキャラクターの作成方法やvmdのアニメーションの作成方法など。
有名なサイトを知りたい。
〇 現在の進行 : キーボードでの座標の確認、アニメーションの制御が理解できていなくて
個人的には、C++で作っていますが 本当は、3Dゲームを作る友達が欲しかったんです。( ;∀;)
有識者 恐れ入りますが、どうかご教示お願いいたします。
◎ 下記のソースは改変されたデモですちゃんと勉強している方でないと理解はできません。
ちゃんとしたソースが欲しいなら勉強して頂戴!( 一。一)
〇 ソース デモ :
#include "DxLib.h"
#include "windows.h" // WinMainの注釈用
#include "cstdio"
#include "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\\PC01k\\Downloads\\ボコボコにしてやんよ\\ボコボコにしてやんよ\\bokoboko.pmd");
if (ModelHandle == -1)
{
MessageBox(NULL, "モデルの読み込みに失敗しました。", "エラー", MB_OK);
DxLib_End();
return -1;
}
AttachIndex = MV1AttachAnim(ModelHandle, 1, -1, FALSE);
TotalTime = MV1GetAttachAnimTotalTime(ModelHandle, AttachIndex);
// 色の定義(白色)
int siro = GetColor(255, 255, 255);
while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
{
// アニメーションの再生時間を進める
PlayTime += 0.016f; // 60FPS想定で時間を進める
if (PlayTime > TotalTime)
{
PlayTime = 0.0f; // アニメーションをループさせる
}
// アニメーションの進行に合わせてキャラクターを再生
MV1SetAttachAnimTime(ModelHandle, AttachIndex, PlayTime);
// カメラ移動処理 (W, A, S, Dキーで移動)
if (CheckHitKey(KEY_INPUT_W) != 0)
{
// 前進(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;
}
// カメラの位置とターゲット(正面に固定)
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); // アニメーションの再生時間を表示
// 画面更新
ScreenFlip();
}
// モデルの解放とDXライブラリの終了
MV1DeleteModel(ModelHandle);
DxLib_End();
return 1;
}
〇 参考サイト :
"httP://neokiex.hatenablog.com/entry/2019/12/11/125909"
"httP://qiita.com/massoumen/items/2985a0fb30472b97a590"