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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Processing

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

Q&A

解決済

2回答

5867閲覧

Processingの円の当たり判定

Alex_M

総合スコア32

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Processing

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

0グッド

0クリップ

投稿2019/07/04 05:01

編集2019/07/04 05:32

球の当たり判定

キャラクターをマウスで動かして、ランダムな位置に置かれた円に触れたら、また別のランダムな位置に円を置くというプログラムを作成したいです。
操作する円を bullet 、ランダムに描かれる円を target としました。

疑問点は、

・if以下に打ち込むべきコードがわからない
・sqrt()を用いると良い とヒントが与えられているのですが、調べても求める検索結果が出てこないのでわからない

です

processing

1float targetX = random(380); 2float targetY = random(380); 3int manX; 4int manY; 5int random; 6float r1; //bulletの半径 7float r2; //targetの半径 8float d = r1 + r2; 9 10void man() { 11 fill(0); 12 rect(manX, manY, 50, 30); 13 rect(manX - 10, manY + 20, 70, 10); 14 fill(255); 15 rect(manX, manY + 10, 50, 10); 16 rect(manX + 2, manY + 30, 46, 25); 17 circle(manX + 20, manY + 40, 15); 18 circle(manX + 45, manY + 40, 15); 19} 20 21void bullet() { 22 fill(#FF0000); 23 ellipse(manX, manY, 30, 30); 24} 25 26void target() { 27 fill(#DCE83D); 28 circle(targetX, targetY, 50); 29} 30 31void draw() { 32 background(255); 33 34 manX = 100 - 30; 35 manY = 100 - 30; 36 man(); 37 38 manX = mouseX; 39 manY = mouseY; 40 bullet(); 41 42 43 bullet(); 44 target(); 45 46 if ((targetX - mouseX) * (targetX - mouseX) + (targetY - mouseY) * (targetY - mouseY) <= (r1 + r2) * (r1 + r2)) { 47 48 } 49} 50 51void setup() { 52 size(480, 480); 53}

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

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

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

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

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

guest

回答2

0

ベストアンサー

まずr1とr2を初期化しましょう
この場合の初期化とは
**「変数に最初に具体的な値を代入する事」**です

例えばコードの1・2行目であなたは変数の宣言と初期化を同時にやっています

Processing

1float targetX = random(380); 2float targetY = random(380);

しかしr1とr2に関してはこれが行われている所がありません

またr1とr2は
bullet()とtarget()の関数定義の中で使用されていないので
このままだとr1とr2はそれぞれ半径としての役割を果たせません

上の2カ所を修正しさえすれば
あなたの書いた下の条件式は
書き直さなくてもあなたの要求を一応は満たします

Processing

1(targetX - mouseX) * (targetX - mouseX) + (targetY - mouseY) * (targetY - mouseY) <= (r1 + r2) * (r1 + r2)

※この式は「距離」を比較する式ではなく「距離の2乗」を比較する式になっています


おたずねのif文の中に何を書けばいいかですが
単純にターゲットの座標を初期化すればいいでしょう
この場合の初期化
**「今までの流れとは無関係に変数に新たな値を代入する事」**を意味します


ちなみに
様々なコーディングスタイルがあると思いますが
私は下のような感じでProcessingのコードを書いています

この形のほうが変数の初期化・変化など見通しが良くなると思うのですが......

Processing

1int num = 120;//プログラム実行中、変化しない値はここで宣言+初期化 2float a,b,c,d;//プログラム実行中、変化する値は宣言のみ 3 4//setup 関数 5//プログラムの開始に1回実行される 6void setup() 7{ 8 size(480, 480); 9 10 //プログラム実行中、変化する値はここで初期化 11 a = 10.0; 12 b = 30.0; 13 14 //初期化用の関数を使って初期化することもある 15 reset(); 16} 17 18//draw 関数 19//setupの実行後、自動的に繰り返し実行される 20void draw() 21{ 22 background(255); 23 24 c += 3.0; 25 d += 3.0; 26 func0(); 27 28 if(frameCount%num==0){ 29 func1(); 30 reset(); 31 } 32 33 if(frameCount%(num*5)==0){ 34 setup();//setup 関数を使用すると強制的に最初の状態にすることができる 35 } 36} 37 38 39 40//↓以降その他の関数定義 41void reset() 42{ 43 c = 20.0; 44 d = 40.0; 45} 46 47void func0() 48{ 49 ellipse(c,d,a,a); 50 ellipse(c+2*a,d+2*a,b,b); 51} 52 53void func1() 54{ 55 a += 10.0; 56 b += 30.0; 57}

投稿2019/07/05 03:42

e-cube

総合スコア284

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

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

thkana

2019/07/05 13:50

私だったら、定数にはfinalを付けて変更不可にしちゃいます。あと、定数名は大文字(これはC系の文化かな?)。 final int NUM=12; //NUMの値は変更できない
guest

0

プログラミングってのは検索の結果を写すものじゃないんですけど...

・if以下に打ち込むべきコードがわからない

「別のランダムな位置に円を置く」でいいんでしょ? 細かく言うと「別の」がちょっと引っかかるけど(ランダムというのは今の状況と関係なく新しい場所が決まるわけだから、本当にランダムにすると今と同じ位置になる可能性はわずかながらある)、
とりあえずプログラムの最初に「ランダムな位置に円を置く」をやっているのだから、それに準じた(そのまま、じゃダメかもね)処理をすればいいんじゃないですか?

・sqrt()を用いると良い とヒントが与えられているのですが

それが絡みそうなのは(targetX - mouseX) * (targetX - mouseX) + (targetY - mouseY) * (targetY - mouseY) <= (r1 + r2) * (r1 + r2)のところぐらいですけれど、これにsqrtを絡ませたところで当たり判定の結果に影響はないので、意味がないです。むしろ計算が増えるだけ無駄と言えましょう。Processingでは2点間の距離を求めるdist()という関数があるので、これを使えというならまだ理解できます。用意されている関数をわざわざ自分で再現するのは訓練以外には全く利がありません。

投稿2019/07/04 13:04

thkana

総合スコア7639

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問