提示されたソースは、上からGame.cpp,Player.cpp,MeshComponent.cpp,Camera.cppでしょうか?
Game.h,Player.h,MeshComponent.h,Camera.hは想像で作れるかもしれませんが、Actor.h,Box1.h,Input.h,SpriteComponent.hが無い状態でデバッグするのは難しいです。
実現したいこと
c++でDxLibを用いて3Dゲームを作成したいです。
発生している問題・分からないこと
3Dモデルが全く表示されなく、先に進めていません.
3Dモデルの表示の仕方を伺いたいです
該当のソースコード
c++
1#include "DxLib.h" 2#include "Game.h" 3#include "Input.h" 4#include "Actor.h" 5#include "Player.h" 6#include "Camera.h" 7#include "Box1.h" 8#include "SpriteComponent.h" 9#include "MeshComponent.h" 10#include <algorithm> 11Game::Game() 12 :mIsRunning(true) 13 , mIsUpdatingActors(false) 14{ 15 16} 17 18bool Game::Initialize() { 19 20 // 画面モードの設定 21 SetGraphMode(1200, 720, 32); // 画面サイズをScreenクラスに合わせて設定してカラービット数32ビットで起動 22 SetWindowSize(1200, 720);// ウィンドウサイズをScreenクラスに合わせて設定(こことSetGraphModeのサイズが異なると画像がゆがむ) 23 ChangeWindowMode(TRUE);//フルスクリーン表示かウィンドウ表示か 24 SetMouseDispFlag(TRUE);// ここをFALSEにするとマウスカーソル非表示 25 SetMainWindowText("3Dシューティングゲーム");//この行でエラーになったら【設定】マルチバイト文字セットが間違ってるかも 26 27 28 29 //↑ここまでの設定は↓下のDXライブラリ初期化より先にやらないとDxLib_Init()中は画面がフルスクリーンになって終わってからウィンドウサイズが変更になり見苦しい 30 // DXライブラリの初期化 31 if (DxLib_Init() < 0) 32 { 33 // DXの初期化にエラーが発生したらプログラム自体を終了(returnで) 34 return false; 35 } 36 37 38 DxLib::SetDrawScreen(DX_SCREEN_BACK); // 描画面を裏画面にする 39 // --- ここから 3D 描画に必須の設定 --- 40 41 // Zバッファを使う(3Dモデル描画には必須) 42 SetUseZBuffer3D(TRUE); 43 SetWriteZBuffer3D(TRUE); 44 45 // ライトを有効化(無いとモデルが真っ黒になる) 46 SetLightEnable(true); 47 48 // 投影行列(視野角)を設定 49 SetupCamera_Perspective(DX_PI_F / 4.0f); 50 51 // --- 必須設定ここまで --- 52 53 54 LoadData(); 55 mTicksCount = GetNowCount(); 56 Input::Init(); 57 58 59 return true; 60} 61 62void Game::RunLoop() 63{ 64 while (mIsRunning && ProcessMessage() == 0) 65 { 66 ProcessInput(); 67 UpdateGame(); 68 GenerateOutput(); 69 } 70 71 72} 73 74void Game::ProcessInput() 75{ 76 //Input::Update(); 77 //if (Input::GetButton(PAD_INPUT_A)) 78 //{ 79 // mIsRunning = false; 80 //} 81 //mPlayer->ProcessKeyboard(); 82} 83 84void Game::UpdateGame() { 85 while (!TICKS_PASSED(GetNowCount(), mTicksCount + 16.0f)); 86#if 1 87 // deltatimeは前のフレームとの時刻の差を秒に変換した値 88 float deltaTime = (GetNowCount() - mTicksCount) / 1000.0f; 89 //deltatimeを最大値で制限する 90 if (deltaTime > 0.05f) 91 { 92 deltaTime = 0.05f; 93 } 94 mTicksCount = GetNowCount(); 95 // アクターを更新 96 mIsUpdatingActors = true; 97 for (auto actor : mActors) 98 { 99 actor->Update(deltaTime); 100 } 101 mIsUpdatingActors = false; 102 // 待ちになっていたアクターをmActorsに移動 103 for (auto pending : mPendingActors) 104 { 105 mActors.emplace_back(pending); 106 } 107 mPendingActors.clear(); 108 // 死んだアクターを一時配列に追加 109 std::vector<Actor*> deadActors; 110 for (auto actor : mActors) 111 { 112 if (actor->GetState() == Actor::EDead) 113 { 114 deadActors.emplace_back(actor); 115 } 116 } 117 // 死んだアクターを削除 118 for (auto actor : deadActors) 119 { 120 delete actor; 121 } 122 123 124 125#endif 126} 127 128void Game::GenerateOutput() 129{ 130 ClearDrawScreen();// 一旦キャンバスをきれいにまっさらに 131 132 133 DrawBox(0, 0, 200, 200, GetColor(255, 0, 0), TRUE); 134 // 全てのスプライトコンポーネントを描画 135 for (auto sprite : mSprites) 136 { 137 sprite->Draw(); 138 } 139 for (auto mesh : mMesh) 140 { 141 142 143 mesh->Draw(); 144 } 145 ScreenFlip(); 146} 147 148void Game::LoadData() 149{ 150 mPlayer = new Player(this); 151 mBox1 = new Box1(this); 152 mCamera = new Camera(this); 153 mCamera->SetTarget(Vector3(0.0f, 3.0f, 0.0f)); 154 //mPlayer = new Player(this); 155 //mPlayer->SetPosition(Vector3(0.0f, 0.0f,0.0f)); 156 //mPlayer->SetScale(1.0f); 157 //mBoss1 = new Boss1(this, 20); 158 //mBoss1->SetPosition(Vector2(392.0f, 130.0f)); 159 //mBoss1->SetScale(1.0f); 160} 161 162void Game::UnloadData() 163{ 164} 165 166int Game::GetTexture(const std::string& fileName) 167{ 168 int tex = -1; 169 170 // テクスチャがすでにマップに入っているのか? 171 auto iter = mTextures.find(fileName); 172 if (iter != mTextures.end()) 173 { 174 tex = iter->second; 175 } 176 else 177 { 178 const char* cstr = fileName.c_str(); 179 tex = LoadGraph(cstr); 180 // mTexturesに作成したテクスチャを追加 181 mTextures.emplace(fileName.c_str(), tex); 182 } 183 184 return tex; 185} 186 187int Game::GetModel(const std::string& fileName) 188{ 189 int tex = -1; 190 191 192 193 // テクスチャがすでにマップに入っているのか? 194 auto iter = mModel.find(fileName); 195 if (iter != mModel.end()) 196 { 197 tex = iter->second; 198 } 199 else 200 { 201 const char* cstr = fileName.c_str(); 202 203 204 tex = MV1LoadModel(cstr); 205 // mTexturesに作成したテクスチャを追加 206 mModel.emplace(fileName, tex); 207 } 208 return tex; 209} 210 211void Game::Shutdown() 212{ 213 214 UnloadData(); 215 // キー入力待ちをする 216 WaitKey(); 217 // DXライブラリの後始末 218 DxLib_End(); 219} 220void Game::AddActor(Actor* actor) 221{ 222 // アクターの更新中ならmPendingActorsに追加 223 if (mIsUpdatingActors) 224 { 225 mPendingActors.emplace_back(actor); 226 } 227 else 228 { 229 mActors.emplace_back(actor); 230 } 231} 232 233void Game::RemoveActor(Actor* actor) 234{ 235 // mPendingActorsのvectorからactorを検索し、該当するイテレータを返す 236 // actorが見つからない場合は最後のイテレータを返す 237 auto iter = std::find(mPendingActors.begin(), mPendingActors.end(), actor); 238 if (iter != mPendingActors.end()) 239 { 240 // 該当のイテレータをmPendingActorsの一番最後に移動し、popする 241 std::iter_swap(iter, mPendingActors.end() - 1); 242 mPendingActors.pop_back(); 243 } 244 245 // mActorsのvectorからactorを検索し、該当するイテレータを返す 246 // actorが見つからない場合は最後のイテレータを返す 247 iter = std::find(mActors.begin(), mActors.end(), actor); 248 if (iter != mActors.end()) 249 { 250 // 該当のイテレータをmPendingActorsの一番最後に移動し、popする 251 std::iter_swap(iter, mActors.end() - 1); 252 mActors.pop_back(); 253 } 254} 255 256void Game::AddBoss(Boss1* bos) 257{ 258 //mBoss1 = bos; 259} 260 261void Game::RemoveBoss(Boss1* bos) 262{ 263 //mBoss1 = nullptr; 264} 265 266void Game::AddSprite(SpriteComponent* sprite) 267{ 268 // ソート済みの配列で挿入点を見つける 269 int myDrawOrder = sprite->GetDrawOrder(); 270 auto iter = mSprites.begin(); 271 for (; 272 iter != mSprites.end(); 273 ++iter) 274 { 275 if (myDrawOrder < (*iter)->GetDrawOrder()) 276 { 277 break; 278 } 279 } 280 // イテレータの位置の前に要素を挿入する 281 mSprites.insert(iter, sprite); 282 283} 284 285void Game::RemoveSprite(SpriteComponent* sprite) 286{ 287 // (We can't swap because it ruins ordering) 288 auto iter = std::find(mSprites.begin(), mSprites.end(), sprite); 289 mSprites.erase(iter); 290} 291 292void Game::AddMesh(MeshComponent* mesh) 293{ 294 // ソート済みの配列で挿入点を見つける 295 int myDrawOrder = mesh->GetDrawOrder(); 296 auto iter = mMesh.begin(); 297 for (; 298 iter != mMesh.end(); 299 ++iter) 300 { 301 if (myDrawOrder < (*iter)->GetDrawOrder()) 302 { 303 break; 304 } 305 } 306 // イテレータの位置の前に要素を挿入する 307 mMesh.insert(iter, mesh); 308 309} 310 311void Game::RemoveMesh(MeshComponent* mesh) 312{ 313 // (We can't swap because it ruins ordering) 314 auto iter = std::find(mMesh.begin(), mMesh.end(), mesh); 315 mMesh.erase(iter); 316}
c++
1#include "Player.h" 2#include "MeshComponent.h" 3#include "Game.h" 4 5Player::Player(Game* game) 6 : Actor(game) 7{ 8 mMesh = new MeshComponent(this, 100); 9 10 int model = game->GetModel("Model/unitychan.mv1"); 11 mMesh->SetModel(model); 12 SetPosition(Vector3(0.0f, 0.0f, 0.0f)); // 少し上に 13 SetScale(1.0f); // 大きめに 14} 15 16Player::~Player() 17{ 18} 19 20void Player::UpdateActor(float deltaTime) 21{ 22 // 必要なら移動処理を書く 23} 24
c++
1#include "MeshComponent.h" 2#include "Actor.h" 3#include "Game.h" 4#include "DxLib.h" 5 6MeshComponent::MeshComponent(Actor* owner, int drawOrder) 7 : Component(owner) 8 , mModel(-1) 9 , mDrawOrder(drawOrder) 10{ 11 owner->GetGame()->AddMesh(this); 12} 13 14MeshComponent::~MeshComponent() 15{ 16 mOwner->GetGame()->RemoveMesh(this); 17} 18 19void MeshComponent::Draw() 20{ 21 if (mModel >= 0) 22 { 23 // Actor の位置・スケールを MV1 に反映 24 Vector3 pos = mOwner->GetPosition(); 25 float scale = mOwner->GetScale(); 26 27 MV1SetPosition(mModel, VGet(pos.x, pos.y, pos.z)); 28 MV1SetScale(mModel, VGet(scale, scale, scale)); 29 DrawSphere3D(VGet(pos.x,pos.y,pos.z),1.0,8, GetColor(255, 255, 255), GetColor(255, 255, 255), FALSE); 30 MV1DrawModel(mModel); 31 } 32} 33 34void MeshComponent::SetModel(int model) 35{ 36 mModel = model; 37} 38
c++
1#include "Camera.h" 2#include "Game.h" 3#include "DxLib.h" 4 5Camera::Camera(Game* game) 6 : Actor(game) 7 , mTarget(Vector3::Zero) 8{ 9 SetPosition(Vector3(0.0f, 5.0f, -20.0f)); // 後ろに下げる 10} 11 12Camera::~Camera() 13{ 14} 15 16void Camera::UpdateActor(float deltaTime) 17{ 18 Vector3 pos = GetPosition(); 19 SetCameraPositionAndTarget_UpVecY( 20 VGet(pos.x, pos.y, pos.z), 21 VGet(mTarget.x, mTarget.y, mTarget.z) 22 ); 23} 24
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
色々見てみたのですが全然わからなかったです。
補足
visualstudio2022
DxLib
あなたの回答
tips
プレビュー