Home > action script > 数式で規則性のある動き

数式で規則性のある動き

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だけどソースが載ってました。あったんかいな。そこで萎えて放置。ダメな僕。

「あとでやる」

Comment:3

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

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

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

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

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

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

tera 2008-04-16 (水) 01: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 2008-04-16 (水) 19:35

こんにちは。

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

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

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

僕も導入してみます!

Comment Form

コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。

Remember personal info

Trackback:0

TrackBack URL for this entry
http://www.trick7.com/blog/mt-tb.cgi/724
Listed below are links to weblogs that reference
数式で規則性のある動き from trick7.com blog

Home > action script > 数式で規則性のある動き

持っている Flash & ActionScript 関連本の中から、自分的おすすめの読む順番をご紹介。各書籍のレビューは books カテゴリからご覧頂けます。
この順番でどう?(AS3.0)
  • Adobe Flash CS3 詳細! ActionScript 3.0 入門ノート (DVD付)
    Adobe Flash CS3 詳細! ActionScript 3.0 入門ノート (DVD付)

    デザイン方面からFlashデビューして、そのままAS2.0を使うようになった人が、難しいと評判のAS3デビューする時の最初の1冊として、とにかく目を通しておくと良いかと思います。プログラミング経験の少ない方でも、サンプルをじっくり読めば、ゼロからのAS3デビュー可。
  • ActionScript 3.0 アニメーション
    ActionScript 3.0 アニメーション
    洋書「Making Things Move!」の日本語訳本。ActionScript3.0で数学的アニメーションを作ることがメインテーマなのですが、前半部分でAS3.0の基礎を分かり易く解説されています。後半の重力, IK, 3D表現等のアニメーション解説も楽しい。僕はこれのAS2.0洋書版を読んでFlashの面白さに気付きました。
  • Essential ActionScript 3.0 (Essential)
    Essential ActionScript 3.0 (Essential)

    900ページ以上ある相当分厚い本。基礎からOOPまでを解説。ほぼ網羅しているので、これを抑えておけばAS3博士になれそう。
  • Actionscript 3.0 Cookbook
    Actionscript 3.0 Cookbook

    ActionScript3.0のリファレンス本。問題とその解決法が1ページぐらいで細分化されているので空いた時間にちょっとずつ読み進められる。WebでAS3のソースを見て勉強する時の字引としても使う。ただ、時期的に初期の本なので、AS3自体が仕様変更してたりするので正誤表は必読。
  • Object-Oriented Actionscript 3.0
    Object-Oriented Actionscript 3.0

    7/23に発売されたFlash&OOP本。AS2.0版は持っているのだけど、オブジェクト指向の初歩的な解説から入って、後半は僕の理解を超える難度になっていきました。今度こそ理解できるか?
この順番でどう?(AS2.0)
  • Foundation Actionscript Animation: Making Things Move (Foundation)
    Foundation Actionscript Animation: Making Things Move (Foundation)

    スクリプトでアニメーションさせる方法を学べる。プログラムの知識というよりも数学や物理の知識が必要。バネの表現や3D表現など、汎用性の高いテクニックを身に付けられ、個人の表現力をレベルアップするのに最適。参考までに、僕が調べた英単語リスト。2007年4月に、AS3対応版も発売されました。
  • ゲーム開発のための数学・物理学入門 Beginning Math and Physics for Game Programmers
    ゲーム開発のための数学・物理学入門  Beginning Math and Physics for Game Programmers

    「Making Things Move!」の世界を突き詰めたい人用のステップアップのための本。行列や物理運動、2D/3D表現。Flashの本ではなく、じっくり読むタイプの本なので、あとまわしにしてもいいかも。
  • Flash 8 Essentials
    Flash 8 Essentials

    Flash8の新機能を紹介。全10章が独立した構成で、興味のある部分から読めます。フィルタやビットマップ、ビデオの使い方とかを、基礎から順を追って理解していけるので、ゼロからスクリプティングできるようになる。僕はビットマップ関連の作業の際のリファレンスとして常用しています。
  • .fla―Idea of Flash Creation
    .fla―Idea of Flash Creation

    上の本でFlash8の基本を身に付けて、それをどう面白い表現に落とし込むかを学べます。深津さんの、試行錯誤・実験しやすいスクリプティング、クラス設計に凄さを感じました。YouTubeやFlickrのAPI、PHPとの連携記事も。
  • FLASH ActionScript 2.0入門完全ガイド+実践サンプル集 [CD-ROM付]
    FLASH ActionScript 2.0入門完全ガイド+実践サンプル集 [CD-ROM付]

    ここまでで表現力が付き、テンションが上がるので、その勢いで難解なオブジェクト指向に挑戦。プログラム経験のない人がいきなり英語のOOP本を読むのは厳しい。この本で継承とかインターフェースとかポリモーフィズムとかの用語を理解しておくといいかも。
  • オブジェクト指向でなぜつくるのか―知っておきたいプログラミング、UML、設計の基礎知識―
    オブジェクト指向でなぜつくるのか―知っておきたいプログラミング、UML、設計の基礎知識―

    Flashの本ではありませんが、OOPの概念を気軽に読めるボリュームで解説してくれます。英語と日本語のOOP用語の対応を図るためにも「Object-oriented Actionscript for Flash 8」と併読するのがおすすめ。なんとなく読んでおくだけでも結構違うのでは。
  • Object-oriented Actionscript for Flash 8
    Object-oriented Actionscript for Flash 8

    前半はOOPの利便性や基本の紹介。デザインパターンやMVCの理解。13章からグッと難しくなって大変。Flash8対応。
  • Essential Actionscript 2.0
    Essential Actionscript 2.0

    上の本よりもさらにOOPプログラマ向け。同じOOP本ということでやや重複しており、こちらはMX2004時代の本なので見送ってもいいかも。分かりやすい英語で良著。この本のAS3版が出たら間違いなく買い。

Page Top