• 締切済み

ブロック崩しを作っているのですが…。

ブロック崩しを作っているのですが ボールのあたり判定について困っています。 ソースコード→http://ameblo.jp/yuse1247/entry-11875651194.html ソースが汚いのでコメント入れてます。見にくくてすいません。 実行結果→http://ameblo.jp/yuse1247/entry-11875652132.html ※ここからはソースコードをみた前提で話します。 ボールがfield1 field2 field3に当たった時に跳ね返るようにしたいのですが どうすればいいでしょうか…。

  • Java
  • 回答数1
  • ありがとう数11

みんなの回答

noname#247307
noname#247307
回答No.1

まだ動かすスレッド処理がないようなので、その部分を作ってから考えたほうがいいとは思いますが……。 衝突処理は、もっとも手っ取り早い考え方としては、「対象となる者の中心点が、衝突相手の領域内にあるか否か」でチェックできます。ボールのような小さいものなら、大きさを無視して、その中心点がブロックの領域内にあるかどうかをチェックするわけですね。領域内にあれば衝突したとみなすわけです。 ただ、この方法だとボールがブロックにめり込んだ感じで反射するので美しくないし違和感はあるでしょう。 これを少し応用して、ボールの中心点から上下左右に半径だけ離れた4点(つまり輪郭線上を90度間隔で4箇所)について、対象のブロックの領域内にあるかどうかをチェックする、というやり方が考えられます。ブロックは四角形なので、角の部分を考えなければこれで衝突したかどうかチェックできます。 更に細かく割って、45度間隔で計8箇所について調べれば、ほぼ違和感ない衝突判定ができるでしょう。斜めの輪郭地点はsin/cos関数で算出します。 もちろん、もっと細かくして16箇所、32箇所と調べるようにすれば更に正確でなめらかな衝突処理が行えるでしょうが、それだけ演算量も増えます。個人的には、簡単なゲームなら8箇所調べるだけで十分な気がします。 ちなみに「跳ね返る」というのは、移動距離(コードのvx,vyがそれに相当?)をプラスマイナス反転させるだけです。xを反転させれば横方向に、yを反転させれば縦に跳ね返ります。この際、当たった位置によって値を増減させるとよりリアルになるでしょう。

関連するQ&A

  • こんにちは、現在ブロック崩しをつくろうと思い、以下のサイトのコードを参

    こんにちは、現在ブロック崩しをつくろうと思い、以下のサイトのコードを参考にしています。 ttp://www.geocities.jp/gamerabbits/bo1_5_s.htm しかしながら、これではブロックを描写することができませんでした。ゲーム初期関数における、for関数に問題があるということはわかるのですが、実際にどのようなコードを書けばいいのかわかりません。 どなたかアドバイスをお願いします。

  • 【行き詰まり】ブロック崩しゲーム作成【判定?】

    初めまして。 今課題ということでVB.NETでブロック崩しを作成しているのですが、 作成途中で詰まってしまい、ここへ書き込みをしています。 ・ボール、ブロックの初期配置 ・壁とブロックの当たり判定 まで作ったところで、講師から「プロパティを用いてブロックへの当たり判定と消える判定フラグをまとめろ」と言われました。 VB初心者で使い方が判らず、あちこち調べて見ましたがどうにも糸口が掴めません。 どなたかご存知の方いましたら、御教授の程をお願いします。 ソースは後ほど添付します。 よろしくお願いします。 (環境はVisual Basic 2008 Express Editionです)

  • Javaでテトリスを作っています。

    1週間前からテトリスを作り始めました。 http://ameblo.jp/jschool/entry-10521276002.html こちらの方を参考に自分なりに少し工夫して作っていきました。 残りはゲームオーバーの処理なんですがこちらのサイトには 載っていなく、自分で考えてもうまくいかず…。どうすれば いいでしょうか。ソースコードはかなり汚いです。申し訳ございません。 四次元配列を使っています。ここの時点で問題なんですが…。。。。 ソースコード→http://ameblo.jp/yuse1247/entry-11873360439.html

    • ベストアンサー
    • Java
  • C++でのブロック崩しゲームの作成に関して

    初めまして。C++で動くブロック崩しを作成していますがそれに関して2つ質問させて頂きます。 (1)オブジェクト指向によるブロック、パドルでのクラス宣言 オブジェクト指向に基づきプログラミングをしており、パドル、ブロック、ボールといった物体をクラス定義しそれらをゲームクラスで統括する方法をとっています。また、他クラスのインスタンスやメソッドはgetter/setter関数で取得し、その際に参照するクラスの宣言は"const Ball& ball"の様に行っています。 他クラスを参照する必要のある場合は、例えばBlockクラス内でBallとの衝突判定や衝突応答を行いたい時に宣言を行っています。衝突判定ならばBoolean型を返すだけなのでconstで宣言出来るのですが、衝突応答ではボールを反射させる(ボールの速度を変化させる)必要があるためconstで宣言出来ません。 現在は"Ball& ball"と宣言をしていますが、これでは他クラス内でインスタンスの値を変更できてしまうため行儀が良いとは思えません。言っている事が矛盾しているとは思いますが、何とか"const Ball& ball"で宣言しつつBlockクラス内でボールの速度を変化させる方法は無いでしょうか? (2)ブロックとボールの衝突応答 ブロックとボールの衝突応答について、以下の様に記述しています。 void Block::reflect(Ball& ball){ Vector ballnext; ballnext.x=ball.getx()+ball.getVx(),ballnext.y=ball.gety()+ball.getVy(); if(fabsf(ballnext.x-this->x) <= this->width/2 && fabsf(ball.getx()-this->x) >= this->width/2){ ball.setVx(-ball.getVx()); } else if(fabsf(ballnext.y-this->y) <= this->height/2 && fabsf(ball.gety()-this->y) >= this->height/2){ ball.setVy(-ball.getVy()); } } この関数より前にブロック内にボールが含まれるかどうかの衝突判定を行っています。この関数では、数秒先のボールの位置がブロック内に含まれており、現在のボールの位置が含まれていない場合のそれぞれの位置関係で反射方向を決めています。 ですがこれでは上手く反射されません。ボールがブロックに接触し暫く突き進んだ後に反射されます。 しかし、 ballnext.x=ball.getx()+ball.getVx()*2,ballnext.y=ball.gety()+ball.getVy()*4; の様に記述すると上手く反射されます。何故こうなるのかが理解出来ません。 長文になってしまい申し訳ありませんが、どなたかご教授して頂けたら幸いでございます。

  • NullPointerExceptionが出てしまいます

    NullPointerExceptionが出てしまいます アプレットでブロック崩しを作っているのですが、appletviewerで実行したところ、 java.lang.NullPointerException     at ファイル名.run(ファイル名.java;366) at java.lang.Thread.run(Thread.java;534) と表示され、ブロック崩しが動きません。 エラーの出ている部分は、 //あたり判定 if(a>=x-20&&a<=x+80&&b>=y-15&&b<=y+10);{ flag02=false; score=seikou+1; mySound02.play(); } のmySoundの部分です。 このコードはランクラスの中に入れています。 MySoundを消すと動きますが変な動きになってしまいます。 説明下手ですが、教えてくださるとうれしいです。

    • ベストアンサー
    • Java
  • プログラミング言語Javaに慣れている人に質問というかお願いです

    プログラミング言語Javaに慣れている人に質問というかお願いです 私はJavaに関しては勉強を始めたばかりの初心者です とりあえずブロック崩しを実行してみたくてソースをホームページから探しています が、なかなかうまく実行できるものがありません ブロック崩しのソースをもっている方、いませんか? リンクを貼って頂けるのも助かります ちなみに私が使っているのはUNIXでJavaのバージョンは1.6.0_18です

    • ベストアンサー
    • Java
  • Flash Lite1.1について

    Flashで携帯ゲームのブロック崩しを作りたくて、あるサイトからflaサンプルを見つけました。 製作者のコメントに「ブロックを全部崩しても何も起きませんので、エンディング等は自作してください。 」とあったので、早速4フレーム目にゲームオーバー画面を5フレーム目にクリア画面を作ってみました。 そして元々のソースから if(ball._y>235){ gotoAndPlay(1); } を if(ball._y>235){ gotoAndPlay(3); } にしたまではよかったのですが、 ブロックが全て無くなったらクリア画面に移動させる方法が分からず困っています。 元々のソースは↓になります。 // ボール移動 ball._x += vx; ball._y += vy; // 壁とボールの当たり判定 if(ball._x<5 && vx<0){ vx = -vx; } if(ball._x>235 && vx>0){ vx = -vx; } if(ball._y<5 && vy<0){ vy = -vy; } //ボールが下に落ちたらゲームオーバー if(ball._y>235){ gotoAndPlay(1); } // パドルとの当たり判定 if(ball._x>pad._x-40-5 && ball._x<pad._x+40+5 && ball._y>pad._y-5-5 && ball._y<pad._y+5+5 && vy>0){ vy = -vy; vx = (ball._x-pad._x)/80*15; } // ブロックとの当たり判定 for(i=1;i<=40;i++){ bx = eval("block" add i)._x; by = eval("block" add i)._y; if(ball._x>bx-20-5 && ball._x<bx+20+5 && ball._y>by-5-5 && ball._y<by+5+5 && eval("block" add i)._visible==true){ eval("block" add i)._visible = false; //左端or右端に当たった場合 if(ball._x<bx-20 || ball._x>bx+20){ vx = -vx; }else{ //上端or下端に当たった場合 vy = -vy; } } } どの場所にどのように書くべきかいろいろ探してみたのですが、パソコン用の作り方しか見つからす゜携帯用のFlash Lite1.1には対応していない物ばかりで困っています。 ActionScriptについては初心者であまり詳しくなく、本当に恥ずかしい限りです。 どうかお解かりになる方おりましたらお力をお貸し下さい。 宜しくお願い致します。

    • ベストアンサー
    • Flash
  • 号泣県議、野々村竜太郎のオフィシャルブログ

    http://ameblo.jp/nonomuraryutaroblog/archive1-201406.html なんとなく野々村県議のオフィシャルブログをみていて、259のコメントを見たらびっくり。 http://ameblo.jp/nonomuraryutaroblog/entry-11869234822.html#cbox 批判は全てカット、不自然な頑張れコメントだけ。 自作自演で、OKWAVEでは削除対象だと思うのですけど、この人もう終わりだと思うのは私だけでしょうか? 私と同意見やそれでも頑張れと言う意見があれば、お聞きしたいと思います。

  • Java ブロックコメント除去のコーディング方法

    Javaでソースのブロックコメントを除去したいと考えているのですが、良いコーディング方法を教えて頂けますでしょうか。 なぜそんなことをしたいか、理由は割愛しますが、言語などの条件は変更できません(秀丸などはNG)。 以下のサイトの方法も確認しましたが、コメントのネストに対応していないようです。 https://gist.github.com/froop/962736 ネスト対応も改造すればできますが、正規表現プラスreplaceAllでできないかと考えています。 が、コメント内には改行コード含めいろいろなデータが入る可能性があり、コメントのネストもあり、私の正規表現スキルでは表現が分かりません… どなたか得意な方教えて頂けると… 1実行の最大で10,000ファイル×200kbほどですが、何度も実行するため、性能は良い方が嬉しいです。

    • ベストアンサー
    • Java
  • プログラミング言語Javaに詳しい方に質問です

    プログラミング言語Javaに詳しい方に質問です と言っても実行の仕方みたいなものですが 学校の宿題でプログラミングの宿題を出されました 私はブロック崩しをやろうと思って、インターネット上から ソースコードをダウンロードしました JavaにOSは関係ないみたいですが、一応言っておくと 家のパソコンはWindowsXPです ダウンロードしたソースコードをメモ帳に保存し、 コマンドプロンプト上で実行したらうまくいきました そこで学校のパソコンでやったらこれが上手くいかないわけです ちなみに学校のパソコンはUNIXです コンパイルしてもエラーはないのです ただUNIXのでやるとappletviewerを実行したとき アプレットが初期化されていないと表示されてしまい 何にも起こらないんですよね ターミナル上にはなんだかよくわからない"at"から始まる 警告みたいな感じなのがたくさん出てきていたのが気になったのですが なぜかわかる方いますか?

    • ベストアンサー
    • Java

専門家に質問してみよう