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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

2056閲覧

弾の当たり判定をどこにどのように書けばいいかわかりません。

alastashim

総合スコア16

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2017/07/13 02:22

###前提・実現したいこと
現在processingで簡単なシューティングゲームを作っているのですが、弾(BULLET)と敵(ENEMY1)との当たり判定をうまくつけることができません。
自分で一度,
{(弾のX座標)+(弾のwidth/2)<(敵のX座標)}
かつ{(弾のY座標)<(敵のY座標)+(敵のheight/2)}
かつ{(弾のY座標)>(敵のY座標)-(敵のheight/2)}
として当たり判定をつけて見たのですが、、敵のX座標とは異なる場所で当たり判定がでました。そして、よくわからず ArrayList を用いて弾を作ってしまったのでどこに当たり判定の行を書けば良いかわかりません。なので、どこの行にどのように当たり判定のプログラムを書くとうまくいくのでしょうか。拙い説明ですが、お許しください。

###発生している問題・エラーメッセージ

当たり判定がうまくいかない

###該当のソースコード

Processing

1float mx=mouseX; 2float my=mouseY; 3int msp=3; 4float e1x = 1250; 5float e1y = random(0, height); 6float ree1x = 1250; 7float ree1y = random(0, height); 8float ebx=1200, eby=350; 9int jotai=0; 10ME me; 11ENEMY1 en1; 12ArrayList<BULLET> bulletList = new ArrayList<BULLET>(); 13float bx;//弾のx 14float by;//弾のy 15float bwi;//弾のサイズ 16float bhe; 17float bsp; 18int score = 0; 19 20void setup() { 21 size(1250, 700); 22 frameRate(30); 23 noCursor(); 24 me = new ME(); 25 en1 = new ENEMY1(e1x, e1y); 26} 27 28void draw() { 29 30 if (jotai==0) { 31 background(0); 32 textSize(32); 33 fill(255); 34 text("'Right Click' is clicked to start", 400, 350) ; 35 } 36 37 38 if (jotai==1) { 39 background(0); 40 for (int i=bulletList.size()-1; i>=0; i--) { 41 BULLET b = bulletList.get(i); 42 if (b.isAlive()) { 43 b.move(); 44 b.display(); 45 } else { 46 //画面外の弾は削除 47 bulletList.remove(i); 48 } 49 } 50 en1.move(); 51 en1.display(); 52 me.move(mouseY); 53 me.display(); 54 text("SCORE:"+str(score), width/7, height -50) ; 55 } 56 57 if (jotai==2) { 58 fill(0); 59 rect(0, 0, width, height); 60 textSize(32); 61 fill(255); 62 text("GAME OVER", 600, 350) ; 63 text("RESTART is 'Right Click'", 600, 500); 64 } 65} 66 67 68void mousePressed() { 69 70 if (jotai==0) { 71 72 if (mouseButton==RIGHT) { 73 jotai=1; 74 } 75 } 76 if (jotai==1) { 77 if (mouseButton==LEFT) { 78 bulletList.add(new BULLET(me.mx, me.my)); 79 } 80 } 81 if (jotai==2) { 82 if (mouseButton==RIGHT) { 83 jotai=0; 84 } 85 } 86} 87 88class ME {//自機の情報 89 float mx=50, my;//自機のx,y座標 90 91 void move(float _y) { 92 my = _y; 93 } 94 void display() { 95 noStroke(); 96 fill(40, 190, 255); 97 ellipse(mx, my, 30, 30); 98 } 99} 100 101class BULLET { 102 float bx;//弾のx 103 float by;//弾のy 104 float bwi;//弾のサイズ 105 float bhe; 106 float bsp; 107 108 BULLET(float _x, float _y) { 109 bx = _x;//弾の初期位置 110 by = _y;//弾の初期位置 111 bwi = 30;//弾のサイズ 112 bhe = 5; 113 bsp = 15; 114 } 115 116 void move() { 117 bx += bsp; 118 119 if (e1x<50||e1x<mouseX) { 120 bx = width; 121 by = height; 122 } 123 } 124 void display() { 125 stroke(50, 225, 100); 126 fill(255); 127 ellipse(bx, by, bwi, bhe); 128 } 129 //画面内かどうか 130 boolean isAlive() { 131 if (bx+bwi/2<0 || width<bx-bwi/2 || by+bhe/2<0 || height<by-bhe/2) { 132 return false; 133 } 134 return true; 135 } 136} 137 138class ENEMY1 { 139 float e1x, e1y; 140 float e1_xsp = 4; 141 ENEMY1(float ene1X, float ene1Y) { 142 e1x = ene1X; 143 e1y = ene1Y; 144 } 145 146 void move() { 147 148 e1x-=e1_xsp; 149 150 if (e1x<50) { 151 jotai=2; 152 } 153 if (e1x<50) { 154 e1x = ree1x; 155 e1y = ree1y; 156 } 157 } 158 void display() { 159 stroke(255, 0, 0); 160 line(e1x, 0, e1x, height); 161 noStroke(); 162 fill(255); 163 ellipse(e1x, e1y, 10, 25); 164 } 165}

###試したこと
ArrayList を用いて弾を作りました。
###補足情報(言語/FW/ツール等のバージョンなど)
Processing

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

{(弾のX座標)+(弾のwidth/2)<(敵のX座標)}

かつ{(弾のY座標)<(敵のY座標)+(敵のheight/2)}
かつ{(弾のY座標)>(敵のY座標)-(敵のheight/2)}

四角形同士の範囲の当たり判定をやりたかったのでしたら、上下左右の4つで判定しなければいけませんね。
これだと敵のX座標が大きい側では全て当たり判定が発生します。
自機より右が全部当たり判定になる、グラディウスのレーザーみたいな判定のイメージですね。

判定場所自体は

if (b.isAlive()) {

の中あたりが妥当に思えます。

ただ、四角形で正確に判定できるようになったとしても、弾が早すぎるとすり抜けてしまう問題が発生するのにも注意が必要です。
あるフレームとその次のフレーム間に弾が存在していたはずの全ての領域で判定しないといけないのですが、ややこしいです。がんばってください。

投稿2017/07/13 09:04

zohnam

総合スコア1441

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alastashim

2017/07/15 03:40

回答ありがとうございます。当たり判定の範囲を変えたことと敵の大きさをいじってみたら、きちんとできました。アドバイスありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問