数式で規則性のある動き

whitney.jpg
いきなり音が鳴るから注意!

円形が規則正しく動くことでいろんな表情をみせてくれる実験Flash。「おっ!おおっ!まじで!そーなん!ま、まさか!?」って感じ。プログラムでこういう驚きを持った動きが作れるのが数式アニメーションの楽しいところですね。

どういう規則性で動いているかの説明は、作者のこちらのページで解説されています。

一番大きい丸が3分で1周します。次に大きい丸がその1番大きい丸の倍のスピードで回ります。次に大きい丸は3倍のスピードで、次が4倍、5倍・・・と、そうやって全ての丸が回っています。
それぞれ丸のグラフィックは線上を通った時に単音を鳴らすように設定されています。

そんなシンプルな原理で動いているなんてクールやん!で、こういうのはパラメータをいじっていろんなバリエーションを見たくなるものですので作ってみました。

回転はこの記事を参考に、色相変化等は Sketchbook ライブラリを使わせてもらうことでサクッとできます。といっても音は実装していません。ドキュメントクラスに以下のようにコーディング:

package {
import flash.display.Sprite;
import flash.geom.Point;
import flash.utils.Timer;
import flash.events.TimerEvent;
import sketchbook.display.SpriteHelper;
import sketchbook.display.DynamicSprite;
import sketchbook.colors.ColorSB;

public class Circle extends Sprite {
//軌跡の半径
private var radius:Number = 250;
//一番大きいボールの半径
private var ballRadius:Number = 20;
//一番小さいボールの半径
private var ballMinRadius:Number = 3;
//ボールの数
private var ballNum:int = 50;
//1フレームあたりのボールの移動量(ラジアンで指定)
private var radian:Number = 0.005;
//以下、ほぼ固定でOK
private var centerX:Number = stage.stageWidth / 2;
private var centerY:Number = stage.stageHeight / 2;
private var balls:Array;
public function Circle() {
var ballDistance:Number = radius / ballNum;
var ballSizeMultiplier:Number = (ballRadius - ballMinRadius) / ballNum;
var colorMultiplier:Number = 360 / ballNum;
balls = new Array();
for (var i:int = 0; i < ballNum; i++) {
var ball:Sprite = new Sprite();
balls.push(ball);
var ballHelper:SpriteHelper = new SpriteHelper(ball);
//ボールの色設定
var col = new ColorSB(0xFF0000);
col.hue = (ballNum - i - 1) * colorMultiplier;
//ボールを描画
ballHelper.beginFill(col);
ballHelper.drawCircle(0, 0, ballMinRadius + i * ballSizeMultiplier);
ballHelper.endFill();
addChild(ball);
//ボールの初期位置
ball.x = centerX + ballDistance * (i +1);
ball.y = centerY;
}
var timer:Timer = new Timer(40);//25fpsをシミュレート
timer.addEventListener(TimerEvent.TIMER, loop);
timer.start();
//補助線の描画。適宜コメントアウトするなりしてください。
drawStartLine();
drawGuideCircle();
}

private function loop(event:TimerEvent):void {
//回転前のボールのx,y座標と回転軸のx,y座標、回転させたい角度から、回転後のx,y座標を求める
//http://www.trick7.com/blog/2006/06/27-230619.php
for (var i:int = 0; i < ballNum; i++) {
var myRadian:Number = radian * (ballNum - i);
var x:Number = balls[i].x - centerX;
var y:Number = balls[i].y - centerY;
var x1:Number = Math.cos(myRadian) * x - Math.sin(myRadian) * y;
var y1:Number = Math.cos(myRadian) * y + Math.sin(myRadian) * x;
balls[i].x = centerX + x1;
balls[i].y = centerY + y1;
}
}

/*
補助線作成用メソッド
*/
private function drawStartLine():void {
var line:Sprite = new Sprite();
line.graphics.lineStyle(2, 0xFFFFFF);
line.graphics.moveTo(centerX, centerY);
line.graphics.lineTo(centerX + radius, centerY);
addChild(line);
}
private function drawGuideCircle():void {
var guideCircle:Sprite = new Sprite();
guideCircle.graphics.lineStyle(2, 0xFFFFFF);
guideCircle.graphics.drawCircle(centerX, centerY, radius);
addChild(guideCircle);
}
}
}

一応それらしく動いたのでパラメーターいじって遊んでいたら丸の位置がだんだんずれていくバグ発見。原因は僕の上のコードの loop 関数内。このアプローチは丸一つ一つに対して、直前の座標位置を元に次の場所への移動させています。が、小数点以下の座標がまるめられるのでじわじわずれていくのです。たぶん。

直そうと思ってヒントを求めて本家ページ見たら、右下らへんにAS2だけどソースが載ってました。あったんかいな。そこで萎えて放置。ダメな僕。

「あとでやる」

Comments:3

ANN 08-04-15 (火) 20:05

こんにちは。いつもblog拝見して勉強させていただいてます。
円の動き、面白いですね。円がぐるぐる回ってるだけなのに、中心から3本、4本、5本と放射状にラインが出たり消えたり見える目の錯覚というか、そういうのも含めて面白いです。

ところで、ドキュメントクラスの親にSpriteを指定していますが、それはsketchbookを使うからですか?
Spriteをextendsすると、キャンバスというかシーンに、スクリプトを置けなくなりますよね?

もう、(オーサリング環境で)シーンにスクリプトを置く、というのは時代遅れなのでしょうか。アニメーションが絡む場合は便利と思いますが…

試しに、上記スクリプトのextends Spriteをextends MovieClipにしても動きました。Spriteにする理由は何でしょうか?
stageにアクセスするためにはDisplayObjectが必要ってことかなぁと思いますが、MovieClipでもいいような。

突然の質問で大変失礼ですが、よろしければご教示ください。

tera 08-04-16 (水) 1:06

>ANN様
はじめまして。こんばんは。
extends Sprite にした理由は sketchbook とは関係ないです。

■Sprite と MovieClip の違い
ドキュメントクラスにするためにはどちらかを継承してないといけないのはご存知だと思います。
そして仰るとおり extends MovieClip でも動きます。
違いは「MovieClip からタイムライン機能を省いたのが Sprite」という点でして、機能を省いている分、軽量(メモリ消費も少ない)でパフォーマンスがいいことになります。今回.flaの_rootフレームでは一切タイムラインは使っていないので、Sprite にしたということになります。
※MovieClip.as を見ればわかるのですが、MovieClip クラス自体が extends Sprite なクラスでして、Sprite をベースに、プラスして gotoAndPlay メソッドとか currentFrame プロパティを追加しているのです。今回はその機能が不要なので Sprite なのですー。

シーンにスクリプトを書かないのは、僕的には FlashDevelop で .as ファイルをコーディングする方が楽だからというのが主たる理由ですが、オブジェクト指向プログラミングができる人ほど、機能ごとにクラスを作っておいて資産として再利用できるとか世間では言われてますね。
アニメーションが絡む場合でも、そのアニメーションクリップをクラス化して、他のクラスから new するなどするので、クラスベースでもそれほど不便を感じなくてすむかと思います。
使い慣れたFlash IDEで開発できるメリットと全スクリプトを.flaのあちこちに書いてややこしくなるデメリットを天秤にかけて、僕はクラスベースに移行しかけているところです。

という感じですー。

ANN 08-04-16 (水) 19:35

こんにちは。

なるほど~!extendsのSpriteとMovieClipの違い、納得しました。このあたりはAS2.0とまったく違っているけど、わかりやすい資料がなくて、ずいぶんモヤモヤしてたので、大変助かりました。ありがとうございます。

やっぱその場しのぎでシーンにポコポコとスクリプトを置いていったらダメっすね。。

FlashDevelop+FlashCS3でパブリッシュのスクリーンキャストも拝見させてもらいました。これは便利ですね!

僕も導入してみます!

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://www.trick7.com/blog/2008/04/15-011651.php/trackback
Listed below are links to weblogs that reference
数式で規則性のある動き from trick7
AS3習得本
AS3の全容を学習できる本。この中でどれか1冊自分に合ったものを。
Adobe Flash CS4 詳細!ActionScript3.0入門ノート ActionScript3.0 プロフェッショナルガイド 初めてのActionScript 3.0 Flashユーザーのためのステップアップガイド 詳説 ActionScript 3.0 Actionscript 3.0 Cookbook
AS3発展本
ASでアニメーションさせる面白さを知るための本。
Flash Math & Physics Design:ActionScript 3.0による数学・物理学表現[入門編] ActionScript 3.0 アニメーション AdvancED ActionScript 3.0 Animation (Advanced)
AS2
"Flash"ではなく"ActionScript2.0"学習のための良著。他にもいろいろ読んだけど、この4冊を読んだ後、自分が成長できた感じがしました。
FLASH ActionScript 2.0入門完全ガイド+実践サンプル集 [CD-ROM付] Essential Actionscript 2.0 Flash 8 Essentials Foundation Actionscript Animation: Making Things Move (Foundation)

あわせて読みたいブログパーツ

相互リンク

hi-posiさん
携帯Flashといえばhi-posiの岡田昇三さん。FlashLiteの有益な記事もたくさん書かれていていつもお世話になってます。ついにご挨拶させていただきました。面白すぎる人でしたw。

Return to page top