ボン○ーマンもどきを作っているのですが・・

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

ボン○ーマンもどきを作っているのですが・・

#1

投稿記事 by yos » 17年前

はじめまして。
プログラムなんぞ、書いた事の無い超初心者です。

ボン○ーマンでは、爆弾を置いた時には、その爆弾の上に乗ってる間は爆弾の上を通過できますよね?
でも一度、離れると通過できなくなります。
でも、敵は爆弾を置いた直後から通過できない。
これを表現したいのですが・・。
ちょっと分かりにくいですが、誰か教えて下さい。

管理人

Re:ボン○ーマンもどきを作っているのですが・・

#2

投稿記事 by 管理人 » 17年前

「進入禁止エリアにいるときは動けない」のではなく、「進入禁止エリアに入れない」という意味でプログラムをかけばなんてこと無いと思います。

32x32を一区間としているのであれば、32で割り切れるときにだけ、次の要素に入れるかどうかを判定すればよく、
既に進入禁止エリアに入ってしまっているのであれば、動けて当然です。
RPG的にプログラムを組むのなら、その要素を爆弾を置いた瞬間フラグを1にでもすれば、もう敵は入ってこれないでしょう。
普通にゲームプログラミングの館で紹介しているような2次元マップで表現し、その部分を1とか2とかにすれば解決すると思いますよ

yos

Re:ボン○ーマンもどきを作っているのですが・・

#3

投稿記事 by yos » 17年前

お早い回答ありがとうございます。

一応、32x32を一区間にしていますけど、プレイヤーは1づつ歩くので、
管理人さんの言われている方法だと、半端なところにいる場合、問題になりませんか?

でも、ちょっとよく分からないので、ソースを見ていただけますか?
int hantei[15][20] = {
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};

	if(player.flag==1){
	//up
	if( Key[ KEY_INPUT_UP   ]  == 1 ){
		player.count++ ;
		DrawGraph(player.x,player.y-16,image[player.count%80/20+player.muki*4],TRUE) ;//画像を描画
		for(i=0;i<player.speed;i++){
			if(player.x%64==32){
				player.muki=0;
				if(hantei[(player.y-1)/32][player.x/32]==1){
					break;
				}
				else if(hantei[(player.y-1)/32][player.x/32]==2){
					if(player.kabe_t==0)
						break;
					else
						player.y-=1;
				}
				else if(hantei[(player.y-1)/32][player.x/32]==3){
					if(player.bom_t==0)
						break;
					else
						player.y-=1;
				}
				else{
					player.y-=1;
				}
			}
			else if(player.x%64<32){
				player.muki=3;
				if(hantei[player.y/32][player.x/32+1]==1){
					break;
				}
				else if(hantei[player.y/32][player.x/32+1]==2){
					if(player.kabe_t==0)
						break;
					else
						player.x+=1;
				}
				else if(hantei[player.y/32][player.x/32+1]==3){
					if(player.bom_t==0)
						break;
					else
						player.x+=1;
				}
				else{
					player.x+=1;
				}
			}
			else if(player.x%64>32){
				player.muki=1;
				if(hantei[player.y/32][(player.x-1)/32]==1){
					break;
				}
				else if(hantei[player.y/32][(player.x-1)/32]==2){
					if(player.kabe_t==0)
						break;
					else
						player.x-=1;
				}
				else if(hantei[player.y/32][(player.x-1)/32]==3){
					if(player.bom_t==0)
						break;
					else
						player.x-=1;
				}
				else{
					player.x-=1;
				}
			}
		}
	}


	//爆弾の設置
	if(Key[KEY_INPUT_Z]==1){
		if(bb_flag==0){
			if((hantei[player.y/32][player.x/32]==0)||(hantei[player.y/32][player.x/32]==5)){
				for(i=0;i<player.bom;i++){
					if(bom.flag==0){
						bom.counter=0;//カウンター初期化
						if(player.x%32<17)
							bom.x=player.x-player.x%32;
						else
							bom.x=player.x-player.x%32+32;
						if(player.y%32<17)
							bom.y=player.y-player.y%32;
						else
							bom.y=player.y-player.y%32+32;


				         hantei[bom.y/32][bom.x/32]=3;
						bom.flag=1;
						break;
					}
				}
			}


このソースですと、爆弾にかぶってる方にいけないんですよね。
左に爆弾があって、右にプレイヤーが少し出ている場合でも左にいけない。
というところを直したいのです。

管理人

Re:ボン○ーマンもどきを作っているのですが・・

#4

投稿記事 by 管理人 » 17年前

コードを投稿される時は、最低限の注釈と変数の意味を付けて貰えると助かります。
ざっとしか読んでいませんが、恐らく属している配列要素の管理が出来ていないのではないでしょうか。

私もボンバーマンを作ったとき、属する要素関連付けるのに少し苦労しました。

中間にいるとき、進行方向に属する2つの要素を見る必要があるときもあります。

例えば、キャラを赤の□と青の□であらわしたとき、

画像

こちらの図の赤いキャラと青いキャラはほとんど同じ場所にいますが、属している区間がx,yともに違います。
赤は[y][x]において[0][0]に属しているのに対し、青は[1][1]に属していますよね?

今、赤の下が移動可能かどうかを調べる時、単純に[player.y/32+1]で調べると、左下を調べる事になってしまいます。
つまり、この時に調べるべきはxの属する要素+1のy要素+1じゃないといけません。そして移動しているうちに、x%32==0の座標に自動的に移動させる必要があります。

ボンバーマンの移動がかなりやっかりで苦労した覚えがあります。
わかりにくかったらまず図を書いて考えてみて下さい。

やそ

Re:ボン○ーマンもどきを作っているのですが・・

#5

投稿記事 by やそ » 17年前

>一応、32x32を一区間にしていますけど、プレイヤーは1づつ歩くので、
>管理人さんの言われている方法だと、半端なところにいる場合、問題になりませんか?

32×32を1区画としてMAPを構成しており、キャラクタの移動はその半分の16ピクセル単位で動かせる仕様になっている。

管理人さんが言われている通り、注釈が少なく、ロジックの解読が非常に困難です。
各変数(構造体)がどのような意味を持つのか。
自分の決めた「仕様」の明記。(どう動いて欲しいのか)は必須です。

キャラは半区画ごとに移動できるが、爆弾の設置は区画に沿った位置に置かれる。
なのでずれた位置で爆弾を設置したとき、爆弾のある方向にキャラクタがかぶっているので、その方向に移動したい。

ならば、管理人さんの言われている通り、32で割り切れる時のみ移動先の障害物判定をすればよく、
32で割り切れない”1歩(16ピクセル)ずれた位置”にいるときはどちらにも移動できる。とすればよい。
(0,0)=壁
(0,1)=通路
(0,2)=通路
(0,3)=壁
※各マスの幅は32ピクセル
キャラクタがX=48,Y=0((0,1)と(0,2)の中間)にいて、爆弾を(0,1)に設置した場合、
キャラの左半分は爆弾とかぶっている状態です。

移動判定の際は自分の今現在いる座標を調べて、32で割り切れるときにその方向の先にある障害物を判定すればよい。
この場合Y座標は32で割り切れるので、上下方向については移動方向の障害物判定を行い、
X座標については32で割り切れないので、そのまま移動できる。

というように判定すればよいのかな?

yos

Re:ボン○ーマンもどきを作っているのですが・・

#6

投稿記事 by yos » 17年前

ありがとうございました。
上手くいきました。

すみません。
次回から注意します。

閉鎖

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