[過去ログ]
Windowsゲームプログラミング 質問スレ (973レス)
Windowsゲームプログラミング 質問スレ http://mevius.5ch.net/test/read.cgi/gamedev/1225974525/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
14: 名前は開発中のものです。 [sage] 2008/11/11(火) 22:02:10 ID:v37PimrE ブロック崩しを作ろうとしているのですが、 ブロックとの当たり判定でボールがブロックとぶつかった際、本来跳ね返らなければいけないのに 時々跳ね返らず貫通して進んでしまうことが起きてしまいます、貫通弾はまだ書いてないのに…… どうしたらいいのでしょうか 言語は基本C、クラスとか途中で変数宣言とかちょっとだけC++入ってるかも、DxLibを使用しています 肝心の当たり判定の部分のソース for(int i=0;i<BlockX;i++){ for(int s=0;s<BlockY;s++){ if(BlockFlag[i][s]){ if(ShellX>=LeftEdge+35*i-ShellR && ShellX<=LeftEdge+35*(i+1)+ShellR){ //X範囲の判定 if(ShellY>=UpEdge+20*s-ShellR && ShellY<=UpEdge+20*(s+1)+ShellR){ //Y範囲の判定 BlockFlag[i][s]=0; ShellVX*=(-1); ShellVY*=(-1); } } } } } http://mevius.5ch.net/test/read.cgi/gamedev/1225974525/14
20: 名前は開発中のものです。 [] 2008/11/12(水) 10:40:33 ID:kFb9KO8q >>14 >>19でも指摘されてるけど、2つのブロックに同時に触れた場合は 移動方向が元に戻るから貫通するよ。 だから「ShellVY*=(-1);」の後に「break;」を入れれば とりあえず貫通するバグは無くなる。 でもそもそも判定ロジックが間違ってるので、全部書き直さなきゃダメ。 当たった部分が縦の面か横の面かの判定をしなきゃまともに跳ね返らない。 前フレームの玉の位置と現在の位置を線で結んで、各ブロックの 4つの側面のどこと交差しているかを判定する必要がある。 横面と交差してるならYだけ反転、縦面と交差してるならXだけ 反転させる。 玉のスピードが速いと、複数のブロックと同時交差する場合もある。 その時は一番玉に近いブロックとの判定だけに絞り、玉の位置も そのブロックに接触する直前のポジションまで移動させる。 http://mevius.5ch.net/test/read.cgi/gamedev/1225974525/20
21: 14 [sage] 2008/11/12(水) 15:58:41 ID:58FrgqUc なるほど、理屈は理解できました しかしどういうソースを書けばいいのかがまるで思いつかない…… いったいどういしたらいいのでしょうか? http://mevius.5ch.net/test/read.cgi/gamedev/1225974525/21
23: 14 [sage] 2008/11/14(金) 05:07:34 ID:wWFUvlwz >>22 ありがとうございます しかし読んでみたはいいのですがそれをどう組み込んでいいかがやっぱり思いつきませんでした なのでがんばって自己流で判定組んでみたら 「○○.exe の 0x0056e0b6 でハンドルされていない例外が発生しました: 0xC0000094: Integer division by zero」 とか出されてしまいました、一体これはどういうことなんでしょうか? http://mevius.5ch.net/test/read.cgi/gamedev/1225974525/23
24: 14 [sage] 2008/11/14(金) 05:14:12 ID:wWFUvlwz ソース int ShellAX, ShellAY, ShellXT, ShellYT; //xが次のエリアに到達するまでの時間 if(ShellVX==0){ //分母が0防止 ShellXT=0; }else{ if(ShellVX>0){ //右に変化中 ShellXT=(35-(ShellBX%35))/ShellVX; }else{ //左に変化中 ShellXT=(-1)*(ShellBX%35)/ShellVX; } } //yが次のエリアに到達するまでの時間 if(ShellVY==0){ //分母が0防止 ShellYT=0; }else{ if(ShellVY>0){ //下に変化中 ShellYT=(20-(ShellBY%20))/ShellVY; }else{ //上に変化中 ShellYT=(-1)*(ShellBY%35)/ShellVY; } } ShellAX=ShellBX/35; ShellAY=ShellBY/20; http://mevius.5ch.net/test/read.cgi/gamedev/1225974525/24
25: 14 [sage] 2008/11/14(金) 05:14:58 ID:wWFUvlwz while(ShellX>LeftEdge&&ShellX<LeftEdge+350&&ShellY>0&&ShellY<20*BlockY){ //ブロックが存在しうる範囲かどうか if(ShellXT<ShellYT){ //Xのエリアが先に変化 if(ShellVX>0){ //右方向に突入 if(BlockFlag[ShellAX+1][ShellAY]){ //突入した先にブロックが存在 BlockFlag[ShellAX+1][ShellAY]=0; ShellVX*=(-1); ShellX=35*(ShellAY+1); //エリア突入時の境界線へ移動 ShellY=ShellBY+(ShellVY/ShellVX)*(35*(ShellAY+1)-ShellBY); //エリア突入時にyが進んだ分だけ増加 break; }else{ //突入してもなかったよ ShellAX++; //判定を次のエリアへ移行 ShellXT+=35/ShellVX; //次のエリアへの突入時間加算 } }else{ //左方向に突入 if(BlockFlag[ShellAX-1][ShellAY]){ //突入した先にブロックが存在 BlockFlag[ShellAX-1][ShellAY]=0; ShellVX*=(-1); ShellX=35*ShellAX; //エリア突入時の境界線へ移動 ShellY=ShellBY+(ShellVY/ShellVX)*(35*ShellAX-ShellBX); //エリア突入時にyが進んだ分だけ増加 break; }else{ //突入してもなかったよ ShellAX--; //判定を次のエリアへ移行 ShellXT=35/ShellVX; //次のエリアへの突入時間加算 } } http://mevius.5ch.net/test/read.cgi/gamedev/1225974525/25
26: 14 [sage] 2008/11/14(金) 05:15:41 ID:wWFUvlwz }else{ //Yのエリアが先に変化 if(ShellVY>0){ //下方向に突入 if(BlockFlag[ShellAX][ShellAY+1]){ //突入した先にブロックが存在 BlockFlag[ShellAX][ShellAY+1]=0; ShellVY*=(-1); ShellY=20*(ShellAY+1); //エリア突入時の境界線へ移動 ShellX=ShellBX+(ShellVX/ShellVY)*(20*(ShellAY+1)-ShellBY); //エリア突入時にxが進んだ分だけ増加 break; }else{ //突入してもなかったよ ShellAY--; //判定を次のエリアへ移行 ShellYT+=20/ShellVY; //次のエリアへの突入時間加算 } }else{ //上方向に突入 if(BlockFlag[ShellAX][ShellAY-1]){ //突入した先にブロックが存在 BlockFlag[ShellAX][ShellAY-1]=0; ShellVY*=(-1); ShellY=20*ShellAY; //エリア突入時の境界線へ移動 ShellX=ShellBX+(ShellVX/ShellVY)*(20*ShellAY-ShellBY); //エリア突入時にxが進んだ分だけ増加 break; }else{ //突入してもなかったよ ShellAY++; ShellYT+=20/ShellVY; } } } //抜け出し要素判定 if(ShellAX==ShellX/35||ShellAY==ShellY/20){ //判定エリアが既にボールが来たことになっている場所とおなじなら break; } } http://mevius.5ch.net/test/read.cgi/gamedev/1225974525/26
28: 14 [sage] 2008/11/15(土) 03:43:14 ID:NhltAbHO 前のほうでやってるのに忘れていました とりあえず ShellXT<ShellYT のところを ShellXT<ShellYT && ShellXT!=0 にしてみたら動いたは動いたのですが ボールがあらぬ挙動をします 当たっているのに当たった動きをしなかったり、突然わけのわからないところへ移動したり 原因がさっぱりです…… 一応上記の判定は、画面を35*20のエリアに分けて、今いるエリアから別のエリアに移動したら、 そこにブロックが有るか無いか判定、という形で組んでみています (今更ですが、ブロックを35*20でやっているので、ですね) もしかしたらこのあたり判定でなく、>>20の方法でやらなければダメなのでしょうか でしたら、よければそのソースを教えていただけませんでしょうか? http://mevius.5ch.net/test/read.cgi/gamedev/1225974525/28
33: 名前は開発中のものです。 [sage] 2008/11/20(木) 02:14:48 ID:njtRhxXk なんかわからんけど >>14 と >>19 を見た感じ これでいんじゃね? CurShellVX = ShellVX; CurShellVY = ShellVY; for(int i=0;i<BlockX;i++){ for(int s=0;s<BlockY;s++){ if(BlockFlag[i][s]){ if(ShellX>=LeftEdge+35*i-ShellR && ShellX<=LeftEdge+35*(i+1)+ShellR){ //X範囲の判定 if(ShellY>=UpEdge+20*s-ShellR && ShellY<=UpEdge+20*(s+1)+ShellR){ //Y範囲の判定 BlockFlag[i][s]=0; ShellVX = -CurShellVX; ShellVY = -CurShellVY; } } } } } http://mevius.5ch.net/test/read.cgi/gamedev/1225974525/33
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.037s