ページ 11

配列の中のどれかと等しかったら処理を実行する

Posted: 2012年5月29日(火) 22:16
by Chalaza
2Dのマリオのようなスクロールアクションゲームを作っているのですが、
プレイヤーとマップの衝突処理についての質問です。

0から512までの数値を2次元配列にしてマップデータを作って、
プレイヤーの座標とそのマップデータの数値を使って着地処理などを作っているのですが、

コード:

//地面についたらジャンプをやめる
	if(Player->Jump==1 && Player->JumpPower<0 ){
		if(MAP_CHIP((Player->Y+32)/32,(Player->X)/32)!=0 ||
			MAP_CHIP((Player->Y+32)/32,(Player->X+31)/32)!=0 ){
				Player->JumpPower=0;
				Player->Jump=0;
		}
	}
のようにして、『キャラの下のマスが0でないときに着地できる』などとするときに、
例えば、0だけでなく、1,2,3,4等も着地できないマップにしたいのです。
そのとき、0,1,2,3,4を入れる配列を作ると思うんですが、
もちろん
Through[5] = {0,1,2,3,4};
if(MAP_CHIP((Player->Y+32)/32,(Player->X)/32)!=Through[5]...
のように配列に変えただけでは機能しませんよね?
For文などを使えば効率よくできるのでしょうか?

Re: 配列の中のどれかと等しかったら処理を実行する

Posted: 2012年5月29日(火) 22:33
by softya(ソフト屋)
アクションゲームを作っていると、どんどん地形に複雑な条件要素が増えてきます。
移動できないとか、滑るとか、トゲで痛いとか。

こんな時、熟練のアマチュアやプロの世界では専用のマップエディタを作って管理するのですが上記条件は全てフラグの構造体配列にしていしまいます。

こんな感じです。

コード:

//	マップ・アトリビュート(属性)構造体
typedef struct {
	char stop;		//1=歩けない 0=歩ける
	char slip;		//1=滑る 0=滑らない
	char prickle;	//1=トゲ 0=痛くない
} map_attr_e;

#define MAP_CHIP_PART_NUMS 100
//	パーツの属性テーブル
map_attr_e map_map_attr[MAP_CHIP_PART_NUMS] = {
	{1,0,0}, //	パーツ0の属性
	{1,0,0}, //	パーツ1の属性
	{1,0,0}, //	パーツ2の属性
	{1,0,0}, //	パーツ3の属性
	{0,0,0}, //	パーツ4の属性
		:
};

//	使い方
int map_chip = MAP_CHIP((Player->Y+32)/32,(Player->X)/32);
if( map_map_attr[map_chip].stop ) {//歩けない?
	//	あるけない処理
}
【補足】
歩けないパーツ番号の入った配列とforループで比較しても良いですが、こっちのほうが処理はシンプルになります。

Re: 配列の中のどれかと等しかったら処理を実行する

Posted: 2012年6月01日(金) 15:02
by Chalaza
構造体にしてみたらわかりやすくできました。
おかげで『すごく滑る床』や、『乗っていると勝手に左右に動いてしまう床』、『出たり引っ込んだりするトゲ』も
できるようになりました。
ありがとうございました。