[1] 質問文
[1.1] 自分が今行いたい事は何か
>>> 新・ゲームプログラミングの館の「sp6章 メニュー画面の作り方(C++編)」(http://dixq.net/g/sp_06.html) に「3.3章 簡単な選択画面を作る」(http://dixq.net/g/03_03.html)の機能を追加したい。
[1.2] どのように取り組んだか(プログラムコードがある場合記載)
>>> まず、前提として先ほどリンクを貼った、「sp6章 メニュー画面の作り方(C++編)」(http://dixq.net/g/sp_06.html)のファイルが全て作成済みです。
(もし見るのが面倒な場合は、こちらからzipファイルでダウンロードできるようです。)(http://dixq.net/g/zip/MenuTest4.zip)
それに加えて、とりあえず、Keyboard.hとKeyboard.cppを作成し、Keyboardクラスを作成しました。
// Keyboard.h
#pragma once
class Keyboard {
public:
virtual Keyboard::~Keyboard() = 0;
virtual int getKeyState() = 0;
protected:
int Key[256];
};
// Menu.h
#pragma once
#include "BaseScene.h"
#include "ISceneChanger.h"
#include "Keyboard.h"
typedef struct {
int x;
int y;
char name[128];
}MenuElement;
class Menu : public BaseScene, Keyboard {
public:
Menu::Menu(ISceneChanger* changer);
void Initialize() override;
//void Finalize() override;
void Update() override;
void Draw() override;
int getKeyState() override;
};
// Menu.cpp
#include "Menu.h"
#include "DxLib.h"
MenuElement MenuE[3] = {
{100, 100, "GAME"},
{100, 150, "CONFIG"},
{100, 200, "END"},
};
int selectNum = 0;
Menu::Menu(ISceneChanger* changer) :
BaseScene(changer) {
}
void Menu::Initialize() {
mImageHandle = LoadGraph("img/Menu.png");
}
void Menu::Update() {
if (Key[KEY_INPUT_DOWN] == 1) {
selectNum = (selectNum + 1) % 3;
for (int i = 0; i < 3; i++) {
if (i == selectNum) {
MenuE[i].x = 80;
}
else {
MenuE[i].x = 100;
}
}
}
if (Key[KEY_INPUT_UP] == 1) {
selectNum = (selectNum + 4) % 3;
for (int i = 0; i < 3; i++) {
if (i == selectNum) {
MenuE[i].x = 80;
}
else {
MenuE[i].x = 100;
}
}
}
/*
if (Key[KEY_INPUT_C] != 0 ) {
mSceneChanger->ChangeScene(eScene_Config);
}
else if (CheckHitKey(KEY_INPUT_G) != 0) {
mSceneChanger->ChangeScene(eScene_Game);
}
*/
}
void Menu::Draw() {
BaseScene::Draw();
DrawString(0, 0, "CキーでConfig,Gキーでゲーム画面,Escキーでアプリケーションを終了します", GetColor(255, 255, 255));
DrawString(0, 20, "ここはメニュー画面です", GetColor(255, 255, 255));
for (int i = 0; i < 3; i++) {
DrawFormatString(MenuE[i].x, MenuE[i].y, GetColor(255, 255, 255), MenuE[i].name);
}
}
int Menu::getKeyState()
{
char tmpKey[256];
GetHitKeyStateAll(tmpKey);
for (int i = 0; i < 256; i++) {
if (tmpKey[i] != 0) {
Key[i]++;
}
else {
Key[i] = 0;
}
}
return 0;
}
[1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載) && [1.4] 今何がわからないのか、知りたいのか
>>> その後、Main.cppでgetKeyStateメソッドを使用しようとすると、
「SceneManagerクラスにはgetKeyStateメンバがありません」と言われます。
しかし、SceneManagerクラスにgetKeyStateを追加した際の継承がよくわかりません。
そこで、
・どのようにgetKeyStateをSceneManagerクラスに追加すれば良いのか
を教えていただきたいです。
// Main.cpp
#include "DxLib.h"
#include "SceneManager.h"
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
SceneManager sceneManager;
sceneManager.Initialize();
while (ProcessMessage() == 0 && ScreenFlip() == 0 && ClearDrawScreen() == 0 && sceneManager.getKeyState()) {
sceneManager.Update();
sceneManager.Draw();
}
sceneManager.Finalize();
DxLib_End();
return 0;
}
[2] 環境
[2.1] OS : Windows, Linux等々
>>> virtaulBox上の仮想環境でWindows10使ってます。
[2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
>>> 調べ方がよくわかりません……
ただ、今使用しているIDEはVisual Studio 2017 communityです。
[3] その他
・どの程度C言語を理解しているか
>>> C++は今年の春に始めたばかりなので、正直よくわかってないです。
ただ、基本的な文字列の扱いやポインタ、アドレスなどは理解してます。
・ライブラリを使っている場合は何を使っているか
>>> Dxライブラリを使用してます。
長文、乱文で申し訳ないです。
私自身で見直しはしましたが、伝わりにくいところがあると思うので、
そこは聞いていただけるとありがたいです。
よろしくお願いします。