大学でC言語を一年程学んでいます。
私は最近趣味でゲームプログラミング(RPG)を始めました。
DXライブラリを用いるため、使用言語は "C++" , コンパイラは "VC++2010" です。
(OSはWindows7です。)
"ゲームプログラミングの館" をはじめ、様々なサイトや、
"独習C++(書籍)" を参考にしてチビチビと進めていき、以下の3つの状態
『タイトル画面・選択画面("はじめから"や"オプション"などの項目のみ。)・マップ画面(キャラと地形が表示される)』
と、その各状態の遷移(Enterキーを押すと状態が変わっていく)までを実装出来ました。
しかし、
「せっかくC++やるんだから、クラス使わなきゃ!」という軽い考えのもと、
クラスを用いたプログラムに変えていったところ、
どうしても解決しない問題に直面したので、ここで質問する事に致しました。
さて、本題ですが、今私がしたい事は
Characterクラスのメンバ関数(Character_Calculate)の中で、Mapクラスのメンバ関数(WalkOrNot)を呼び出す。
という事です。
実際のコードは以下の通りです。
/*--- Character.h ---*/
#ifndef DEF_CHARACTER_H
#define DEF_CHARACTER_H
#include "DxLib.h"
#include "stdio.h"
#include "Map.h"
#include "Keyboard.h"
/*--- キャラに関するデータ格納用構造体 ---*/
typedef struct{
int x;
int y;
int image;
int walk_flag;
int muki;
}ch_t;
/*--- Characterクラスの定義 ---*/
class Character{
private:
ch_t syuzinkou;
int Image[16];
public:
Character();//コンストラクタ
~Character();//デストラクタ
//キャラクタの位置情報を計算
void Character_Calculate()
{
if( syuzinkou.x%32==0 && syuzinkou.y%32==0){ //座標が32で割り切れたら
syuzinkou.walk_flag = 1; //歩くフラグを立てる
if ( Keyboard_Get(KEY_INPUT_UP) == 1 ) //上が押されたら
syuzinkou.muki = 0; //上向きフラグを立てる
else if ( Keyboard_Get(KEY_INPUT_LEFT) == 1 )//左が押されたら
syuzinkou.muki = 1; //左向きフラグを立てる
else if ( Keyboard_Get(KEY_INPUT_DOWN) == 1 )//下が押されたら
syuzinkou.muki = 2; //下向きフラグを立てる
else if ( Keyboard_Get(KEY_INPUT_RIGHT) == 1 )//右が押されたら
syuzinkou.muki = 3; //右向きフラグを立てる
else//もし何も押されてなかったら
syuzinkou.walk_flag = 0;//歩かないフラグを立てる
if(syuzinkou.walk_flag == 1)//歩くフラグが立ってれば
/*--- WalkOrNot の所で error C3861: 'WalkOrNot': 識別子が見つかりませんでした. とビルドエラーになります。---*/
if(WalkOrNot(syuzinkou.x,syuzinkou.y,syuzinkou.muki) == 1)//歩けるマスか判定
syuzinkou.walk_flag = 0;//歩かないフラグを立てる
}
if( syuzinkou.walk_flag == 1 ){ //歩くフラグが立っていたら
if (syuzinkou.muki == 0) syuzinkou.y-=4;//上向きならy座標減少
else if(syuzinkou.muki == 1) syuzinkou.x-=4;//左向きならx座標減少
else if(syuzinkou.muki == 2) syuzinkou.y+=4;//下向きならy座標増加
else if(syuzinkou.muki == 3) syuzinkou.x+=4;//右向きならx座標増加
}
}
//キャラクタを描画
void Character_Draw(){
syuzinkou.image = Image[(syuzinkou.x%32 + syuzinkou.y%32) / 8 + syuzinkou.muki*4];
DrawGraph( syuzinkou.x , syuzinkou.y , syuzinkou.image , TRUE );
}
};
#endif
/*--- Character.cpp ---*/
#include "DxLib.h"
#include "Character.h"
/*--- Characterクラスの実装 ---*/
//コンストラクタ
Character::Character(){
LoadDivGraph( "syuzinkou.png",16,4,4,32,32,Image);
syuzinkou.x = 320;
syuzinkou.y = 320;
syuzinkou.walk_flag = 0;
syuzinkou.muki = 3;
}
Character::~Character(){
}
/*--- Map.h ---*/
#ifndef DEF_MAP_H
#define DEF_MAP_H
#include "DxLib.h"
#include "stdio.h"
#include "Character.h"
#define SIBAHU 0
#define SUNA 1
#define KIRIKABU 101
/*--- Mapクラスの定義 ---*/
class Map{
private:
int map1[16][20];
int mapimage[256];
public:
/*--- マップのあたり判定 ---*/
int WalkOrNot(int x,int y,int muki)
{
if(muki==0)//上向きなら
if(map1[y/32-1][x/32] < 0)//キャラの目の前のマスが1(進行不可)だったら
return 1;//1が帰ったらエラー
if(muki==1)//左向きなら
if(map1[y/32][x/32-1] < 0)
return 1;
if(muki==2)//下向きなら
if(map1[y/32+1][x/32] < 0)
return 1;
if(muki==3)//右向きなら
if(map1[y/32][x/32+1] < 0)
return 1;
//どれにも当てはまらない(進行方向が0)なら
return 0;//0が帰ったら歩ける
}
/*--- マップの描画 ---*/
void Map_Draw()
{
for(int i=0;i<16;i++){
for(int j=0;j<20;j++){
if(map1[i][j]==0) DrawGraph(j*32,i*32,mapimage[SIBAHU],FALSE);
if(map1[i][j]==1){
DrawGraph(j*32,i*32,mapimage[SIBAHU],FALSE);//一旦芝生を描画してから
DrawGraph(j*32,i*32,mapimage[SUNA],FALSE);//その上に砂を描画
}
if(map1[i][j]==-35){
DrawGraph(j*32,i*32,mapimage[SIBAHU],FALSE);//上と同じ
DrawGraph(j*32,i*32,mapimage[KIRIKABU],TRUE);
}
}
}
}
Map(); //コンストラクタ
~Map();//デストラクタ
};
#endif
/*--- Map.cpp ---*/
#include "Map.h"
#include "stdio.h"
#include "DxLib.h"
/*--- Mapクラスの実装 ---*/
/*--- コンストラクタ ---*/
Map::Map(){
//ローカル変数で初期値を設定
static int temp1[16][20] = {//サイズが大きくなるのでstatic
{ -35,-35,-35,-35,-35,-35,-35,-35,-35,-35,-35,-35,-35,-35,-35,-35,-35,-35,-35,-35 },
{ -35,-35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-35,-35 },
{ -35,-35,-35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-35,-35,-35 },
{ -35,-35,-35,-35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-35,-35,-35,-35 },
{ -35,-35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-35,-35,-35,-35,-35 },
{ -35,-35,0,0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-35,-35,-35,-35,-35 },
{ -35,-35,0,1,1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-35,-35,-35,-35,-35 },
{ 1,0,0,1,-35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-35,-35,-35,-35,-35 },
{ 0,-35,-35,-35,-35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-35,-35,-35,-35,-35 },
{ 0,-35,-35,-35,-35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 },
{ -35,-35,-35,-35,-35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 },
{ 1,1,1,1,1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 },
{ 0,1,0,1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 },
{ 1,1,1,0,1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 },
{ 1,1,1,1,1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 },
{ 1,1,1,1,1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 },
};
//メンバ変数にコピー
memcpy(map1 , temp1, sizeof temp1);
//マップチップをロード
LoadDivGraph( "map_c02.png",256,8,32,32,32,mapimage);
}
/*--- デストラクタ ---*/
Map::~Map(){}
Keyboard.h(キーの入力状態を得るための関数等を含んだヘッダ)やmain.cppや画像ファイルは、
直接この問題には関係が無いと思うので載せません*1。
*1これらが無いと皆さんのPCでコンパイル出来ないので、要望があれば載せます。
必ず全てのソースを載せる事が常識なのでしたら、すみません。
CharacterクラスのCharacter_Calculate()関数の中で、キャラとマップのあたり判定を得るために
MapクラスのWalkOrNot(int x,int y,int muki)を呼び出したいのですが、上手くいきません。
ちなみに当然(?)ですが、クラスを使った実装に変更する前は、
ちゃんと動作していました(当たり判定も)。
フレンドや継承など、クラスに関して調べると色々出てくるのですが、
それらを用いようとしても上手くいきません。(現在のコードはそれらを試す前のものにしました)
何かと至らないところが多いと思いますが、よろしくお願いいたします。