ページ 1 / 1
static int を別ファイルからアクセス
Posted: 2012年7月22日(日) 02:41
by 楽しいC
こんばんは、
現在ゲームを作成しているのですが、グローバル変数をあまり使いたくないので引数とポインタを使ってローカル変数にアクセスしていたのですが、
ファイル間ではうまくできません。言葉だと、うまく表現できないのですが、
A.cppとB.cppとMain.cppがあり、Main.cppで、A.cppの変数とB.cppの変数にアクセスしたいときどうすればよいでしょうか?
一応、やろうと思えばできるのですが、あまりいい方法とは思えないので、もっといい方法を教えて頂きたく質問しました。
A.cpp
コード:
//A//
void A(){
int Player_x=30;//ローカル変数で、プレイヤー座標Xを宣言
Temp1(Player_x);//X座標を与える
}
B.cpp
コード:
//B//
void B(){
int Player_y=30;//ローカル変数でプレイヤー座標Yを宣言
Temp2(Player_y);//Y座標を与える
}
Main.cpp
コード:
static int Temp_XY[2]=0;//ローカル変数を保存
//Main//
void Main(){
DrawGraph(Temp_XY[0],Temp_XY[1],Graph,TRUE);//描画
}
//Temp1//
void Temp1(int X){
Temp_XY[0] = X;//A.cppのデータを保存
}
//Temp2//
void Temp2(int Y){
Temp_XY[1] = Y;//B.cppのデータを保存
}
速攻で作ったやつなので、細かい間違いがあったり、解読しずらかったりするかもしれませんが、お願いします・・・。
また、わかりにくい点や説明不足な点がありましたら、ご返信お願いします。
Re: static int を別ファイルからアクセス
Posted: 2012年7月22日(日) 14:49
by softya(ソフト屋)
とりあえず提示してもらったプログラムは狙った動作はすると思いますが、良いプログラムとして書き方なら各ファイルに出来るだけ閉じ込めて外部には公開しない方法をとったほうが良いと思います。
Player.cppが有るとして画像や座標は全てPlayer.cppで保持して下さい。
なので初期化、移動処理や描画関数もPlayer.cpp内に書きます。
外部から内部の情報が欲しい場合は、Get関数で情報を得るようにします。
こんな感じでどうでしょうか?
Re: static int を別ファイルからアクセス
Posted: 2012年7月22日(日) 18:59
by 楽しいC
Get関数とは、標準ライブラリの中のgets関数のことですか?
本当にバカですみません・・・。GET関数で検索すると、gets()しかでてこなくて・・・。
Re: static int を別ファイルからアクセス
Posted: 2012年7月22日(日) 19:01
by softya(ソフト屋)
楽しいC さんが書きました:Get関数とは、標準ライブラリの中のgets関数のことですか?
本当にバカですみません・・・。GET関数で検索すると、gets()しかでてこなくて・・・。
すいません分かり辛らかったですね。
自分でint GexPosX()とかPOSTION GexPosition()とか関数を作ることです。
Re: static int を別ファイルからアクセス
Posted: 2012年7月22日(日) 19:33
by 楽しいC
なるほど!実は今、プレイヤーとマップとの接触を知りたかったのですが、マップファイルとプレイヤーファイルに分かれているため、マップの情報が取得する方法が知りたく質問しました。
こんな感じでしょうか?
Map.cpp
コード:
static int MAP_DATA[480][680];
//Map//
int Map_Get(){
return MAP_DATA;
}
Player.cpp
コード:
//Player//
void Player_MAP_Hit(*Player){
int map_data=0;
map_data = Map_Get();
if(map_data.....){
....
}
}
これも明らかエラーが出ると思いますが、こんな感じで取得するのはプログラムとしてスマートに出来てますか?
ものすごく汚くて、グローバル変数大量なプログラムでゲームは作れたので、今度は読みやすく、動作も軽く、バグの少ないスマートなプログラムを組みたいと思ってるので、
もっと綺麗にできる方法があれば教えてください!
Re: static int を別ファイルからアクセス
Posted: 2012年7月22日(日) 19:39
by softya(ソフト屋)
Map.cpp内に当たり判定関数を作って、Playerの座標を渡したほうが良いです。
mapの構造はmap.cppだけが知っていれば良いことなので。
main.cpp→player.cpp→map.cpp
と言った呼び出し関係になります。
この場合はPlayer.cppからGetする物はありません。
Playerの移動処理がmap.cppの当たり判定関数を呼び出します。
Re: static int を別ファイルからアクセス
Posted: 2012年7月22日(日) 19:49
by 楽しいC
あーなるほど!
プレイヤー情報は敵だったり、弾だったりで、使うけど、マップ情報はマップでしか使わない情報だからプレイヤーが渡すのか!
何度もご返信ありがとうございます!
これで解決しました!
また、何かあった場合ご利用させて頂くかもしれませんが、そのときはまたよろしくお願いします。
一番は、利用しないほうがいいのですけど・・・。
Re: static int を別ファイルからアクセス
Posted: 2012年7月22日(日) 20:11
by softya(ソフト屋)
楽しいC さんが書きました:あーなるほど!
プレイヤー情報は敵だったり、弾だったりで、使うけど、マップ情報はマップでしか使わない情報だからプレイヤーが渡すのか!
何度もご返信ありがとうございます!
これで解決しました!
また、何かあった場合ご利用させて頂くかもしれませんが、そのときはまたよろしくお願いします。
一番は、利用しないほうがいいのですけど・・・。
方針として一般的な事を聞くのは良いことだと思いますよ。
プロの知り合いがいない人は聞く相手もいないでしょうから。
ここは業界(システム・アプリ・ゲーム)関係者が多いので。
※ ポイント
情報はなるだけ内部に固める・内部に隠す・外部から直接変更させない。
Re: static int を別ファイルからアクセス
Posted: 2012年7月24日(火) 02:25
by 楽しいC
アドバイスありがとうございます!
返信遅くなってしまって申し訳ございません・・
>>外部から直接変更させない。
なんと・・Map.cppで壁にぶつかったら、プレイヤーの移動量を減らす、というプログラムを作りたかったのですが、そうなると、外部から変更することになってしまうので、
壁にぶつかったらそのデータをPlayer.cpp渡して、そこで移動量を減らす、としたほうがいいですか?
また、int Get_PlayerData()関数を作って、外部からアクセスできるようにしたのですが、なぜか反映されません。恐らく、ただコピーが作られているからだと思います。
しかし、実体→Get_PlayerData()→ポインタ→書き換えとしてるので、コピーのはずがないのですが・・・。どこが問題なのでしょうか?
Map.cpp
コード:
static int MAP_DATA[Map_WIDTH][Map_HEIGHT];//マップデータ
static Player *Player_s;//プレイヤーデータ
void Map_Initialize(){
//マップの初期化(壁作り)
}
void Map_Draw(){
//マップの描画(Line関数で縦線を表示)
}
//問題の箇所
void Map_hit(){
int flag=0;
Player_s = &Player_Get();//プレイヤー座標更新
for( i<Map_WIDTH ){
for( k<Map_HEIGHT ){
if( MAP_DATA[i][k] == 1 )
flag = HitBoxRect( i, 680,k,430,Player_s->x,Player_s->x+25,Player_s->y,Player_s->y+32);//短形のあたり判定 当たっていたら1を返す
}
}
if( flag == 1 )
Player_s->x =10;//試しにPlayer_s->xに10を代入してみても、X座標10に瞬間移動しない。
DrawFormatString(0,0,Color,"%lf",Player_s->x);//試しに、X座標を表示させてみると、10と表示される。
}
Player.cpp
コード:
static Player Player_s;//これが実体
void Mgr_Player_Move(){
//移動する
DrawFormatString(0,0,Color,"%lf",Player_s->x);//ここで実行すると、Map.cppでflagが1のときでも10とは表示されず、現在の座標が表示される。
}
void Mgr_Player_Motion(){
//動きアニメーション
}
//プレイヤーの情報を渡す
Player Player_Get(){
return Player_s;//プレイヤーデータを与える
}
新しく立てたほうがいいですか・・?
本当に質問ばかりですみません・・。
Re: static int を別ファイルからアクセス
Posted: 2012年7月24日(火) 11:07
by softya(ソフト屋)
解決チェックを外しておきました。
なんと・・Map.cppで壁にぶつかったら、プレイヤーの移動量を減らす、というプログラムを作りたかったのですが、そうなると、外部から変更することになってしまうので、
壁にぶつかったらそのデータをPlayer.cpp渡して、そこで移動量を減らす、としたほうがいいですか?
Player.cppからPlayer座標をMap.cppのMap_hit()の引数に渡して衝突有無を戻り値で返せば良いだけだと思います。
移動量を減らすのはPlayer.cppでの仕事です。
※ map.cppの中の関数は座標がplayerなのか敵なのか意識する必要はないと思います。
これは、関数の機能がPlayer専用から汎用化すると言う事で望ましい関数の設計になります。
できるだけ専用機能の関数は無いことがプログラムをすっきりとさせるコツです(やり過ぎは逆効果の場合もあります)。
また、int Get_PlayerData()関数を作って、外部からアクセスできるようにしたのですが、なぜか反映されません。恐らく、ただコピーが作られているからだと思います。
しかし、実体→Get_PlayerData()→ポインタ→書き換えとしてるので、コピーのはずがないのですが・・・。どこが問題なのでしょうか?
Get_PlayerData()の戻り値の時点でコピーですから、コピーのポインタを作っても元には影響がありませんね。
あくまで参照専用と割りきって下さい。
【補足】
インデント(字下げ)がちゃんと行われていないのでバグの原因になります。
読みやすさにも直結するので、ちゃんとインデントを行なって下さい。
Re: static int を別ファイルからアクセス
Posted: 2012年7月25日(水) 00:56
by 楽しいC
やっぱりそうですよね。
Player.cppで処理したらできました!
今度こそ解決しました・・・。
今回はいろいろと勉強になり、本当にありがとうございました!
前まで作っていたプログラムとは見違えるほど綺麗になってます!
これからは、教えて頂いた「情報はなるだけ内部に固める・内部に隠す・外部から直接変更させない。」ということを頭に入れて、プログラムを組みたいと思います。
もっと、いいコードが書けるように精進しますので、今後また利用させてもらうかもしれませんが、そのときはよろしくお願いします。
でも確かに、質問して理解が深まればよいのですが、自分で考えてそれが成功したときと、質問してその通りにやって成功したときとでは、
感動の度合いが違うし(自分だけ?)なにより自分で考えて作ったので達成感がまるで違いますよね!
なので、今後利用させもらうときは、本当に行き詰まった時だけにしますので、今回は本当にありがとうございました。
なんだか文章が変ですが、
何度もご回答していただきありがとうございます!
ここの掲示板みているだけでも勉強になるので、これからもがんばってください!