static int を別ファイルからアクセス

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
楽しいC

static int を別ファイルからアクセス

#1

投稿記事 by 楽しいC » 13年前

こんばんは、
現在ゲームを作成しているのですが、グローバル変数をあまり使いたくないので引数とポインタを使ってローカル変数にアクセスしていたのですが、
ファイル間ではうまくできません。言葉だと、うまく表現できないのですが、
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のデータを保存
}

速攻で作ったやつなので、細かい間違いがあったり、解読しずらかったりするかもしれませんが、お願いします・・・。

また、わかりにくい点や説明不足な点がありましたら、ご返信お願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: static int を別ファイルからアクセス

#2

投稿記事 by softya(ソフト屋) » 13年前

とりあえず提示してもらったプログラムは狙った動作はすると思いますが、良いプログラムとして書き方なら各ファイルに出来るだけ閉じ込めて外部には公開しない方法をとったほうが良いと思います。

Player.cppが有るとして画像や座標は全てPlayer.cppで保持して下さい。
なので初期化、移動処理や描画関数もPlayer.cpp内に書きます。
外部から内部の情報が欲しい場合は、Get関数で情報を得るようにします。
こんな感じでどうでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: static int を別ファイルからアクセス

#3

投稿記事 by 楽しいC » 13年前

Get関数とは、標準ライブラリの中のgets関数のことですか?

本当にバカですみません・・・。GET関数で検索すると、gets()しかでてこなくて・・・。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: static int を別ファイルからアクセス

#4

投稿記事 by softya(ソフト屋) » 13年前

楽しいC さんが書きました:Get関数とは、標準ライブラリの中のgets関数のことですか?

本当にバカですみません・・・。GET関数で検索すると、gets()しかでてこなくて・・・。
すいません分かり辛らかったですね。
自分でint GexPosX()とかPOSTION GexPosition()とか関数を作ることです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: static int を別ファイルからアクセス

#5

投稿記事 by 楽しいC » 13年前

なるほど!実は今、プレイヤーとマップとの接触を知りたかったのですが、マップファイルとプレイヤーファイルに分かれているため、マップの情報が取得する方法が知りたく質問しました。

こんな感じでしょうか?

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.....){
....
     }
}
これも明らかエラーが出ると思いますが、こんな感じで取得するのはプログラムとしてスマートに出来てますか?

ものすごく汚くて、グローバル変数大量なプログラムでゲームは作れたので、今度は読みやすく、動作も軽く、バグの少ないスマートなプログラムを組みたいと思ってるので、
もっと綺麗にできる方法があれば教えてください!

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: static int を別ファイルからアクセス

#6

投稿記事 by softya(ソフト屋) » 13年前

Map.cpp内に当たり判定関数を作って、Playerの座標を渡したほうが良いです。
mapの構造はmap.cppだけが知っていれば良いことなので。
main.cpp→player.cpp→map.cpp
と言った呼び出し関係になります。

この場合はPlayer.cppからGetする物はありません。
Playerの移動処理がmap.cppの当たり判定関数を呼び出します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: static int を別ファイルからアクセス

#7

投稿記事 by 楽しいC » 13年前

あーなるほど!
プレイヤー情報は敵だったり、弾だったりで、使うけど、マップ情報はマップでしか使わない情報だからプレイヤーが渡すのか!

何度もご返信ありがとうございます!
これで解決しました!
また、何かあった場合ご利用させて頂くかもしれませんが、そのときはまたよろしくお願いします。
一番は、利用しないほうがいいのですけど・・・。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: static int を別ファイルからアクセス

#8

投稿記事 by softya(ソフト屋) » 13年前

楽しいC さんが書きました:あーなるほど!
プレイヤー情報は敵だったり、弾だったりで、使うけど、マップ情報はマップでしか使わない情報だからプレイヤーが渡すのか!

何度もご返信ありがとうございます!
これで解決しました!
また、何かあった場合ご利用させて頂くかもしれませんが、そのときはまたよろしくお願いします。
一番は、利用しないほうがいいのですけど・・・。
方針として一般的な事を聞くのは良いことだと思いますよ。
プロの知り合いがいない人は聞く相手もいないでしょうから。
ここは業界(システム・アプリ・ゲーム)関係者が多いので。

※ ポイント
情報はなるだけ内部に固める・内部に隠す・外部から直接変更させない。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: static int を別ファイルからアクセス

#9

投稿記事 by 楽しいC » 13年前

アドバイスありがとうございます!
返信遅くなってしまって申し訳ございません・・

>>外部から直接変更させない。

なんと・・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;//プレイヤーデータを与える
}

新しく立てたほうがいいですか・・?

本当に質問ばかりですみません・・。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: static int を別ファイルからアクセス

#10

投稿記事 by softya(ソフト屋) » 13年前

解決チェックを外しておきました。
なんと・・Map.cppで壁にぶつかったら、プレイヤーの移動量を減らす、というプログラムを作りたかったのですが、そうなると、外部から変更することになってしまうので、
壁にぶつかったらそのデータをPlayer.cpp渡して、そこで移動量を減らす、としたほうがいいですか?
Player.cppからPlayer座標をMap.cppのMap_hit()の引数に渡して衝突有無を戻り値で返せば良いだけだと思います。
移動量を減らすのはPlayer.cppでの仕事です。

※ map.cppの中の関数は座標がplayerなのか敵なのか意識する必要はないと思います。
これは、関数の機能がPlayer専用から汎用化すると言う事で望ましい関数の設計になります。
できるだけ専用機能の関数は無いことがプログラムをすっきりとさせるコツです(やり過ぎは逆効果の場合もあります)。
また、int Get_PlayerData()関数を作って、外部からアクセスできるようにしたのですが、なぜか反映されません。恐らく、ただコピーが作られているからだと思います。
しかし、実体→Get_PlayerData()→ポインタ→書き換えとしてるので、コピーのはずがないのですが・・・。どこが問題なのでしょうか?
Get_PlayerData()の戻り値の時点でコピーですから、コピーのポインタを作っても元には影響がありませんね。
あくまで参照専用と割りきって下さい。

【補足】
インデント(字下げ)がちゃんと行われていないのでバグの原因になります。
読みやすさにも直結するので、ちゃんとインデントを行なって下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: static int を別ファイルからアクセス

#11

投稿記事 by 楽しいC » 13年前

やっぱりそうですよね。
Player.cppで処理したらできました!
今度こそ解決しました・・・。

今回はいろいろと勉強になり、本当にありがとうございました!
前まで作っていたプログラムとは見違えるほど綺麗になってます!

これからは、教えて頂いた「情報はなるだけ内部に固める・内部に隠す・外部から直接変更させない。」ということを頭に入れて、プログラムを組みたいと思います。
もっと、いいコードが書けるように精進しますので、今後また利用させてもらうかもしれませんが、そのときはよろしくお願いします。
でも確かに、質問して理解が深まればよいのですが、自分で考えてそれが成功したときと、質問してその通りにやって成功したときとでは、
感動の度合いが違うし(自分だけ?)なにより自分で考えて作ったので達成感がまるで違いますよね!
なので、今後利用させもらうときは、本当に行き詰まった時だけにしますので、今回は本当にありがとうございました。

なんだか文章が変ですが、
何度もご回答していただきありがとうございます!
ここの掲示板みているだけでも勉強になるので、これからもがんばってください!

閉鎖

“C言語何でも質問掲示板” へ戻る