前回からテーマがガラリと変わりますが、ビリヤードを作ってみたいと思います。
これまで使ってきませんでしたが、今回からFisicaという物理演算のライブラリを使用します。ライブラリとは、自分で定義したり記述したりするとなかなか面倒な色々な処理をひとまとめにしてくれている便利な道具です。Fisicaは、Processing用の物理演算ライブラリです。
Processingのメニューの “Sketch” → ”Import Library” → “Add Library” で、検索窓に “Fisica” と入力し、”Install” ボタンを押せばインストールされます。下の右図はインストール後の画像です(写真はProcessing 2 です)。

さて、サンプルプログラムを参考に9ボールを作ろうと、ステージとボールを作成してみました。
短いコードでも、ライブラリのおかげで衝突判定はきちんと動いてくれます。
まだ、手玉(白い玉)を動かすにはドラッグして他のボールの方向に動かさなければいけません。6個必要なポケット(穴)も、ファウルの処理等々未実装。これからやってみます。

今日のコードです。
1行目の import fisica.*; は fisica ライブラリをインポートするために必要です。
これまでにはなかった、FWorld や FWorld などは、Fisica の中で決められている言葉です。
setup() の中で、ball[0]~ball[9] の書き方がちょっとスマートではないのですが、場所や色が不規則なのでこのようにしてみた次第です。もっとしゅっとした書き方があるかも。色々調べます。
import fisica.*;
FWorld world;
FCircle[] ball;
void setup() {
size(400, 600);
Fisica.init(this);
ball = new FCircle[10];
world = new FWorld();
world.setEdges();
world.setGravity(0, 0);
for(int i = 0; i < 10; i++){
ball[i] = new FCircle(25);
ball[i].setRestitution(1.0);
world.add(ball[i]);
}
ball[0].setPosition( width/2, height/4 -20 );
ball[0].setFill(255, 0, 0);
ball[1].setPosition( width/2-5, height/4 -10 );
ball[1].setFill(0);
ball[2].setPosition( width/2+5, height/4 -10 );
ball[2].setFill(124, 83, 53);
ball[3].setPosition( width/2-10, height/4 );
ball[3].setFill(140, 0, 204);
ball[4].setPosition( width/2, height/4 );
ball[4].setFill(255, 255, 0);
ball[5].setPosition( width/2+10, height/4);
ball[5].setFill(32, 0, 152);
ball[6].setPosition( width/2-5, height/4 +10 );
ball[6].setFill(51, 96, 69);
ball[7].setPosition( width/2+5, height/4 +10 );
ball[7].setFill(255, 94, 25);
ball[8].setPosition( width/2, height/4 +20 );
ball[8].setFill(255, 255, 0);
ball[9].setPosition( width/2, height/4 *3 );
ball[9].setFill(255);
}
void draw() {
background(255);
world.step();
world.draw();
}