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

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

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

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

Q&A

2回答

3391閲覧

Processing 単純ゲーム制作中 あたり判定と分からない所を教えてください。

aiaiaiai

総合スコア4

Processing

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

0グッド

1クリップ

投稿2019/12/28 12:18

編集2019/12/28 14:09
コード //プレイヤーの設定 int playerx=400; //プレイヤーのx座標 int playery=500; //プレイヤーのy座標 int playerw=60; //プレイヤーの幅 int playerh=30; //プレイヤーの高さ int maruw=30; //物体の幅 int maruh=30; //物体の高さ int[]maruy=new int[20];//物体のy座標は0~19までの20個の変数 int[]maruColor= new int[20];//物体の色設定 //int[]maruSpeed=new int[20]; int[]marutaiki=new int[20]; float r; float g; float b; void setup(){ // 初期設定 size(800,600); //800×600サイズ noStroke(); // 線なし r=random(255); g=random(255); //ランダムに表示 b=random(255); for(int i=0; i<20; i++){ //繰り返す変数iは0~19まで変化する maruy[i]=40; //40を代入 maruColor[i]=int(random(2)); //maruSpeed[i]=int(random(2,6)); } } void draw(){ background(0); //背景の色は黒 playersettei(); marusettei(); maruMove(); } void playersettei(){ //プレイヤーの表示 if(mousePressed){ //マウスを押すとプレイヤーのバーが表れる rect(mouseX,playery,playerw,playerh,5); fill(r,g,b); r=random(255); //マウスを押すたびにバーの色がランダムに変わる g=random(255); b=random(255); } //if((playerx+playerw)>800){ // playerx =800; } void marusettei(){ //物体の設定 for(int i=0; i<20; i++){ //赤い球体の物体を20個並べる繰り返しの処理 if(maruColor[i]==0){ // fill(0,255,255); }else{ fill(255,0,255); } ellipse(i*40+20,maruy[i],maruw,maruh); } } void maruMove(){ for(int i=0; i<20; i++){ if(marutaiki[i]>0){ marutaiki[i]--; }else{ maruy[i]+=2; } maruy[i] +=2; if(maruy[i]>height){ maruy[i]=40; maruColor[i]=int(random(2)); //物体の色の配置がランダムで変わる marutaiki[i]=int(random(60,240)); } } } ```### 前提・実現したいこと ゲームを作っています。理想のゲームは、マウスを押すと四角いバーが出てきてそのバーは色が二色に変わります(今の場合、紫と水色に突然的に変わります、なぜそうなっているのかわからない・・)そしてボールが上からランダムに色の配置を変えながら落ちてきます。バーの色(例えば水色)の時に同じ色(水色)のボールに触れたらポイントゲットです。あたり判定の仕方も教えてください。とあるサイトのゲームを参考に自分で考えながら作っているのでよく解らないコードになっていると思いますが初心者なので詳しく教えてくださるとうれしいです。 ここに質問の内容を詳しく書いてください。 (例)PHP(CakePHP)で●●なシステムを作っています。 ■■な機能を実装中に以下のエラーメッセージが発生しました。 ### 発生している問題・エラーメッセージ バーの色が勝手にランダムになる。コードにrandomを入れてあるのは最初バーの色をランダムに設定したからです。でも球体を追加したら球体の色と同じになってしまいました。 for文の解説ももっと分かりやすいのが有ったら教えてください。

エラーメッセージ

### 該当のソースコード //プレイヤーの設定 int playerx=400; //プレイヤーのx座標 int playery=500; //プレイヤーのy座標 int playerw=60; //プレイヤーの幅 int playerh=30; //プレイヤーの高さ int maruw=30; //物体の幅 int maruh=30; //物体の高さ int[]maruy=new int[20];//物体のy座標は0~19までの20個の変数 int[]maruColor= new int[20];//物体の色設定 //int[]maruSpeed=new int[20]; int[]marutaiki=new int[20]; float r; float g; float b; void setup(){ // 初期設定 size(800,600); //800×600サイズ noStroke(); // 線なし r=random(255); g=random(255); //ランダムに表示 b=random(255); for(int i=0; i<20; i++){ //繰り返す変数iは0~19まで変化する maruy[i]=40; //40を代入 maruColor[i]=int(random(2)); //maruSpeed[i]=int(random(2,6)); } } void draw(){ background(0); //背景の色は黒 playersettei(); marusettei(); maruMove(); } void playersettei(){ //プレイヤーの表示 if(mousePressed){ //マウスを押すとプレイヤーのバーが表れる rect(mouseX,playery,playerw,playerh,5); fill(r,g,b); r=random(255); //マウスを押すたびにバーの色がランダムに変わる g=random(255); b=random(255); } //if((playerx+playerw)>800){ // playerx =800; } void marusettei(){ //物体の設定 for(int i=0; i<20; i++){ //赤い球体の物体を20個並べる繰り返しの処理 if(maruColor[i]==0){ // fill(0,255,255); }else{ fill(255,0,255); } ellipse(i*40+20,maruy[i],maruw,maruh); } } void maruMove(){ for(int i=0; i<20; i++){ if(marutaiki[i]>0){ marutaiki[i]--; }else{ maruy[i]+=2; } maruy[i] +=2; if(maruy[i]>height){ maruy[i]=40; maruColor[i]=int(random(2)); //物体の色の配置がランダムで変わる marutaiki[i]=int(random(60,240)); } } } ```ここに言語名を入力 ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

y_waiwai

2019/12/28 12:28

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
aiaiaiai

2019/12/28 12:38

修正依頼ありがとうございます。 宜しくお願い致します。
thkana

2019/12/28 13:33

あと、tagの[文字コード]って、なにか関係あるのかしら?
aiaiaiai

2019/12/28 13:41

すみません。どれのことでしょうか。。
thkana

2019/12/28 14:05

PCのブラウザであれば、ページの一番上のほうにxxに関する質問、としていくつか並んでいるうちに[文字コード]というのがあります(あなたが質問の時に指定したもののはず)が関係ないのでは。 もし変更するのであれば、質問の[編集]に入ると、質問の下にその質問に関連した用語がいくつか並んでいると思います。[文字コード]がこの質問に関係ないと思うのであれば、その横のバツ印をクリックすれば...多分消えると思うのですが(自分ではやったことない) スマホだったら...知りません。
aiaiaiai

2019/12/28 14:08

なるほど。わかりました。修正してみます。
thkana

2019/12/29 02:05

距離の計算はdist()関数がせっかく用意されているので使ってほしいな、なんて思ったり>TN8001さん
TN8001

2019/12/29 08:46

参考コードに対する突込みですね? 2点の距離は標準で用意されているんですね^^ 基本シェイプの当たり判定を簡単にできるライブラリがないのかなと思ってざっと探したんですがないんですかねぇ。 コードも書きかけたのですが、ゲームの仕様がわからなくて書けませんでした^^;
aiaiaiai

2019/12/29 13:27

TN8001さん もしよろしければコードを教えていただけないでしょうか。 このゲームは、画面下にあるバーが5秒ごとに水色、紫に変わります。そして上から20個物体(円)がランダムに配色を変えて落ちてきます。プレイヤーはバーの色と一緒の物体に触れることができたらポイントゲットです。 分かりずらいところがあれば言ってください。是非お願い致します。
guest

回答2

0

質問中のコードは、
```Processing
(`記号はわざと全角にしています。本来は半角)
ソースコード
```
の「ソースコード」のところを置き換える形で書き込んで下さい。```の後に言語名を書くと多少色付けとか変わるみたいなので、Processingと書いておきます。そうすると、以下のようにコードが(それっぽく)表示されるはずです。編集してみて下さい。

void playersettei() { //プレイヤーの表示 if (mousePressed) { //マウスを押すとプレイヤーのバーが表れる rect(mouseX, playery, playerw, playerh, 5); r=random(255); //マウスを押すたびにバーの色がランダムに変わる g=random(255); b=random(255); fill(r, g, b); } //if((playerx+playerw)>800){ // playerx =800; }

で、この関数は、

  • これまでの描画色で四角(プレイヤーのバー)を描き
  • r,g,bを乱数で発生して
  • その色を設定する

という処理をしています。現実としては、「これまでの描画色」とはなんでしょう。観察してみて下さい。右端のボールの色とバーが同じになるような変化をしているはずです。これが

バーの色が勝手にランダムになる。

の現象です。

もし、乱数で発生した色でバーを描画したいのなら、

Processing

1 r=random(255); //マウスを押すたびにバーの色がランダムに変わる 2 g=random(255); 3 b=random(255); 4 fill(r, g, b); 5 rect(mouseX, playery, playerw, playerh, 5);

の順にしなければいけないわけですが...

これでは多分期待しているのと違うことが起こるかと思います。やってみて、何が起こるか確かめて、なぜそうなるか考えてみて下さい。


当たり判定。

イメージ説明
図の通り。プレーヤーのバーに対して、物体(円)の中心が赤線のエリアの内側だったら「あたり」。物体一つ一つについてこれを調べればいいわけです。一つの式でど~んと、というのも出来ないとはいいませんが、赤線のエリアをいくつかに分割して調べた方が混乱しないで考えられると思います。(なお、バーの角の丸みは面倒になるので端折っています。こだわるなら自力でどうぞ)
例えば、

  • (playerx,playery-maruh/2)と(playerx+playerw,playery+plyaerh+maurh/2)を対角とする長方形
  • (playerx-maruw/2,playery)と(playerx+playerw+maruw/2,playery+playerh)を対角とする長方形
  • (playerx, playery)を中心とする半径maruh/2の円内
  • (playerx+playerw,playery)を中心とする半径maruh/2の円内
  • (playerx+playerw,playery+playerh)を中心とする半径maruh/2の円内
  • (playerx,playery+playerh)を中心とする半径maruh/2の円内

のいずれかにいずれかの物体の中心i*40+20,maruy[i]が入っていれば「あたり」なわけですね。

投稿2019/12/28 12:44

編集2019/12/28 14:26
thkana

総合スコア7639

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

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

aiaiaiai

2019/12/28 12:52

ありがとうございます 本来やりたかった感じになりました。 このあとのあたり判定ももし可能でしたら教えていただきたいです。
thkana

2019/12/28 12:56

ふむ、あれで良かったんですか。そうするとボールと同じ色を狙うってのはとてつもなく難しいことのような気がしますが...まぁいいか。 「あたり判定」ですね。 では、「あたる」とはどういうことか定義してみて下さい。
aiaiaiai

2019/12/28 13:09 編集

確かにバーの色がランダムになっていると変ですよね。そう思ってバーの色をランダムというか一定の時間(例えば5秒)ごとに水色か紫になればいいと思い、ifとif elseでコードをうってみたのですが、初心者のあまりうまくいかず紫になってしまいました。ここにヒントをいただけないですか??
aiaiaiai

2019/12/28 13:09

あたり判定はバーとボールが重なっている時を真としています。 そんな感じしかよく解りません・・・
thkana

2019/12/28 14:46

色切り替え いくつか方法はあるでしょうが、 playerColor変数を設置して、maruColorと同様の手順で水色または紫で描画することとして、 マウスボタンが「押された」(=いままで押されていなかった、いまは押されている)ときにはランダムで0または1をplayerColorに設定。 また、押されている時間をカウントする変数を設定し、 マウスボタンが押されていないときはカウントを0に マウスボタンが「押されている」間カウントを1ずつ増加する。draw()は1/frameRate秒毎に実行されるのだから、カウントがN*frameRateで割り切れるかどうかを調べればN秒毎という時間が測れるので、割り切れた時にはplayerColorを反転する。 とかでどうでしょう。
aiaiaiai

2019/12/29 08:28

thkanaさん ありがとうございます。 図まで書いていただいて恐縮です。 void hitCheck(){ int marux; for(int i=0; i<20; i++){ marux=i*40;20; if((playerx,playery-maruh/2)&&(playerx+playerw,playery+playerh+maruh/2) 最初のとこらへんなのですがこういった感じであってますでしょうか。 返信宜しくお願いします。
thkana

2019/12/29 08:40

> if((playerx,playery-maruh/2)&&playerx+playerw,playery+playerh+maruh/2) 聞く前に自分で試してみたら? デバッグ依頼はだめでしょ。(依頼にしても実行出来るものにして欲しい)
guest

0

  • グローバル変数(playerx等)をできるだけ減らし、変数の取り違え等のミスの可能性を下げました。
  • playerxやplayerw等関連する値はクラスにまとめ、クラスのオブジェクトして扱いました。
  • void playersettei()やvoid marusettei()等の関数を各クラスの関数にして、責務をはっきりさせました。
  • 組み込みの変数と名前が被らないように、定数(大文字)メンバ変数(_小文字)等命名に注意しました。
  • fill(0,255,255)等ぱっと見何色かわからないので、color型で分かりやすい名前を付けました。

Processing

1// 5秒おきにランダムに変わるという仕様ですが、急に変わってイラっとしたw のと、 2// 半分の丸が無駄になるのが気になって、マウスを押すたびに交互に代わるように勝手に変えました^^; 3// 5秒おきにする場合は RANDOM_CHANGE = true; に変えてください 4final boolean RANDOM_CHANGE = false; 5 6final color CYAN = color(0, 255, 255); // 水色 7final color MAGENTA = color(255, 0, 255); // 紫 8 9Player player; // 操作する四角 10Circle[] circles = new Circle[20]; // 降ってくる丸の配列 11int score; // 点数 12 13void setup() { 14 size(800, 600); 15 noStroke(); 16 17 // 四角の初期化 18 player = new Player(400, 500, 60, 30); // 初期位置と幅、高さ 19 20 // 丸たちの初期化 21 for (int i = 0; i < circles.length; i++) { 22 int x = i * 40 + 20; 23 int y = -int(random(height)); // 初期Y座標をランダムな画面外座標にすることによって、出現順をランダムにする 24 circles[i] = new Circle(x, y, 15); // 初期位置と半径 25 } 26} 27 28void draw() { 29 background(0); 30 31 player.update(); // 四角の位置をマウスX座標に更新 32 player.draw(); // 四角を描画 33 34 for (int i = 0; i < circles.length; i++) { 35 circles[i].update(); // 当該丸の位置を更新(落下) 36 if (player.isCollision(circles[i])) { // 四角と当該丸が接触していたら。。。 37 circles[i].dead(); // 丸を破壊扱いにする 38 39 if (player.getColor() == circles[i].getColor()) { // 四角と当該丸が同じ色だったら。。。 40 score += 10; // スコアをプラス 41 } else { // 四角と当該丸が違う色だったら。。。 42 score -= 100; // スコアをマイナス 43 } 44 } 45 46 circles[i].draw(); // 当該丸を描画(破壊状態だったら描画しないようにしてあるので、無条件に呼んでok) 47 } 48 49 // スコアを描画 50 fill(255); // 白 51 textSize(20); // フォントサイズ 52 text("SCORE", 10, 30); 53 text(score, 100, 30); 54 55 // 秒数を描画 56 int seconds = frameCount / 60; 57 text("TIME", 10, 60); 58 text(seconds, 100, 60); 59} 60 61// マウスを押した瞬間 62void mousePressed() { 63 if (!RANDOM_CHANGE) { // 5秒おきモードでなければ色を変える 64 player.changeColor(); 65 } 66} 67 68 69// 丸に関連する処理をまとめたクラス 70class Circle { 71 private int _x; // X座標 72 private int _y; // Y座標 73 private int _radius; // 半径 74 private int _speed; // 落下速度 75 private color _color; // 色 76 private boolean _isAlive; // 生死状態 77 78 // コンストラクタ X座標, Y座標, 半径 79 Circle(int cx, int cy, int radius) { 80 _x = cx; 81 _y = cy; 82 _radius = radius; 83 _speed = int(random(1, 4)); // 落下速度 ランダム 84 _isAlive = true; // 最初は生き 85 changeColor(); // 色 ランダム 86 } 87 88 // X座標の取得 89 int getX() { 90 return _x; 91 } 92 // Y座標の取得 93 int getY() { 94 return _y; 95 } 96 // 半径の取得 97 int getRadius() { 98 return _radius; 99 } 100 // 色の取得 101 color getColor() { 102 return _color; 103 } 104 // 生死状態の取得 105 boolean isAlive() { 106 return _isAlive; 107 } 108 109 // 破壊状態に変更 110 void dead() { 111 _isAlive = false; 112 } 113 114 // 描画 115 void draw() { 116 if (_isAlive) { // 生き状態時のみ描画 117 fill(_color); 118 ellipse(_x, _y, _radius * 2, _radius * 2); 119 } 120 } 121 122 // 位置の更新 123 void update() { 124 _y += _speed; 125 if (height < _y) { // 画面外に落ちたら状態をリセット 126 _y = -_radius * 2; 127 _isAlive = true; 128 _speed =int(random(1, 4)); 129 changeColor(); 130 } 131 } 132 133 // 色をランダムに変える 134 void changeColor() { 135 _color = int(random(2)) == 0 ? CYAN : MAGENTA; 136 } 137} 138 139 140// 四角に関連する処理をまとめたクラス 141class Player { 142 private int _x; // X座標 143 private int _y; // Y座標 144 private int _width; // 幅 145 private int _height; // 高さ 146 private color _color; // 色 147 148 // コンストラクタ X座標, Y座標, 幅, 高さ 149 Player(int x, int y, int w, int h) { 150 _x = x; 151 _y = y; 152 _width = w; 153 _height = h; 154 _color = CYAN; // 最初は水色 155 } 156 157 // 色の取得 158 color getColor() { 159 return _color; 160 } 161 162 // 描画 163 void draw() { 164 if (mousePressed) { // マウスが押されている時だけ描画 165 fill(_color); 166 rect(_x, _y, _width, _height, 5); 167 } 168 } 169 170 // 位置の更新 171 void update() { 172 _x = mouseX - (_width / 2); // マウス位置に中心を合わす 173 174 if (RANDOM_CHANGE) { // 5秒おきモードの場合色を変える 175 // frameCountはフレームごとに1増える デフォルトでは1秒60フレーム 176 // frameCount % 2 == 0なら交互に frameCount % 10 == 0なら10フレームに1回 177 // frameCount % (60 * 5) == 0なら300フレームに1回 = 5秒に1回 178 if (frameCount % (60 * 5) == 0) { 179 changeColor(); 180 } 181 } 182 } 183 184 // 色を変える 185 void changeColor() { 186 if (RANDOM_CHANGE) { // 5秒おきモードの場合。。。 187 _color = int(random(2)) == 0 ? CYAN : MAGENTA; // ランダムに変える 188 } else { 189 _color = _color == CYAN ? MAGENTA : CYAN; // 交互に変える 190 } 191 } 192 193 // 丸との当たり判定 194 boolean isCollision(Circle circle) { 195 if (!mousePressed) return false; // マウスが押されてなければ当たっていない 196 if (!circle.isAlive()) return false; // 丸が破壊されていれば当たっていない 197 198 // いろいろ計算^^; 199 boolean isCollision = circleRect(circle.getX(), circle.getY(), circle.getRadius(), _x, _y, _width, _height); 200 201 // 例えば丸を取るほど幅が広がる とか 202 //_width += isCollision ? 2 : 0; 203 return isCollision; 204 } 205 206 // 以下参考コードをちょい変更 207 // http://www.jeffreythompson.org/collision-detection/circle-rect.php 208 // CIRCLE/RECTANGLE 209 private boolean circleRect(int cx, int cy, int radius, int rx, int ry, int rw, int rh) { 210 211 // temporary variables to set edges for testing 212 int testX = cx; 213 int testY = cy; 214 215 // which edge is closest? 216 if (cx < rx) testX = rx; // test left edge 217 else if (cx > rx + rw) testX = rx + rw; // right edge 218 if (cy < ry) testY = ry; // top edge 219 else if (cy > ry + rh) testY = ry + rh; // bottom edge 220 221 // get distance from closest edges 222 // float distX = cx - testX; 223 // float distY = cy - testY; 224 // float distance = sqrt((distX * distX) + (distY * distY)); 225 float distance = dist(cx, cy, testX, testY); 226 227 // if the distance is less than the radius, collision! 228 if (distance <= radius) { 229 return true; 230 } 231 return false; 232 } 233}

クラスに分けると処理があっちこっちに飛んで、わかりにくく感じるかもしれません。
しかし機能を変更や追加をしようとしたときに、
「Playerのあの関数を見ればいいんだ」
「Playerに新たに関数を追加しよう」
等、どこを変えればいいのかが明瞭になり、作っていくうちにだんだんメリットを感じてくると思います。


Processing

1final boolean RANDOM_CHANGE = false; 2final color CYAN = color(0, 255, 255); 3final color MAGENTA = color(255, 0, 255); 4final int MARU_RADIUS = 15; 5final int MARU_COUNT = 20; 6 7int playerX = 400; 8int playerY = 500; 9int playerWidth = 60; 10int playerHeight = 30; 11color playerColor = CYAN; 12 13int[] marusX = new int[MARU_COUNT]; 14int[] marusY = new int[MARU_COUNT]; 15color[] marusColor = new color[MARU_COUNT]; 16int[] marusSpeed = new int[MARU_COUNT]; 17boolean[] marusAlive = new boolean[MARU_COUNT]; 18 19int score; 20 21void setup() { 22 size(800, 600); 23 noStroke(); 24 25 for (int i = 0; i < MARU_COUNT; i++) { 26 marusX[i] = i * 40 + 20; 27 marusY[i] = -int(random(height)); 28 29 if (int(random(2)) == 0) { 30 marusColor[i] = CYAN; 31 } else { 32 marusColor[i] = MAGENTA; 33 } 34 35 marusSpeed[i] = int(random(1, 4)); 36 marusAlive[i] = true; 37 } 38} 39 40void draw() { 41 background(0); 42 43 // player更新 44 playerX = mouseX - (playerWidth / 2); 45 if (RANDOM_CHANGE) { 46 if (frameCount % (60 * 5) == 0) { 47 if (int(random(2)) == 0) { 48 playerColor = CYAN; 49 } else { 50 playerColor = MAGENTA; 51 } 52 } 53 } 54 55 // player描画 56 if (mousePressed) { 57 fill(playerColor); 58 rect(playerX, playerY, playerWidth, playerHeight, 5); 59 } 60 61 62 for (int i = 0; i < MARU_COUNT; i++) { 63 // maru更新 64 marusY[i] += marusSpeed[i]; 65 if (height < marusY[i]) { 66 marusY[i] = -MARU_RADIUS * 2; 67 marusAlive[i] = true; 68 marusSpeed[i] =int(random(1, 4)); 69 70 if (int(random(2)) == 0) { 71 marusColor[i] = CYAN; 72 } else { 73 marusColor[i] = MAGENTA; 74 } 75 } 76 77 // 当たり判定 78 if (mousePressed) { 79 if (marusAlive[i]) { 80 if (circleRect(marusX[i], marusY[i], MARU_RADIUS, playerX, playerY, playerWidth, playerHeight)) { 81 marusAlive[i] = false; 82 83 if (playerColor == marusColor[i]) { 84 score += 10; 85 } else { 86 score -= 100; 87 } 88 } 89 } 90 } 91 92 // maru描画 93 if (marusAlive[i]) { 94 fill(marusColor[i]); 95 ellipse(marusX[i], marusY[i], MARU_RADIUS * 2, MARU_RADIUS * 2); 96 } 97 } 98 99 fill(255); 100 textSize(20); 101 text("SCORE", 10, 30); 102 text(score, 100, 30); 103 104 int seconds = frameCount / 60; 105 text("TIME", 10, 60); 106 text(seconds, 100, 60); 107} 108 109void mousePressed() { 110 if (!RANDOM_CHANGE) { 111 if (playerColor == CYAN) { 112 playerColor = MAGENTA; 113 } else { 114 playerColor = CYAN; 115 } 116 } 117} 118 119 120// 以下参考コードをちょい変更 121// http://www.jeffreythompson.org/collision-detection/circle-rect.php 122// CIRCLE/RECTANGLE 123private boolean circleRect(int cx, int cy, int radius, int rx, int ry, int rw, int rh) { 124 125 // temporary variables to set edges for testing 126 int testX = cx; 127 int testY = cy; 128 129 // which edge is closest? 130 if (cx < rx) testX = rx; // test left edge 131 else if (cx > rx + rw) testX = rx + rw; // right edge 132 if (cy < ry) testY = ry; // top edge 133 else if (cy > ry + rh) testY = ry + rh; // bottom edge 134 135 // get distance from closest edges 136 // float distX = cx - testX; 137 // float distY = cy - testY; 138 // float distance = sqrt((distX * distX) + (distY * distY)); 139 float distance = dist(cx, cy, testX, testY); 140 141 // if the distance is less than the radius, collision! 142 if (distance <= radius) { 143 return true; 144 } 145 return false; 146}

投稿2019/12/29 22:23

編集2019/12/30 12:54
TN8001

総合スコア9321

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

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

TN8001

2019/12/29 22:23

好き勝手に書いちゃったので、参考にされてもされなくても構いません。 もちろんコードについてわからない点があればお気軽にどうぞ^^ これが正解というのがないのが、面白いところでもあり難しいところでもありますね。 3倍のコード量になっちゃいましたが、ゲッター(getX()等)なんかはProcessingでは直接_xが見えてしまうので不要かもしれません。
thkana

2019/12/30 00:13

(雑感)JavaとかC/C++の質問であればガシガシとテクニックを繰り出して説明すればいいんですけど、ProcessingとかArduinoだとそもそもが「プログラミングの門外漢でもそれなりにコンピュータを動かせますよ~」と釣っているので、どこまで盛り込むかはいつも悩ましいところですよね。
aiaiaiai

2019/12/30 11:12

ありがとうございます。 実行して見たらまさに理想形になりました! しかし、まとめられてしまうといまいち理解できず苦しんでいます。。 お願いと云うかもし可能であればもっと分かりやすいというか初心者でもわかるコードで書いていただけると参考になります!
TN8001

2019/12/30 11:20

クラスを使わずintやint[]のままが良いという意味ですか? 比較のために同内容になるように書いてみます(が、あまり乗り気がしないのでちょっと時間かかるかもしれません^^;
aiaiaiai

2019/12/30 11:40

そうしていただきたいです。。すみません クラスなどはまだ使わずに1から理解したいので。 お願い致します
TN8001

2019/12/30 12:58

割と素直に関数化したものと、全部展開したもの 3パターン張ろうとしたら文字数オーバーでしたw とりあえず全部展開版を追記しましたが、わかりやすいかどうかがわかりません^^;
aiaiaiai

2019/12/30 13:03

ありがとうございます!! これからこちらを参考にさせていただいてコードを書いてみます。 ここで質問なのですがCYANとはどういう意味でしょうか。 調べてみたのですが答えにたどり着くことができませんでした。
TN8001

2019/12/30 13:08

色の三原色 シアン マゼンタ イエロー のシアンです
aiaiaiai

2019/12/30 13:13

なるほど。ありがとうございます!
aiaiaiai

2019/12/30 13:29

TN8001さん すみません。 // player更新 playerX = mouseX - (playerWidth / 2); if (RANDOM_CHANGE) { if (frameCount % (60 * 5) == 0) { if (int(random(2)) == 0) { playerColor = CYAN; } else { playerColor = MAGENTA; } } } この部分がどうしても理解できず先に進めません、frameCountがわからないです。%は余りを出すということで間違いないでしょうか??
TN8001

2019/12/30 13:49

frameCountはフレームごとに1増えます。デフォルトでは1秒60フレームです。 なので実行してから1秒後には60になっています。5秒後には300で、1分後には3600です。 %は余りで合っています。 frameCount % 300が0になるのはframeCountが300の倍数の時です(300,600,900,1200,...) つまり5秒に1回playerColorを変えるということです。 連続する数字を割った余りを使ってn個おきに何かする」というのはよく出てくるので、%が出てきたらそういうことかな?と思ってよいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問