プレイヤーとして3Dモデルを表示しよう。
この前作った「おでん」で構わないので、プレイヤークラスの中で表示させる。
去年の資料では「Model::Load(ファイル名)」という関数を使っていたが、
これはまだ用意してないので、WinMainでおでんを表示したときと同じことをプレイヤークラスに書けばいい。
<Player.h>
#pragma once
#include "Engine/GameObject.h"
#include "Engine/Fbx.h"
//プレイヤーを管理するクラス
class Player : public GameObject
{
Fbx* pFbx;
public:
//コンストラクタ
Player(GameObject* parent);
<Player.cpp>
//初期化
void Player::Initialize()
{
pFbx = new Fbx;
pFbx->Load("Assets\\oden.fbx");
}
//更新
void Player::Update()
{
}
//描画
void Player::Draw()
{
pFbx->Draw(transform_);
}
初期化と開放はご自分で。
「RootJob」⇒「PlayScene」⇒「Player」と繋がって、Playerクラスにモデルを表示する処理を書いたのに表示されない。
そもそもPlayerクラスのDraw関数が呼ばれていない。
WinMainでRootJobの各関数は呼んでいるが、RootJobが何も仕事をしていないのが原因。
すべてのゲームオブジェクトは
自分のUpdate関数を実行したら、子オブジェクトのUpdate関数を呼ばなければならない。
自分のDraw関数を実行したら、子オブジェクトのDraw関数を呼ばなければならない。
自分のRelease関数を実行したら、子オブジェクトのRelease関数を呼ばなければならない。
全オブジェクトに共通することなのだからGameObjectクラスに書くことは間違いないが、
例えばUpdate関数の中で子のUpdateを呼ぶ処理を書いてしまうと、その関数はオーバーライドできなくなってしまう。
そこで「自分のDraw関数を呼んだあと、子のDraw関数を呼ぶ」関数を作ってやればいい。
<GameObject.cpp> 自分で書いて
void GameObject::DrawSub()
{
自分のDraw関数を呼ぶ
すべての子供のDrawSubを呼ぶ
}
そして、WinMainではRootJobのDraw関数ではなくDrawSub関数を呼ぶ。
こうすれば、RootJobのDrawが呼ばれ、PlaySceneのDrawが呼ばれ、PlayerのDrawが呼ばれる。
//メッセージなし
else
{
//ゲームの処理
//入力情報の更新
Input::Update();
pRootJob->Update();
Direct3D::BeginDraw();
//描画処理
pRootJob->DrawSub();
Direct3D::EndDraw();
}
流れを確認して実行し、ちゃんとモデルが表示されたら、Update関数、Release関数も同じようにしておこう。