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

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

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

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

Q&A

1回答

2530閲覧

processingのfisicaという物理シミュレーションライブラリでの特定の2つの接触判定方法がわからないです

okshun0126

総合スコア0

Processing

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

0グッド

0クリップ

投稿2020/09/06 15:04

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。
processingのfisicaという物理シミュレーションのライブラリでパチンコのようなものを作る予定です。
fisicaについては特に初心者なのでできるだけわかりやすくお願いしたいです。

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

エラーについてというよりは、ballとboxFloorの2つが接触したときに反応するようにしたいです。

エラーメッセージ

ball cannot be resolved to a variable

該当のソースコード

ソースコード

import fisica.;
FWorld world;
FBox cageRight, cageLeft, cageFloor, cageCeiling, Obs, ItemObs, boxRight, boxLeft, boxFloor;
FPoly triangle;
int flagBall=0;
int rx=0;
int flagC=0;
void setup()
{
size(1400, 600);
smooth();
Fisica.init(this);
world=new FWorld();
FBox cageRight=new FBox(30, 400);
FBox cageLeft=new FBox(30, 400);
FBox cageFloor=new FBox(440, 30);
FBox cageCeling=new FBox(460, 30);
FBox ItemObs=new FBox(10, 10);
FBox boxRight=new FBox(10, 40);
FBox boxLeft=new FBox(10, 40);
FBox boxFloor=new FBox(100, 10);
cageRight.setPosition(900, 300);
cageRight.setFill(0);
cageRight.setStatic(true);
world.add(cageRight);
cageLeft.setPosition(470, 300);
cageLeft.setStatic(true);
cageLeft.setFill(0);
world.add(cageLeft);
cageFloor.setPosition(680, 485);
cageFloor.setStatic(true);
cageFloor.setFill(0);
cageFloor.setRestitution(-20);
world.add(cageFloor);
cageCeling.setPosition(685, 85);
cageCeling.setStatic(true);
cageCeling.setFill(0);
world.add(cageCeling);
boxRight.setPosition(630, 450);
boxRight.setFill(0);
boxRight.setStatic(true);
world.add(boxRight);
boxLeft.setPosition(525, 450);
boxLeft.setFill(0);
boxLeft.setStatic(true);
world.add(boxLeft);
boxFloor.setPosition(575, 470);
boxFloor.setStatic(true);
boxFloor.setName("bf");
boxFloor.setFill(0);
world.add(boxFloor);
world.add(ItemObs);
}
void draw()
{
Fisica();
triangle=new FPoly();
triangle.vertex(30, 30);
triangle.vertex(-30, 30);
triangle.vertex(0, -30);
triangle.setStatic(true);
triangle.setFill(255, 0, 0);
triangle.setNoStroke();
triangle.setPosition(820, 150);
triangle.setRotation(radians(3
rx));
world.add(triangle);
world.draw();
world.step();
}
void Fisica() {
rx++;
fill(255);
noStroke();
rect(240, 40, 920, 518);
fill(255, 0, 0);
rect(1000, 285, 50, 30);
FCircle ball=new FCircle(20);
ball.setVelocity(-200, -1100);
ball.setFill(0);
ball.setRestitution(1);
ball.setStatic(false);
ball.setPosition(850, 450);
ball.setName("ba");
if (flagBall==1)
{
world.add(ball);
}
flagBall=0;
world.remove(triangle);
}
void mousePressed()
{
flagBall=1;
}
void contactStarted(FContact c)
{
if (c.contains(ball, boxFloor))//ballがエラーです
{
ball.setFill(255, 0, 0);//ballがエラーです
}
}

試したこと

ここに問題に対して試したことを記載してください。
色々調べたのですが3つ以上の中から特定の2つが接触したときに反応するようにする方法がわからずあまり試すことができなかったです。

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

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

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

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

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

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

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

guest

回答1

0

まずvoid draw(){ }は1秒に60回呼ばれる処理なので、その中でworld.add()はやめましょう。大変なことになります。

Processing

1FBox boxFloor; // 1 2void setup() 3{ 4 FBox boxFloor = new FBox(100, 10); // 2 5}

こういう状態になっていた時に1のboxFloorと2のboxFloorは別の変数です。
Processingはちょっと特殊(見えないクラスの中に書いている形)なのですが、1はクラスのメンバ変数で2はsetupの中だけのローカル変数です。

ballがエラーです

関数のローカル変数は別の関数からは使えません。
ボールが複数あってもいいように、名前でチェックするのがよいかと思います。

rxframeCountがそういう用途の組み込み変数です。

Processing

1import fisica.*; 2 3FWorld world; 4FBox boxFloor; 5FPoly triangle; 6 7int score = 0; 8 9void setup() { 10 size(1400, 600); 11 smooth(); 12 noStroke(); 13 14 Fisica.init(this); 15 world = new FWorld(); 16 17 FBox cageRight = new FBox(30, 400); 18 cageRight.setPosition(900, 300); 19 cageRight.setFill(0); 20 cageRight.setStatic(true); 21 world.add(cageRight); 22 23 FBox cageLeft = new FBox(30, 400); 24 cageLeft.setPosition(470, 300); 25 cageLeft.setStatic(true); 26 cageLeft.setFill(0); 27 world.add(cageLeft); 28 29 FBox cageFloor = new FBox(440, 30); 30 cageFloor.setPosition(680, 485); 31 cageFloor.setStatic(true); 32 cageFloor.setFill(0); 33 cageFloor.setRestitution(-20); 34 world.add(cageFloor); 35 36 FBox cageCeling = new FBox(460, 30); 37 cageCeling.setPosition(685, 85); 38 cageCeling.setStatic(true); 39 cageCeling.setFill(0); 40 world.add(cageCeling); 41 42 //FBox ItemObs = new FBox(10, 10); 43 //world.add(ItemObs); 44 45 FBox boxRight = new FBox(10, 40); 46 boxRight.setPosition(630, 450); 47 boxRight.setFill(0); 48 boxRight.setStatic(true); 49 world.add(boxRight); 50 51 FBox boxLeft = new FBox(10, 40); 52 boxLeft.setPosition(525, 450); 53 boxLeft.setFill(0); 54 boxLeft.setStatic(true); 55 world.add(boxLeft); 56 57 boxFloor = new FBox(100, 10); // FBox boxFloor=とするとこの関数内だけの変数になってしまうので注意 58 boxFloor.setPosition(575, 470); 59 boxFloor.setStatic(true); 60 boxFloor.setName("bf"); 61 boxFloor.setFill(0); 62 world.add(boxFloor); 63 64 triangle = new FPoly(); 65 triangle.vertex(30, 30); 66 triangle.vertex(-30, 30); 67 triangle.vertex(0, -30); 68 triangle.setStatic(true); 69 triangle.setFill(255, 0, 0); 70 triangle.setNoStroke(); 71 triangle.setPosition(820, 150); 72 world.add(triangle); 73} 74 75void draw() { 76 fill(255); 77 rect(240, 40, 920, 518); 78 79 fill(255, 0, 0); 80 rect(1000, 285, 50, 30); 81 82 text(score, 1000, 185); 83 84 triangle.setRotation(radians(3 * frameCount)); 85 86 world.draw(); 87 world.step(); 88} 89 90void mousePressed() { 91 FCircle ball = new FCircle(20); 92 ball.setVelocity(-200, -1100); 93 ball.setFill(0); 94 ball.setRestitution(1); 95 // ball.setStatic(false); 96 ball.setPosition(850, 450); 97 ball.setName("ba"); 98 world.add(ball); 99} 100 101void contactStarted(FContact c) { 102 // boxFloorはメンバ変数なのでここでも使える 103 // ballはmousePressedのローカル変数なので使えない 104 // なので名前でチェック(ボールしか動くものがないなら if (c.getBody1() == boxFloor) だけでいいが) 105 // c.getBody2().getName().equals("ba") だと名前がないものにNullPointerExceptionがでます 106 // c.getBody2().getName() == "ba" でも大体動いちゃうのですがequalsを使うのが正しいです 107 if (c.getBody1() == boxFloor && "ba".equals(c.getBody2().getName())) { 108 world.remove(c.getBody2()); 109 score += 10; 110 } else if ("ba".equals(c.getBody1().getName()) && c.getBody2() == boxFloor) { 111 world.remove(c.getBody1()); 112 score += 10; 113 } 114}

投稿2020/09/06 20:42

TN8001

総合スコア9296

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問