C++についてはほとんど初学者でロベール本を300ページ読み終えた程度です。
もしよかったら質問させて下さい。
ARPGのようなものをDxLibraryを用いて作ろうとしています。
マップ表示は何とかできてキャラクター表示も何とかできたのですが、
自プレイヤーに関する処理をクラス化しようとしたところでキャラが表示されなくなり困りました。
どの部分に問題があるのかわからないという次第です。
本当に汚くて無駄の多いコードですがもしよければお願いいたします・・・。
#include "DxLib.h"
//初期化
int Key[256]; // 全キーの押されているフレーム数を格納
int Map_Image[2]; // マップイメージ
int map[15][20] = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
{ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
// プレイヤーキャラ
class Player {
public:
int x, y; // 座標
int Image[16]; // イメージ
Player();
Player(int xx, int yy);
void Draw();
void Calc();
};
Player::Player() { int x = 320, y = 240; } // 引数なしならこの座標
Player::Player(int xx, int yy) { int x = xx, y = yy; }
void Player::Draw() {
DrawGraph(x, y, Image[0], TRUE); //主人公の描画
}
void Player::Calc() { //計算フェーズ
//キャラクターアップデート
if (Key[KEY_INPUT_RIGHT] >= 1){
x += 2;
}
if (Key[KEY_INPUT_DOWN] >= 1){
y += 2;
}
if (Key[KEY_INPUT_LEFT] >= 1){
x -= 2;
}
if (Key[KEY_INPUT_UP] >= 1){
y -= 2;
}
}
// キーの入力状態を更新する
int gpUpdateKey(){
char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る
for (int i = 0; i<256; i++){
if (tmpKey[i] != 0){ // i番のキーコードに対応するキーが押されていたら
Key[i]++; // 加算
}
else { // 押されていなければ
Key[i] = 0; // 0にする
}
}
return 0;
}
void gpDraw(){ //描画フェーズ
int i, j;
//マップの描画
for (i = 0; i < 20; i++) {
for (j = 0; j < 15; j++){
DrawGraph(i*32, j*32, Map_Image[map[j][i]], TRUE); //マップの描画
}
}
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
//初期化
SetGraphMode(640, 480, 16);
SetMainWindowText("test");
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
Player myself;
LoadDivGraph("img/actor00.png", 12, 3, 4, 32, 32, myself.Image);
LoadDivGraph("img/map00.png", 2, 2, 1, 32, 32, Map_Image);
// メインループ
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0){
myself.Calc();
gpDraw();
myself.Draw();
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}