#05:火花の描画
このチャプターでは、火花に必要な残りの処理を記述します。
import processing.sound.*;
SoundFile soundFile;
BeatDetector beat;
/** 描画する花火の一覧 */
ArrayList<Firework> fireworks = new ArrayList<>();
void setup() {
size(1024, 768);
colorMode(HSB, 360, 100, 100);
background(color(234, 86, 39));
soundFile = new SoundFile(this, "music.wav");
beat = new BeatDetector(this);
beat.input(soundFile);
soundFile.loop();
}
void draw() {
background(color(234, 86, 39));
if (beat.isBeat()) {
background(color(360, 100, 100));
for (int i = 0; i < 5; i++) {
fireworks.add(new Firework());
}
}
ArrayList<Firework> liveFireworks = new ArrayList<>();
for (Firework firework : fireworks) {
firework.update();
firework.show();
if (firework.isAlive()) {
liveFireworks.add(firework);
}
}
fireworks = liveFireworks;
}
/**
* ひとつの火花をあらわすクラス
*/
class Spark {
/** 現在位置 */
PVector position;
/**
* コンストラクタ
*
* @param position 開始位置
*/
Spark(PVector position) {
this.position = position.copy();
}
/**
* 円を描画
*/
void show() {
}
/**
* 位置を更新
*/
void update() {
}
/**
* まだ生存しているかどうか
*/
boolean isAlive() {
return true;
}
}
/**
* ひとつの花火をあらわすクラス
*/
class Firework {
/** 管理対象の火花 */
ArrayList<Spark> sparks = new ArrayList<>();
/**
* コンストラクタ
*/
Firework() {
PVector position = new PVector(random(width), random(height));
for (int i = 0; i < 400; i++) {
sparks.add(new Spark(position));
}
}
/**
* すべての火花を描画
*/
void show() {
for (Spark s : sparks) {
s.show();
}
}
/**
* すべての火花の位置を更新
*/
void update() {
ArrayList<Spark> liveSparks = new ArrayList<>();
for (Spark s : sparks) {
s.update();
if (s.isAlive()) {
liveSparks.add(s);
}
}
sparks = liveSparks;
}
/**
* すべての火花が生存中かどうか
*/
boolean isAlive() {
return !sparks.isEmpty();
}
}
import processing.sound.*;
SoundFile soundFile;
BeatDetector beat;
/** 描画する花火の一覧 */
ArrayList<Firework> fireworks = new ArrayList<>();
void setup() {
size(1024, 768);
colorMode(HSB, 360, 100, 100);
background(color(234, 86, 39));
soundFile = new SoundFile(this, "music.wav");
beat = new BeatDetector(this);
beat.input(soundFile);
soundFile.loop();
}
void draw() {
background(color(234, 86, 39));
if (beat.isBeat()) {
for (int i = 0; i < 5; i++) {
fireworks.add(new Firework());
}
}
ArrayList<Firework> liveFireworks = new ArrayList<>();
for (Firework firework : fireworks) {
firework.update();
firework.show();
if (firework.isAlive()) {
liveFireworks.add(firework);
}
fireworks = liveFireworks;
}
}
/**
* ひとつの火花をあらわすクラス
*/
class Spark {
/** 現在位置 */
PVector position;
/** ランダムな方向をもつベクトル */
PVector move;
/** ライフポイント */
float life = random(50, 255);
/** 火花の色 */
color col = color(187, 92, random(50, 100));
/**
* コンストラクタ
*
* @param position 開始位置
*/
Spark(PVector position) {
this.position = position.copy();
move = PVector.random2D();
move.mult(random(5, 25));
}
/**
* 円を描画
*/
void show() {
fill(col, life);
noStroke();
circle(position.x, position.y, 3);
}
/**
* 位置を更新
*/
void update() {
position.add(move);
move.mult(0.95);
life -= random(0, 5);
}
/**
* まだ生存しているかどうか
*/
boolean isAlive() {
return 0 <= life;
}
}
/**
* ひとつの花火をあらわすクラス
*/
class Firework {
/** 管理対象の火花 */
ArrayList<Spark> sparks = new ArrayList<>();
/**
* コンストラクタ
*/
Firework() {
PVector position = new PVector(random(width), random(height));
for (int i = 0; i < 400; i++) {
sparks.add(new Spark(position));
}
}
/**
* すべての火花を描画
*/
void show() {
for (Spark s : sparks) {
s.show();
}
}
/**
* すべての火花の位置を更新
*/
void update() {
ArrayList<Spark> liveSparks = new ArrayList<>();
for (Spark s : sparks) {
s.update();
if (s.isAlive()) {
liveSparks.add(s);
}
}
sparks = liveSparks;
}
/**
* すべての火花が生存中かどうか
*/
boolean isAlive() {
return !sparks.isEmpty();
}
}
【Processingの各種関数】
Processing入門Java編03: レスポンス > draw()
https://paiza.jp/works/processing-java/primer/processing-java-primer-3/157000
Processing入門Java編03: レスポンス > setup()
https://paiza.jp/works/processing-java/primer/processing-java-primer-3/157001
【変数】
新・Java入門編6: 変数を学習しよう
https://paiza.jp/works/java/new-primer/java-new-primer-6
新・Java入門編21: 参照型とプリミティブ型について学習しよう > プリミティブ型
https://paiza.jp/works/java/new-primer/java-new-primer-21/89002
【算術演算子】
新・Java入門編5: 演算子を学習しよう > 算術演算子
https://paiza.jp/works/java/new-primer/java-new-primer-5/80400
【if文】
新・Java入門編12: 条件分岐を理解しよう
https://paiza.jp/works/java/new-primer/java-new-primer-12
【for文】
新・Java入門編11: 拡張for文を学習しよう
https://paiza.jp/works/java/new-primer/java-new-primer-11
新・Java入門編13: for文を学習しよう
https://paiza.jp/works/java/new-primer/java-new-primer-13
【クラス】
Processing入門Java編04: モーション > 自作関数の利用
https://paiza.jp/works/processing-java/primer/processing-java-primer-4/158000
Processing入門Java編04: モーション > 自作クラスの利用
https://paiza.jp/works/processing-java/primer/processing-java-primer-4/158001
新・Java入門編22: クラスについて学習しよう
https://paiza.jp/works/java/new-primer/java-new-primer-22
【Javaコレクションライブラリ】
新・Java入門編9: ArrayListを学習しよう
https://paiza.jp/works/java/new-primer/java-new-primer-9
【Soundライブラリ】
Processing入門Java編05: メディア > 音楽ファイルの利用
https://paiza.jp/works/processing-java/primer/processing-java-primer-5/159003
setup()
https://processing.org/reference/setup_.html
draw()
https://processing.org/reference/draw_.html
background()
https://processing.org/reference/background_.html
size()
https://processing.org/reference/size_.html
colorMode()
https://processing.org/reference/colorMode_.html
color()
https://processing.org/reference/color_.html
color
https://processing.org/reference/color_datatype.html
background()
https://processing.org/reference/background_.html
fill()
https://processing.org/reference/fill_.html
noStroke()
https://processing.org/reference/noStroke_.html
circle()
https://processing.org/reference/circle_.html
PVector
https://processing.org/reference/PVector.html
Soundライブラリ
https://processing.org/reference/libraries/sound/index.html
SoundFile
https://processing.org/reference/libraries/sound/SoundFile.html
BeatDetector
https://processing.org/reference/libraries/sound/BeatDetector.html