トップページ > 記事閲覧
床の当たり判定について
名前:まっちゃん 日時: 2014/08/28 01:26

管理人さん 管理人さんの場合、主人公はdrawboxで書かれた四角を操作するみたいですが 僕が考えているのは、drawgraphで描画した主人公を操作することです。 僕の場合も、主人公に合わせて、描画した壁を動かすことはできるのですか? もしできるならば、その方法なども教えてほしいです。。。
メンテ

Page: 1 |

Re: 床の当たり判定について ( No.1 )
名前:管理人 日時:2014/08/28 01:28

> 僕の場合も、主人公に合わせて、描画した壁を動かすことはできるのですか? できます DrawBox で四角を描画していたところを DrawGraph で画像を描画するように変更すれば良いのですよね? プレイヤーの画像として Player.bmp を、壁用の画像として Wall.bmp を読み込んで DrawGraph で描画するようにしたプログラムをこちらにアップしましたので、よろしければご覧ください https://dxlib.xsrv.jp/temp/ActionSample.cpp あと、上記プログラムをコンパイルした実行ファイルや Player.bmp と Wall.bmp を纏めた ものをこちらにアップしましたので、実行した際の様子についてはこちらをご覧ください https://dxlib.xsrv.jp/temp/ActionSample.zip
メンテ
Re: 床の当たり判定について ( No.2 )
名前:まっちゃん 日時:2014/08/28 01:29

管理人さん ご丁寧にありがとうございます! 書いていただいたソースと、自分のソースを組み合わせると 1の部分に壁を作り、キャラに合わせて動かすことが可能になりました! しかし、衝突判定部分が、まだうまくいかないので、いろいろいじくっていきたいとおもいます
メンテ
Re: 床の当たり判定について ( No.3 )
名前:まっちゃん 日時:2014/08/28 01:30

管理人さん またまたすみません。。。 アクションサンプルのプログラム中に、マップチップの値を取得する関数 int GetChipParam(float cx,float cy){ int cx,cy; cx=(int)cx/CHIP_SIZE; cy=(int)cy/CHIP_SIZE; if(cx>=MAP_WIDTH || cy>=MAP_HEIGHT || cx<0 || cy<0){ return 0; } return hantei[cy][cx]; } このように記述しビルドすると、添え字に整数でない型が使われました。とのエラーが出て 動作しません。 これは、どのようなことが原因なんでしょうか?
メンテ
Re: 床の当たり判定について ( No.4 )
名前:Will 日時:2014/08/28 01:32

関数の引数名と変数名が同じ名前になっているのが原因です。
メンテ
Re: 床の当たり判定について ( No.5 )
名前:まっちゃん 日時:2014/08/28 01:33

管理人さん すみません、こうゆうのって案外自分じゃ気づかないもんで、、、 ありがとうございました。
メンテ
Re: 床の当たり判定について ( No.6 )
名前:まっちゃん 日時:2014/08/28 01:35

キャラxが画面真ん中にきたら移動量を0にし、背景をスクロールさせるというプログラム を組んだのですが、背景のスクロール最中の当たり判定のつけ方は どうしたらいいでしょうか? #define SCREEN_WIDTH (3840) // 画面の横幅 #define SCREEN_HEIGHT (480) // 画面の縦幅 #define CHIP_SIZE (32) // 一つのチップのサイズ #define MAP_WIDTH (SCREEN_WIDTH / CHIP_SIZE) // マップの横幅 #define MAP_HEIGHT (SCREEN_HEIGHT / CHIP_SIZE) // マップの縦幅 #define CHAR_SIZE (30) #define G (0.3F) // キャラに掛かる重力加速度 #define speed (3.0F) #define p_jump (7.0F) //キャラのジャンプ力 #define h_speed (4.0F) //背景のスピード int pr;//プレイヤーハンドル float px=0.0,py=420.0;//キャラ用変数 float Movex=0.0F,Movey=0.0F;//移動量 int ph,pw;//キャラ画像の高さと幅 float p_downsp=4.0F; bool p_flag=false;//ジャンプフラグ char Key[256]; int wall;//床ハンドル int stage_haikei,sh_x=0;//背景用変数 // マップとの当たり判定( 戻り値 0:当たらなかった 1:左辺に当たった 2:右辺に当たった // 3:上辺に当たった 4:下辺に当たった // 注意:MoveX と MoveY 、どっちか片方が0じゃないと動作しない int MapHitCheck(float cx,float cy,float *Movex,float *Movey); char hantei[MAP_HEIGHT][MAP_WIDTH] ={ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 ,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 ,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 ,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 ,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 ,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 ,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 ,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,1,0,0,0, 0,0,1,1,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0 ,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 ,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 ,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 ,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,2,2,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 ,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,2,2,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,1,0,0,0, 0,0,0,0,0, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 ,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,1,0,0,0, 0,0,0,0,0, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 ,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,1,1,1,1, 0,1,0,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1 ,1,1,1,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, 1,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, } ; int GetChipParam(float x,float y){ int cx,cy; cx=(int)x/CHIP_SIZE; cy=(int)y/CHIP_SIZE; if(cx>=MAP_WIDTH || cy>=MAP_HEIGHT || cx<0 || cy<0){ return 0; } return hantei[cy][cx]; } // キャラクタをマップとの当たり判定を考慮しながら移動する int CharMove(float *cx,float *cy,float *DownSP,float Movex,float Movey,float size,bool *p_flag){ float Dummy = 0.0F ; float hsize ; // キャラクタの左上、右上、左下、右下部分が当たり判定のある // マップに衝突しているか調べ、衝突していたら補正する // 半分のサイズを算出 hsize=size*0.5F ; // 先ず上下移動成分だけでチェック { // 左下のチェック、もしブロックの上辺に着いていたら落下を止める if( MapHitCheck(*cx-hsize,*cy+hsize,&Dummy,&Movey)==3){ *DownSP=0.0F; } // 右下のチェック、もしブロックの上辺に着いていたら落下を止める if(MapHitCheck(*cx+hsize,*cy+hsize,&Dummy,&Movey)==3){ *DownSP=0.0F; } // 左上のチェック、もしブロックの下辺に当たっていたら落下させる if( MapHitCheck(*cx-hsize,*cy-hsize,&Dummy,&Movey)==4){ *DownSP=-1.0F; } // 右上のチェック、もしブロックの下辺に当たっていたら落下させる if(MapHitCheck(*cx+hsize,*cy-hsize,&Dummy,&Movey)== 4){ *DownSP=-1.0F; } // 上下移動成分を加算 *cy+=Movey; } // 後に左右移動成分だけでチェック { // 左下のチェック MapHitCheck(*cx-hsize,*cy+hsize,&Movex,&Dummy); // 右下のチェック MapHitCheck(*cx+hsize,*cy+hsize,&Movex,&Dummy); // 左上のチェック MapHitCheck(*cx-hsize,*cy-hsize,&Movex,&Dummy); // 右上のチェック MapHitCheck(*cx+hsize,*cy-hsize,&Movex,&Dummy); // 左右移動成分を加算 *cx+=Movex; } // 接地判定 { // キャラクタの左下と右下の下に地面があるか調べる if(GetChipParam(*cx-size*0.5F,*cy+size*0.5F+1.0F)==0 && GetChipParam(*cx+size*0.5F,*cy+size*0.5F+1.0F)==0){ // 足場が無かったらジャンプ中にする *p_flag=true; } else{ // 足場が在ったら接地中にする *p_flag=false; } } return 0 ; } int MapHitCheck(float cx,float cy,float *Movex,float *Movey){ float afX,afY; // 移動量を足す afX=cx+*Movex; afY=cy+*Movey; // 当たり判定のあるブロックに当たっているかチェック if(GetChipParam(afX,afY)==1){ float blx,bty,brx,bby; // 当たっていたら壁から離す処理を行う // ブロックの上下左右の座標を算出 blx=(float)((int)afX/CHIP_SIZE)*CHIP_SIZE; // 左辺の X 座標 brx=(float)((int)afX/CHIP_SIZE+1)*CHIP_SIZE; // 右辺の X 座標 bty=(float)((int)afY/CHIP_SIZE)*CHIP_SIZE; // 上辺の Y 座標 bby=(float)((int)afY/CHIP_SIZE+1)*CHIP_SIZE; // 下辺の Y 座標 // 上辺に当たっていた場合 if(*Movey>0.0F){ // 移動量を補正する *Movey=bty-cy-1.0F ; // 上辺に当たったと返す return 3; } // 下辺に当たっていた場合 if(*Movey<0.0F){ // 移動量を補正する *Movey=bby-cy+1.0F; // 下辺に当たったと返す return 4; } // 左辺に当たっていた場合 if(*Movex>0.0F){ // 移動量を補正する *Movex=blx-cx-1.0F; // 左辺に当たったと返す return 1; } // 右辺に当たっていた場合 if(*Movex<0.0F){ // 移動量を補正する *Movex=brx-cx+1.0F; // 右辺に当たったと返す return 2; } // ここに来たら適当な値を返す return 4; } // どこにも当たらなかったと返す return 0; } void pmove(){ { //左キーが押されたとき if(Key[KEY_INPUT_LEFT]==1){ muki=1; key_flag=true; r_flag=1; Movex-=speed; if(Movex<=-3.0F){ Movex=-3.0F; } if(px>=320-32){ px-=(int)4*speed; if(px<=320-32){ px=320-32; Movex=0; sh_x+=h_speed; } } if(sh_x>=0){ sh_x=0; if(px<=320-32){ Movex-=speed; } } } //右キーが押されたとき if(Key[KEY_INPUT_RIGHT]==1){ muki=3; key_flag=true; r_flag=3; Movex+=speed; if(Movex>=3.0){ Movex=3.0; } if(px>=320-32){ px=320-32; Movex=0; sh_x-=h_speed; } if(sh_x<=-3200){ sh_x=-3200; if(px>=320-32){ Movex+=speed; } } } //上キーが押されたとき if(Key[KEY_INPUT_UP]==1 && p_flag==false){ muki=4; p_downsp=-p_jump; p_flag=true; } p_downsp+=G; Movey=p_downsp; CharMove(&px,&py,&p_downsp,Movex,Movey,CHAR_SIZE,&p_flag); } みずらく、ぐちゃぐちゃになって申し訳ございません。。。
メンテ
Re: 床の当たり判定について ( No.7 )
名前:管理人 日時:2014/08/28 01:37

マップの端より外側は表示しないようにしたいということですね? 少し考え方を変えると簡単です プレイヤーは画面の真ん中に来ると動きが止まって、代わりに背景が動き出しているように見えますが、 実際は『画面に描画するゲーム世界内の範囲が移動している』だけで、プレイヤーは相変わらず動き続け、 背景は相変わらず止まったままです 要は DrawGraph で描画する際の描画座標だけ弄れば良くて、プレイヤーの座標 px, py の変化については 画面内の何処に居るかは気にする必要はありません とりあえずマップの外側は映らないようにしてみたプログラムを作成しましたので、よろしければご覧ください https://dxlib.xsrv.jp/temp/ActionSample2.cpp あと、例によって上記プログラムをコンパイルした実行ファイルや Player.bmp と Wall.bmp を 纏めたものをこちらにアップしましたので、実行した際の様子についてはこちらをご覧ください https://dxlib.xsrv.jp/temp/ActionSample2.zip
メンテ
Re: 床の当たり判定について ( No.8 )
名前:まっちゃん 日時:2014/08/28 19:08

ありがとうございます。わかりやすくて、助かります。 なるほど、、、 背景が描画され、その上をキャラクタが歩いてるだけであって、背景は動かさない、ということですか。 さらにそれプラス、背景の大きさに合わせ SCREEN_WIDTH(3840)にし DrawBaseX=px-SCREEN_WIDTH/6、マップチップの幅を変え マリオ?みたいな感じにしたかったのですが これでビルドすると、背景とブロックの描画位置が変わらず、キャラが画面640の座標を超えると 消えてしまいます。 マップチップの大きさを変えるのはだめなのでしょうか?
メンテ
Re: 床の当たり判定について ( No.9 )
名前:まっちゃん 日時:2014/08/28 19:53

すみません、やっぱり大丈夫です! うまくできました!! ほんとにありがとうございます。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存