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

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

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

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

Q&A

解決済

1回答

1526閲覧

【Processing】当たり判定が二重で表示される

Gchan

総合スコア19

Processing

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

0グッド

0クリップ

投稿2020/07/09 01:57

現在、Processingで避けゲーを作っていて
マウスカーソルが
●に当たるとダメージ
■に当たるとスコアアップ
▲に当たるとライフ回復
という仕様なのですが
今書いているプログラムですと、各種ドロップにマウスカーソルが当たったときに判定が二重になることが多く発生してしまいます

例えば50ダメージを受ける設定なのに一度に100ダメージ受けてしまうなど
何か御意見頂けると助かります

Processing

1DropBall[] db = new DropBall[50]; 2PointRect[] pr = new PointRect[15]; 3LifeTriangle[] lt = new LifeTriangle[15]; 4float[] posX = new float[50]; 5float[] posY = new float[50]; 6float[] posRX = new float[15]; 7float[] posRY = new float[15]; 8float[] posSX = new float[15]; 9float[] posSY = new float[15]; 10int i = 0,j = 0,k = 0; 11float time = 0,elapsedTime = 0,timeStamp =0,clearTime = 0; 12int state = 0,score = 0,life = 100,point_count = 0; 13PFont font; 14PImage img; 15 16//ゲームの初期化、ゲームセット 17void gameInit(){ 18 for (i = 0; i < 50; i++) { 19 db[i] = new DropBall(random(0, 600), 0, random(1,5)); 20 } 21 for (j = 0; j < 15; j++) { 22 pr[j] = new PointRect(random(0, 600), 0, random(1, 5)); 23 } 24 for (k = 0; k < 15; k++) { 25 lt[k] = new LifeTriangle(random(0, 600), 0, random(1, 5)); 26 } 27} 28 29void setup() { 30 size (800, 600); 31 frameRate(60); 32 textAlign(CENTER, CENTER); 33 font = createFont("HGSゴシックE" , 50); 34 textFont(font); 35 gameInit(); 36 state = 0; 37 score = 0; 38 img = loadImage("jet.png"); 39 life = 100; 40 point_count = 0; 41} 42 43 44void draw() { 45 background(0); 46 elapsedTime = float(millis()) / 1000; 47 time = elapsedTime - timeStamp; 48 fill(255); 49 rect(610, 0, 800, 600); 50 switch (state) { 51 case 0: 52 text("push Enter", 300, 300); 53 break; 54 case 1: 55 //noCursor(); //カーソル表示した方が良いかもしれない 56 image(img,mouseX - 16, mouseY - 16); 57 fill(0); 58 text(time, 700, 100); 59 text(life, 700, 300); 60 for (j = 0; j < 15; j++) { 61 pr[j].update(); 62 pr[j].display(); 63 pr[j].PlusPoint(); 64 } 65 for (k = 0; k < 15; k++) { 66 lt[k].update(); 67 lt[k].display(); 68 lt[k].LifePlus(); 69 } 70 for (i = 0; i < 50; i++) { 71 db[i].end(); 72 db[i].update(); 73 db[i].display(); 74 } 75 break; 76 77 case 2: 78 cursor(); 79 fill(0); 80 rect(0, 0, 610, 800); 81 fill(255); 82 score = int(clearTime * 50) + point_count * 50; 83 text("Game Over", 300, 250); 84 text("スコア:" + score, 300, 350); 85 text(point_count,300,400); 86 break; 87 88 } 89} 90 91 class DropBall { 92 PVector location; 93 PVector velocity; 94 int drop_hp; 95 DropBall(float x, float y, float dy) { 96 location = new PVector(x, y); 97 velocity = new PVector(0, dy); 98 drop_hp = 50; 99 } 100 void update() { 101 location.add(velocity); 102 if (location.y > height) { 103 location.y = 0; 104 } 105 if (drop_hp < 0 ){ 106 location.y = 0; 107 drop_hp = drop_hp + 50; 108 } 109 } 110 void display() { 111 noStroke(); 112 fill(255, 0, 0); 113 ellipse(location.x, location.y, 15, 15); 114 posX[i] = location.x; 115 posY[i] = location.y; 116 } 117 void end() { 118 if (mouseX + 15 > posX[i] && mouseX - 15 < posX[i] && mouseY + 15 > posY[i] && mouseY - 15 < posY[i]) { 119 drop_hp = drop_hp - 50; 120 life = life - 50; 121 if(life < 0){ 122 clearTime = time; 123 state = 2; 124 life = 100; 125 } 126 } 127 } 128 } 129 130 class PointRect { 131 PVector location; 132 PVector velocity; 133 int point_hp; 134 PointRect(float x, float y, float dy) { 135 location = new PVector(x, y); 136 velocity = new PVector(0, dy); 137 point_hp = 50; 138 } 139 void update() { 140 location.add(velocity); 141 if (location.y > height) { 142 location.y = 0; 143 } 144 if (point_hp < 0 ){ 145 location.y = 0; 146 point_hp = point_hp + 50; 147 } 148 } 149 void display() { 150 noStroke(); 151 fill(255, 255, 255); 152 rect(location.x, location.y, 15, 15); 153 posRX[j] = location.x; 154 posRY[j] = location.y; 155 } 156 void PlusPoint() { 157 if (mouseX + 15 > posRX[j] && mouseX - 15 < posRX[j] && mouseY + 15 > posRY[j] && mouseY - 15 < posRY[j]) { 158 point_hp = point_hp - 50; 159 point_count++; 160 } 161 } 162 } 163 164 class LifeTriangle { 165 PVector location; 166 PVector velocity; 167 int life_hp; 168 LifeTriangle(float x, float y, float dy) { 169 location = new PVector(x, y); 170 velocity = new PVector(0, dy); 171 life_hp = 50; 172 } 173 void update() { 174 location.add(velocity); 175 if (location.y > height) { 176 location.y = 0; 177 } 178 if (life_hp < 0 ){ 179 location.y = 0; 180 life_hp = life_hp + 50; 181 } 182 } 183 void display() { 184 noStroke(); 185 fill(255, 255, 0); 186 triangle(location.x, location.y, location.x + 7.5, location.y + 15, location.x - 7.5, location.y + 15); 187 posSX[k] = location.x; 188 posSY[k] = location.y; 189 } 190 void LifePlus() { 191 if (mouseX + 15 > posSX[k] && mouseX - 15 < posSX[k] && mouseY + 15 > posSY[k] && mouseY - 15 < posSY[k]) { 192 life_hp = life_hp - 50; 193 life += 50; 194 } 195 } 196 } 197 198 void keyPressed() { 199 if (key == ENTER && state == 0) { 200 timeStamp = elapsedTime; 201 time = elapsedTime - timeStamp; 202 point_count = 0; 203 state = 1; 204 } 205 if (key == ENTER && state == 2) { 206 state = 0; 207 gameInit(); 208 } 209 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

50ダメージを受ける設定なのに一度に100ダメージ受けてしまう

3つとも同じですが、代表して●で説明します。
カーソルに当たった時にdrop_hp = drop_hp - 50;としています。
update()の中の、

Processing

1if (drop_hp < 0 ) { 2 location.y = 0; 3 drop_hp = drop_hp + 50; 4}

で位置のリセットのつもりですが、drop_hpは0なのでifの中には入りません。
次のフレームでもまだカーソル付近にいるので、もう一度当たります。
-50になって初めてifに入り、位置がリセットされるのでlifeが2回減るのが頻発します。

if (drop_hp <= 0 )にすれば直ります。
そもそもupdate()で判断するまでもなく、end()location.y = 0;すればよいのではありませんか?
それならdrop_hpも不要になりますが、この後「弾を出して撃ち落とす」等の構想ですかね。


ijkがグローバル変数なのは、さすがによくないです。
end()if (mouseX + 15 > posX[i] 。。。で必要だからですが、よく見てください。
display()posX[i] = location.x;としています。

つまりif (mouseX + 15 > location.x。。。でいいのです。posX等は必要ないのです。
これでかなりのグローバル変数を減らせます。クラスを作った意味が出てきました。

timeelapsedTimescoreあたりもローカル変数にできるはずです。
いろいろなところに散らばった変数の再初期化も、gameInit()に集約すると見通しが良くなると思います。

投稿2020/07/09 21:28

編集2023/07/22 08:57
TN8001

総合スコア9862

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問