横スクロールゲームのブロックなどにキャラクターを着地させたいと考えています。
それでこんなプログラムを組みました。
//bx[],by[]というのは障害物の座標を示す変数です。x,yはプレイヤーの座標です。
ブロックのx座標の間にキャラクターのx座標がある状態でブロックの上辺のy座標とプレイヤーの底辺y座標が同じになった時に
y_janという値にブロックの上辺のy座標を代入しています。
for(int c=0;c<3;c++){
if(x+32>bx[c]-48 && x-32<bx[c]+48 && y+43==by[c]-48){
y_jan=by[c]-48;
}
//ジャンプ中の処理。ジャンプボタンを押した時のyの位置を格納しているy_janとyの値が同じになった時に処理をやめるように設定しています。
if(jflag==1){
y_temp=y;
y+=(y-y_prev)+1;
y_prev=y_temp;
result=1;
if(y==y_jan){
jflag=0;
}
}
//ジャンプボタンの処理。ジャンプする前のyの位置をy_janに格納しています。
if(key[KEY_INPUT_SPACE]==1 && jflag==0){
jflag=1;
y_prev=y;
y=y-10;
y_jan=y;
}
//ブロックの描画です。96×96の画像なのでxとyにそれぞれ-48をして位置の調整をしています。
DrawGraph(bx[0]-48,by[0]-48,bl,TRUE);
DrawGraph(bx[1]-48,by[1]-48,bl,TRUE);
DrawGraph(bx[2]-48,by[2]-48,bl,TRUE);
//プレイヤーの描画です。64×84の画像なのでブロックの描画の処理と同じくx,yにそれぞれの数をマイナスしています。
DrawGraph(x-32,y-43,gh[result],TRUE);//主人公の表示
プレイヤーがブロックの上に位置した時にy_janという値にそのブロックの上辺の値を格納して
それによりy==y_janで終了するジャンプ処理を終わらせようと思ってこのプログラムを作りました。
でも何故かキャラクターがブロックをすり抜けて着地してしまいます。
何故そうなるのか、またどうすれば着地させることができるのかを教えてほしいです。
ちなみに横スクロールなのでブロックの位置はプレイヤーが動くことで変化していきます。
http://dixq.net/g/26.html
このサイトで配列を使って移動できる場所とできない場所を設定することを説明してくれていますが、移動できない場所が移動していくタイプの
ゲームにこれは利用できないですよね?
初歩的な質問かもしれませんが昨日の夜中と今日一日中調べて試行錯誤しても解決できなかったので解答をお願いしたいです。
どうかよろしくお願いします。
ちなみに、
//プレイヤーとブロックが衝突しているか調べる。
衝突していてプレイヤーが右側にいたらratariを1にする。左側にいたらlatariを1にする
for(int c=0;c<3;c++){
if((x-32<=bx[c]+48)
&&(x+32>=bx[c]-48)
&&(y-43<=by[c]+48)
&&(y+43>=by[c]-48))
{
if(x<bx[c]){
ratari=1;
}
if(x>bx[c]){
latari=1;
}
}
}
//右キーを入力していてratariが0であれば移動する。左キーを入力していてlatariが0であれば移動する。
if(key[KEY_INPUT_RIGHT]==1){
if(ratari==0){
x+=4;
}
}
if(key[KEY_INPUT_LEFT]==1){
if(latari==0){
x-=4;
}
}
このプログラムを書いてブロックのある場所に左右からでは侵入できないような設計には成功しています。
横スクロールゲームの障害物に着地するジャンプ処理
Re: 横スクロールゲームの障害物に着地するジャンプ処理
下の左右に関する判定のプログラムでは座標を不等号で評価しているのに、
上のジャンプのプログラムでは等号で評価している所がありますね。
とりあえず、「y_janとyの値が同じになった時に処理をやめる」という判定を、
「yの値がy_jan以上になった時に処理をやめる」としてみてください。
上のジャンプのプログラムでは等号で評価している所がありますね。
とりあえず、「y_janとyの値が同じになった時に処理をやめる」という判定を、
「yの値がy_jan以上になった時に処理をやめる」としてみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
-
教えてほしいです
Re: 横スクロールゲームの障害物に着地するジャンプ処理
返信ありがとうございます。
if(y>=y_jan){
jflag=0;
}
としてやってみたけどやはりすり抜けてしまいました。
どこか別の部分にミスがあるのでしょうか。
後もし良ければ配列に0と1を配置して通れる場所通れない場所を定義する方法で障害物が移動する横スクロールのゲームの
あたり判定を作ることができるのかできないのか教えてほしいです。
if(y>=y_jan){
jflag=0;
}
としてやってみたけどやはりすり抜けてしまいました。
どこか別の部分にミスがあるのでしょうか。
後もし良ければ配列に0と1を配置して通れる場所通れない場所を定義する方法で障害物が移動する横スクロールのゲームの
あたり判定を作ることができるのかできないのか教えてほしいです。