Flash版 Processing なライブラリ Frocessing を使ってみる
かっこいいアートっぽい描画ができるプログラム環境Processingを、それっぽくFlashのAS3で使えるようにしたライブラリが、Frocessingです。
gihyo.jpの記事(特集:FrocessingではじめるActionScriptドローイング|gihyo.jp … 技術評論社)のサンプルコードを改造しつつ、試しにいろいろ作ってみました。(ライブラリは ver 0.5.7 を使用してます)
サンプル1
白いくねくねした草がランダムに発生してのびていきます。画面クリックで描画をリセットします。
-
package
-
{
-
import flash.geom.Point;
-
import frocessing.display.*;
-
-
/**
-
* Frocessingのサンプル1
-
* くねくね線とランダムな円
-
* マウスクリックでリセット
-
*/
-
public class FrocessingSample01 extends F5MovieClip2DBmp
-
{
-
//描画サイズ
-
private var m_stage_width:Number = 500;
-
private var m_stage_height:Number = 500;
-
-
//図形描画の座標
-
private var m_points/*Point*/:Array; //座標を入れる
-
-
private var m_point_current_index:int = 0; //何番目の座標まで描画するか
-
-
public function FrocessingSample01(){
-
super();
-
}
-
-
//初期化 Stage が呼び込まれたときに自動的に呼ばれる
-
public function setup():void {
-
-
//描画範囲指定
-
size( m_stage_width, m_stage_height );
-
-
//背景色指定(引数の数によって色の指定方法が変わる)
-
background(0, 1); // color, alpha
-
-
//座標セット
-
setPoints();
-
}
-
-
-
//図形描画の座標をセット
-
private function setPoints():void {
-
-
m_points = new Array();
-
-
var len:int = m_stage_width - random(m_stage_height / 2);
-
var point_num:int = len / 10;
-
-
var step:int = len / point_num + random(5, 1);
-
var start_x:Number = Math.random() * m_stage_width; //y軸スタート位置はランダム
-
-
var yure:Number = random(6, 2); //くねくねサイズ
-
-
var pt:Point;
-
-
for (var i:int = 0; i <point_num ; i++) {
-
pt = new Point(start_x + random(yure, -yure), -step * i );
-
m_points.push(pt);
-
}
-
-
//始点と終点は同じ値を2つ入れる(始点と終点はコントロールポイントになってるっぽいので)
-
pt = m_points[0].clone();
-
m_points.unshift(pt);
-
-
pt = m_points[m_points.length - 1].clone();
-
m_points.push(pt);
-
}
-
-
-
//描画(フレーム毎に繰り返し)
-
public function draw():void {
-
-
//マウスが押された場合
-
if ( isMousePressed ) {
-
//背景を塗りなおす(描画のリセット)
-
background(0, 1);
-
}
-
-
//原点の移動
-
translate( 0, m_stage_height);
-
-
//-----くねくね線-----
-
-
//塗りをなしに
-
noFill();
-
-
//線色の指定(引数の数によって色の指定方法が変わる)
-
stroke(255, 255, 255, 0.5); //R, G, B, alpha
-
-
//線幅指定
-
strokeWeight(0.1);
-
-
var pt:Point;
-
-
//頂点を複数持つ図形の描画
-
beginShape();
-
for (var i:int = 0; i <m_point_current_index ; i++) {
-
pt = m_points[i];
-
curveVertex(pt.x, pt.y);
-
}
-
endShape();
-
-
-
//-----ランダムな円-----
-
-
//線をなしに
-
//noStroke();
-
-
strokeWeight(1);
-
-
//塗り設定
-
fill(255, 255, 255, 0.5);
-
-
if(m_point_current_index> 0){
-
pt = m_points[m_point_current_index - 1];
-
}
-
else {
-
pt = m_points[0];
-
}
-
//円の描画
-
var maru_size:Number = random(15, 1);
-
ellipse(pt.x + random(15, -15), pt.y + random(10, -10), maru_size, maru_size);
-
-
//描画する座標進める
-
m_point_current_index++;
-
-
//最後の座標まで行ったら座標再設定
-
if (m_point_current_index> m_points.length) {
-
m_point_current_index = 0;
-
setPoints();
-
}
-
}
-
}
-
}
サンプル2
画面クリック位置に種をおいて、カラフルなくねくねした草が伸びていきます。右上の□四角をクリックすると、描画をリセットします。
-
package
-
{
-
import flash.geom.Point;
-
import frocessing.display.*;
-
-
/**
-
* Frocessingのサンプル2
-
* くねくね線と直線の枝と枝先にランダムな円
-
* マウスクリック位置で生える
-
* 背景は透過にしてみた
-
*/
-
public class FrocessingSample02 extends F5MovieClip2DBmp
-
{
-
//描画サイズ
-
private var m_stage_width:Number = 500;
-
private var m_stage_height:Number = 500;
-
-
//図形描画の座標
-
private var m_points/*Point*/:Array; //座標を入れる
-
-
private var m_point_current_index:int = 0; //何番目の座標まで描画するか
-
-
//線と塗りの色
-
private var m_color:uint;
-
-
public function FrocessingSample02(){
-
super();
-
}
-
-
//初期化 Stage が呼び込まれたときに自動的に呼ばれる
-
public function setup():void {
-
-
//描画範囲指定
-
size( m_stage_width, m_stage_height );
-
-
//背景色指定(引数の数によって色の指定方法が変わる)
-
background(0, 0); // color, alpha
-
}
-
-
-
//図形描画の座標をセット
-
private function setPoints(base_x:Number, base_y:Number):void {
-
-
m_point_current_index = 0;
-
m_points = new Array();
-
-
var len:int = m_stage_width - random(m_stage_height / 1.5);
-
var point_num:int = len / 10;
-
-
var step:int = len / point_num + random(5, 1);
-
-
var yure:Number = random(5, 1); //くねくねサイズ
-
-
var pt:Point;
-
-
for (var i:int = 0; i <point_num ; i++) {
-
pt = new Point(random(yure, -yure) + base_x, -step * i + base_y);
-
m_points.push(pt);
-
}
-
-
//始点と終点は同じ値を2つ入れる(始点と終点はコントロールポイントになってるっぽいので)
-
pt = m_points[0].clone();
-
m_points.unshift(pt);
-
-
pt = m_points[m_points.length - 1].clone();
-
m_points.push(pt);
-
}
-
-
//ランダムな色を設定
-
private function setRandomColor():void {
-
-
var r:uint = random(200, 50);
-
var g:uint = random(200, 50);
-
var b:uint = random(200, 50);
-
-
m_color = this.color(r, g, b);
-
}
-
-
-
//描画(フレーム毎に繰り返し)
-
public function draw():void {
-
-
//マウスが押された場合
-
if ( isMousePressed ){
-
//色再設定
-
setRandomColor();
-
-
//座標再設定
-
setPoints(mouseX, mouseY - m_stage_height);
-
}
-
-
if (m_points != null) {
-
-
var i:int = 0; //汎用カウンタ
-
var maru_size:Number = 0; //円サイズ
-
-
//原点の移動
-
translate( 0, m_stage_height);
-
-
//-----くねくね線-----
-
-
//塗りをなしに
-
noFill();
-
-
//線色の指定(引数の数によって色の指定方法が変わる)
-
stroke(m_color, 0.5); //color, alpha
-
-
//線幅指定
-
strokeWeight(0.1);
-
-
var pt:Point;
-
-
//頂点を複数持つ図形の描画
-
beginShape();
-
for (i = 0; i <m_point_current_index ; i++) {
-
pt = m_points[i];
-
curveVertex(pt.x, pt.y);
-
}
-
endShape();
-
-
//枝
-
if(m_point_current_index> 0 && m_point_current_index <m_points.length - 1){
-
-
//枝の先の座標設定
-
if(m_point_current_index> 0){
-
pt = m_points[m_point_current_index - 1];
-
}
-
else {
-
pt = m_points[0];
-
}
-
var eda_inc_x:Number = random(30, 0);
-
if (random(1)> 0.5) {
-
eda_inc_x *= -1;
-
}
-
var eda_inc_y:Number = random( -10, -30);
-
-
var eda_x:Number = eda_inc_x + pt.x;
-
var eda_y:Number = eda_inc_y + pt.y;
-
-
//直線
-
line(pt.x, pt.y, eda_x, eda_y);
-
-
//枝の先のランダムな円いくつか
-
noStroke();
-
fill(m_color, 0.5);
-
-
for (i = 0; i <5;i++){
-
maru_size = random(10, 1);
-
ellipse(eda_x + random(10, -10), eda_y + random(10, -10), maru_size, maru_size);
-
}
-
}
-
-
//伸び始め位置に円を書く
-
if (m_point_current_index == 0) {
-
-
noStroke();
-
fill(m_color, 0.5);
-
-
maru_size = 0;
-
for (i = 1; i <5; i++){
-
maru_size += i * random(5, 2);
-
ellipse(m_points[1].x, m_points[1].y, maru_size, maru_size);
-
}
-
}
-
-
//描画する座標進める
-
m_point_current_index++;
-
-
//最後の座標まで行ったら、次の座標が設定されるまで描画止める
-
if (m_point_current_index> m_points.length) {
-
m_point_current_index = 0;
-
m_points = null;
-
}
-
-
}
-
}
-
-
//描画をリセットする
-
public function reset():void {
-
-
background(0, 0);
-
}
-
}
-
}
サンプル3
白い花がランダムに咲きます。咲いた後は、フィルターをかけてぼかしています。画面クリックで描画をリセットします。
-
package
-
{
-
import flash.geom.Point;
-
import flash.filters.BlurFilter;
-
-
import frocessing.display.*;
-
-
/**
-
* Frocessingのサンプル3
-
* ランダムな白い線の花にBlurフィルターをかける
-
*/
-
public class FrocessingSample03 extends F5MovieClip2DBmp
-
{
-
//描画サイズ
-
private var m_stage_width:Number = 500;
-
private var m_stage_height:Number = 500;
-
-
//花描画開始位置
-
private var m_flower_base:Point;
-
-
//花サイズ
-
private var m_flower_size:Number;
-
-
//花サイズ増分値
-
private var m_flower_step:Number;
-
-
//花の現在サイズ
-
private var m_flower_current_size:Number;
-
-
//花弁の数
-
private var m_kaben_num:int;
-
-
public function FrocessingSample03(){
-
super();
-
}
-
-
-
//初期化 Stage が呼び込まれたときに自動的に呼ばれる
-
public function setup():void {
-
-
//描画範囲指定
-
size( m_stage_width, m_stage_height );
-
-
//背景色指定(引数の数によって色の指定方法が変わる)
-
background(0, 1); // color, alpha
-
-
setFlower();
-
}
-
-
-
//描画する花の設定
-
public function setFlower():void {
-
-
m_flower_base = new Point(random(m_stage_width), random(m_stage_height));
-
m_flower_size = random(200, 20);
-
m_flower_step = m_flower_size / 10;
-
m_flower_current_size = m_flower_step;
-
-
m_kaben_num = random(8, 3);
-
}
-
-
-
//描画(フレーム毎に繰り返し)
-
public function draw():void {
-
-
translate( 0, 0);
-
-
//塗りをなしに
-
noFill();
-
-
//線色の指定(引数の数によって色の指定方法が変わる)
-
stroke(0xDDDDDD, 0.5); //color, alpha
-
-
//花を描く
-
-
var kaben_num:int = m_kaben_num;
-
var kaben_angle:Number = radians(360 / kaben_num);
-
var kaben_len:int = m_flower_current_size / 2;
-
-
var base_x:Number = m_flower_base.x;
-
var base_y:Number = m_flower_base.y;
-
-
beginShape();
-
curveVertex(base_x, base_y);
-
for (var i:int = 0; i <kaben_num ; i++) {
-
var x1:Number = cos(kaben_angle * i - kaben_angle / 3) * kaben_len / 2 + base_x;
-
var y1:Number = sin(kaben_angle * i - kaben_angle / 3) * kaben_len / 2 + base_y;
-
var x2:Number = cos(kaben_angle * i) * kaben_len + base_x;
-
var y2:Number = sin(kaben_angle * i) * kaben_len + base_y;
-
var x3:Number = cos(kaben_angle * i + kaben_angle / 3) * kaben_len / 2 + base_x;
-
var y3:Number = sin(kaben_angle * i + kaben_angle / 3) * kaben_len / 2 + base_y;
-
curveVertex(base_x, base_y);
-
curveVertex(x1, y1);
-
curveVertex(x2, y2);
-
curveVertex(x3, y3);
-
curveVertex(base_x, base_y);
-
}
-
curveVertex(base_x, base_y);
-
endShape();
-
-
//花のサイズ大きくする
-
m_flower_current_size += m_flower_step;
-
-
if (m_flower_current_size> m_flower_size) {
-
setFlower();
-
-
//フィルタかける
-
bitmapData.applyFilter(bitmapData, bitmapData.rect, new Point(0, 0), new BlurFilter(2, 2));
-
}
-
}
-
-
//描画のリセット
-
public function reset():void {
-
-
background(0, 1);
-
}
-
}
-
}
サンプル4
白い花の上にカラフルな草が伸びていきます。サンプル3の上にサンプル2 を重ねてるだけです。右上の□四角をクリックすると、描画をリセットします。
-
var smp3:FrocessingSample03 = new FrocessingSample03;
-
this.addChild(smp3);
-
-
var smp2:FrocessingSample02 = new FrocessingSample02;
-
this.addChild(smp2);
-
-
var button:Sprite = new Sprite;
-
button.graphics.beginFill(0xFFFFFF, 1);
-
button.graphics.drawRect(5, 5, 20, 20);
-
button.graphics.endFill();
-
-
button.alpha = 0.5;
-
button.buttonMode = true;
-
-
button.addEventListener(MouseEvent.ROLL_OVER,
-
function(e:Event):void {
-
button.alpha = 1;
-
});
-
-
button.addEventListener(MouseEvent.ROLL_OUT,
-
function(e:Event):void {
-
button.alpha = 0.7;
-
});
-
-
button.addEventListener(MouseEvent.MOUSE_UP,
-
function(e:Event):void {
-
smp2.reset();
-
smp3.reset();
-
});
-
-
this.addChild(button);
使い方の流れ
※F5MovieClipBitmapクラスしか使ってないので、他のクラスを継承した場合の作り方はわかりません…。
- F5MovieClipBitmapを継承したクラス作成。
- コンストラクタで親のコンストラクタ呼び出す。(明示的に呼び出さないといけないみたいです)
- setupメソッドを作って、その中に初期化処理を書く。
- drawメソッドを作って、その中に繰り返しの処理を書く。
描画関連のメソッドがAS3と全然違うので、ちょっと戸惑いました。(Processing使ったことないもので)
AS3の描画方法(graphicsクラスのメソッド)は忘れて使った方が混乱しなくていいかなと思います。
ちょこっとコードを書くだけで、結構かっこよさげな描画ができちゃいます。
特に曲線の描画がすごく楽です。
他のクラスも使っていろいろやってみたいです。






Video | Enjolt.com | Innovate for Success 2009-08-14 06:17:24 (ピンバック)
[...] then study the principles of memory management in ActionScript. Remember, values are not socks! Flash? Processing ?????? Frocessing ?????? - hokori.net 08/12/2009 [...]