質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.58%

Proccessingでシューティングゲームを作成しています。あたり判定を本文の様に考えています

受付中

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 536

haniwa3

score 18

自機が発射する弾と敵機の矩形あたり判定について
考えていますが、想定通りにならずに困っています。

当たり判定に必要な情報は

画像の位置と
画像のサイズ(縦と横)

2画像分(今回は敵機と自機が発射する弾)
あれば作成できると考えています。

敵機には配列を使って画像をコピーしています。

イメージは下記の画像となります。
イメージ説明

敵機は向かって右から左に向かって移動していきます。

ソースは下記のように作成しています。
※上記に挙げた情報は全て取得できています。情報は別のクラスから取得して持って来ています。

void atari_hantei(int[][] ew, int[][] eh, int pw, int ph, int sw, int sh){

//敵機の画像情報取得
ew = enemys.get_width();

eh = enemys.get_height();

//自機の画像情報取得
pw = player1.width_size();
ph = player1.height_size(); 
//弾の画像情報取得
sw = shot.width_size();
sh = shot.height_size();

//X1 + W1 < X2
//=弾の横位置(shot_yoko) + 弾画像の横幅(sw) < 敵機の横位置(enemy_yoko)
//X1 > X2 + W2
//=弾の横位置(shot_yoko) > 敵機の横位置(enemy_yoko) + 敵機画像の横幅(ew[num_x][num_y])  
//Y1 + H1 < Y2
//=弾の縦位置(shot_tate) + 弾画像の縦幅(sh) < 敵機の縦位置(enemy_tate)    
//Y1 > Y2 + H2
//=弾の縦位置(shot_tate) > 敵機の縦位置(enemy_tate) + 敵機画像の縦幅(eh[num_x][num_y])

if(shot_life == 1){
for(int num_x = 0; num_x < 5; num_x++){
for(int num_y = 0; num_y < 5; num_y++){
if(enemy_life[num_x][num_y] == 1){

int enemy_num = ew[num_x][num_y] * eh[num_x][num_y];
println(enemy_num);

if(shot_yoko + sw < enemy_yoko || shot_yoko > enemy_yoko + ew[num_x][num_y] || shot_tate + sh < enemy_tate || shot_tate > enemy_tate + eh[num_x][num_y]){ 
println("当たってない");
}else{
println("当たり");
}
shot_life = 0;
enemy_life[num_y][num_x] = 0;
enemy_num --;

}
}
}
}
}

####################################################################

上記のソースが目指しているものは、当たり判定後、当たった敵機の画像が格納されている
配列を調べて、一台ずつ消していくということを目指しています。

この手の処理に詳しい方いらしたら、御教示のほどよろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2018/11/11 17:26

    ソースコードはマークダウンのcode機能を利用してください https://teratail.com/help#about-markdown

    キャンセル

回答 1

0

いくつか方法があると思いますが、

println("当たり")の処理において
敵機の画像を変えるのが簡単かと思います。
敵機のクラスで画像を設定するメソッドを設けておき、
そのクラスで画像を当たった時のエフェクトに変更するのが良いのではないでしょうか。
*確認してませんが、画像をnullにすれば敵機は消えるかも。

画像を削除しなくても、敵の位置を画面外に変更する方法もあります。
println("当たり")の処理において、
敵機の x座標(又はy座標)をマイナス値か+の大きい値にすれば
当たり判定後に敵機が消えるはずです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Javaに関する質問
  • Proccessingでシューティングゲームを作成しています。あたり判定を本文の様に考えています