※現在、「wonderfl build flash online」求人コンテンツ制作に関してのアンケートを実施中です!みなさまのお力添えを頂いて、続々とアンケート結果が集まっていますが、まだまだ募集しております。ご協力のほど、どうぞよろしくお願いいたします!

wonderfl運営事務局
→アンケートページ(※ログインしてからお答えいただけるようになっています。)

 notice: Flash editor updated! Join the development! Thanks to MiniBuilder


forked from : checkmate's colin challenge for professionals [diff(445)]

TALK
Was this inspired by Andre Michelle? :)
at 2010/01/13 06:59:18 by
FAVORITE BY
:
:
sound,3dsound builder =)
:
:
musicpv3dso cool
:
すごい!!
:
MusicTenorion3DPlayTenorion3D版
:
:
:
すげっ!
:
:
musicmusic maker, wow
:
3D cube music
:
みんなでplayできるとはスゲー
:
:
3Dmusicsoundwonderfl!
:
:
Music3DTenorionPlayTenorion3D版
:
3D Tenorion
:
papervision3d
:
:
やばい!これすげー!
:
:
PV3D SiON Union
:
:
:
3dmusic3Dテノリオン的な
:
tenori
:
:
:
Coool!!
:
すげー
:
:
:
Tenori-on
:
:
3d色がいい感じ
:
!!!
:
siontenorionにやにやがとまらない
:
CHECKMATEうぉぉ、かっけぇ!ビジュアルと作りだされている音楽がなんか合ってる
:
ごいす
:
:
:
相変わらずのかっこいいカメラワーク!&みんなで作る音楽
:
FORKED

[3D Tenorion] colin challenge for professionals forked from: [3D Tenorion] colin challenge for professionals [diff(1)]

  1. // forked from clockmaker's [3D Tenorion] colin challenge for professionals
  2. // forked from checkmate's colin challenge for professionals
  3. /**
  4.  * Create a Flash app using Union Platform,
  5.  * where you can collaborate with more than 4 people online.
  6.  *
  7.  * UnionRamen is an example app,
  8.  * you can write code based on this, or build from scratch.
  9.  *
  10.  * UnionRamen is a multiuser bowl of ramen built on the Union Platform.
  11.  * Press the 'n' key to add naruto to the bowl.
  12.  * For Union Platform documentation, see www.unionplatform.com.
  13.  * 
  14.  * @author   Colin Moock
  15.  * @date     July 2009
  16.  * @location Toronto, Canada
  17.  */
  18.  /**
  19.   * テノリオンのオンライン共有型で3Dで作ってみました。
  20.   * ネット上の誰かが変更すると、その変更が反映されます。
  21.   * 
  22.   * 音 powered by SiONライブラリ
  23.   * ネット共有 powered by Union プラットフォーム
  24.   * 3D powered by Papervision3D
  25.   */
  26.   
  27. package
  28. {
  29.     // Flash
  30.     import flash.display.*;
  31.     import flash.events.*;
  32.     import flash.filters.*;
  33.     import flash.geom.*;
  34.     import flash.text.*;
  35.     import flash.utils.*;
  36.     
  37.     // Union
  38.     import net.user1.reactor.*;
  39.     import net.user1.logger.Logger;
  40.     
  41.     // SiON
  42.     import org.si.sion.*;
  43.     import org.si.sion.events.*;
  44.     import org.si.sion.sequencer.SiMMLTrack;
  45.     import org.si.sion.utils.SiONPresetVoice;
  46.     
  47.     // PV3D
  48.     import org.papervision3d.core.proto.MaterialObject3D;
  49.     import org.papervision3d.lights.PointLight3D;
  50.     import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
  51.     import org.papervision3d.objects.primitives.*;
  52.     import org.papervision3d.view.BasicView;
  53.     import org.papervision3d.events.InteractiveScene3DEvent;
  54.     import org.papervision3d.materials.special.*;
  55.     import org.papervision3d.materials.*;
  56.     import org.papervision3d.objects.special.*;
  57.     
  58.     [SWF(width = "465", height = "465", backgroundColor = "0", frameRate = 30)]
  59.     
  60.     public class Main extends Sprite
  61.     {
  62.         static private const USER_COLOR:uint = Math.random() * 0xFF0000;
  63.         static private const MATRIX_NUM:int = 16;
  64.         static private const DEF_COLOR:int = 0x555555;
  65.         static private const ACTIVE_COLOR:int = 0xEEEEEE;
  66.         static private const OVER_COLOR:int = 0x999999;
  67.             
  68.         //-----------------------------------
  69.         // Union
  70.         //-----------------------------------
  71.         protected var reactor:Reactor;
  72.         protected var room:Room;
  73.         
  74.         
  75.         //-----------------------------------
  76.         // SiON
  77.         //-----------------------------------
  78.         
  79.         // driver
  80.         public var driver:SiONDriver = new SiONDriver();
  81.         
  82.         // preset voice
  83.         public var presetVoice:SiONPresetVoice = new SiONPresetVoice();
  84.         
  85.         // voices, notes and tracks
  86.         public var tracks:Vector.<SiMMLTrack> = new Vector.<SiMMLTrack>(16);
  87.         public var voices:Vector.<int> = Vector.<int>([ 0123,  4444,  4444,  4444]);
  88.         public var notes:Vector.<int>  = Vector.<int>([36,48,60,7243,48,55,6065,67,70,7277,79,82,84]);
  89.         
  90.         // beat counter
  91.         public var beatCounter:int;
  92.         
  93.         
  94.         //-----------------------------------
  95.         // PV3d
  96.         //-----------------------------------
  97.         private var world:BasicView = new BasicView(465465falsetrue);
  98.         private var light:PointLight3D = new PointLight3D();
  99.         private var cubes:Array = [];
  100.         private var logicMatrix:Array = [];
  101.         private var oldDispMatrix:Array = [];
  102.         private var dispMatrix:Array = [];
  103.         private var rollOverMatrix:Array = [];
  104.         
  105.         
  106.         /**
  107.          * コンストラクタ
  108.          */
  109.         public function Main()
  110.         {
  111.             stage.quality = StageQuality.MEDIUM;
  112.             
  113.             setupUnion();
  114.             setupPV3D();
  115.             setupSiON();
  116.             setupUI();
  117.             
  118.             Wonderfl.capture_delay( 10 );
  119.         }
  120.         
  121.         //-----------------------------------
  122.         // Union
  123.         //-----------------------------------
  124.         
  125.         private function setupUnion():void
  126.         {
  127.             // 接続用のReactorオブジェクトを作成
  128.             reactor = new Reactor();
  129.             // 接続完了したら readyListener() を起動
  130.             reactor.addEventListener(ReactorEvent.READY, readyListener);
  131.             // Unionに接続。
  132.             // "tryunion.com:9100"は自由に使えるUnionテスト用の公開サーバーです
  133.             reactor.connect("tryunion.com"9100);
  134.             reactor.getLog().setLevel(Logger.DEBUG);
  135.         }
  136.         
  137.         // 接続完了時に起動されるメソッド
  138.         protected function readyListener (e:ReactorEvent):void
  139.         {
  140.             reactor.getMessageManager().addMessageListener("GIVE_ME_LOG", sendLog);
  141.             reactor.getMessageManager().addMessageListener("THIS_IS_LOG", happyToReceiveLog);
  142.             
  143.             // このアプリ用のルームを作成
  144.             room = reactor.getRoomManager().createRoom("wonderfl.clockmaker.tenorion");
  145.             // 他ユーザーがこのルームに送信する"SOMEONE_CHANGE"メッセージを監視します
  146.             room.addMessageListener("SOMEONE_CHANGE", changeCellHandler);
  147.             room.addEventListener(RoomEvent.SYNCHRONIZE, onSynchronize);
  148.             // ルームに入室
  149.             room.join();
  150.         }
  151.         
  152.         // invoked when received map from someone
  153.         protected function happyToReceiveLog(from:IClient, data:String):void
  154.         {
  155.             trace(data);
  156.             var arr:Array = data.split(",");
  157.             
  158.             for (var i:int = 0; i < arr.length; i++) 
  159.             {
  160.                 var u:int = i % MATRIX_NUM;
  161.                 var v:int = Math.floor(i / MATRIX_NUM);
  162.                 
  163.                 logicMatrix[u][v] = arr[i];
  164.             }
  165.         }
  166.         
  167.         // send map to new comer
  168.         protected function sendLog(from:IClient):void
  169.         {
  170.             var data:Array = [];
  171.             for (var i:int = 0; i < logicMatrix.length; i++) 
  172.                 for (var j:int = 0; j < logicMatrix[i].length; j++) 
  173.                     data.push(logicMatrix[i][j]);
  174.             from.sendMessage("THIS_IS_LOG", data.join(","));
  175.         }
  176.         
  177.         private function onSynchronize(e:RoomEvent):void 
  178.         {
  179.             if ( room.getClients().length == 1 ) {
  180.                 // 何もしない
  181.             } else {
  182.                 var topClient:IClient = room.getClients()[0];
  183.                 topClient.sendMessage("GIVE_ME_LOG");
  184.             }
  185.         }
  186.         
  187.         protected function sendCellStatus (o:Object):void
  188.         {
  189.             // 未接続だったら何もしない
  190.             if (!reactor.isReady()) return;
  191.             room.sendMessage("SOMEONE_CHANGE"truenull, o.colorId, o.u, o.v);
  192.         }
  193.         // 他ユーザーの"ADD_NARUTO"メッセージ受信時に起動するメソッド
  194.         protected function changeCellHandler (fromClient:IClient, colorId:uint, u:int, v:int):void
  195.         {
  196.             logicMatrix[u][v] = colorId;
  197.         }
  198.         
  199.         
  200.         
  201.         //-----------------------------------
  202.         // SiON
  203.         //-----------------------------------
  204.         
  205.         private function setupSiON():void
  206.         {
  207.             driver.setVoice(0, presetVoice["valsound.percus1"]);  // bass drum
  208.             driver.setVoice(1, presetVoice["valsound.percus28"]); // snare drum
  209.             driver.setVoice(2, presetVoice["valsound.percus17"]); // close hihat
  210.             driver.setVoice(3, presetVoice["valsound.percus23"]); // open hihat
  211.             driver.setVoice(4, presetVoice["valsound.bass18"]);
  212.             
  213.             // listen click
  214.             driver.setTimerInterruption(1, _onTimerInterruption);
  215.             driver.setBeatCallbackInterval(1);
  216.             driver.addEventListener(SiONTrackEvent.BEAT, _onBeat);
  217.             driver.addEventListener(SiONEvent.STREAM_START, _onStreamStart);
  218.             // start streaming
  219.             driver.play();
  220.         }
  221.         
  222.         // _onStreamStart (SiONEvent.STREAM_START) is called back first of all after SiONDriver.play().
  223.         private function _onStreamStart(e:SiONEvent) : void
  224.         {
  225.             // create new controlable tracks and set voice
  226.             for (var i:int=0; i<MATRIX_NUM; i++) {
  227.                 tracks[i] = driver.sequencer.newControlableTrack();
  228.                 tracks[i].setChannelModuleType(60, voices[i]);
  229.                 tracks[i].velocity = 64;
  230.             }
  231.             beatCounter = 0;
  232.         }
  233.         
  234.         
  235.         // _onBeat (SiONTrackEvent.BEAT) is called back in each beat at the sound timing.
  236.         private function _onBeat(e:SiONTrackEvent) : void 
  237.         {
  238.             //matrixPad.beat(e.eventTriggerID & 15);
  239.             beat(e.eventTriggerID & MATRIX_NUM - 1);
  240.         }
  241.         
  242.         
  243.         // _onTimerInterruption (SiONDriver.setTimerInterruption) is called back in each beat at the buffering timing.
  244.         private function _onTimerInterruption() : void
  245.         {
  246.             var beatIndex:int = beatCounter & (MATRIX_NUM - 1);
  247.             for (var i:int = 0; i < MATRIX_NUM; i++)
  248.             {
  249.                 if (logicMatrix[beatIndex][i] != DEF_COLOR)
  250.                     tracks[i].keyOn(notes[i]);
  251.             }
  252.             
  253.             beatCounter++;
  254.         }
  255.         
  256.         
  257.         
  258.         //-----------------------------------
  259.         // PV3d
  260.         //-----------------------------------
  261.         
  262.         private function setupPV3D():void
  263.         {
  264.             addChild(world);
  265.             world.startRendering();
  266.             
  267.             for (var i:int = 0; i < MATRIX_NUM; i++) 
  268.             {
  269.                 cubes[i] = [];
  270.                 logicMatrix[i] = [];
  271.                 rollOverMatrix[i] = [];
  272.                 for (var j:int = 0; j < MATRIX_NUM; j++) 
  273.                 {
  274.                     var material:MaterialObject3D = new FlatShadeMaterial(light, DEF_COLOR);
  275.                     //var material:MaterialObject3D = new ColorMaterial(DEF_COLOR);
  276.                     material.interactive = true;
  277.                     var cube:Plane = new Plane(material, 7070);
  278.                     cube.x = 80 * (i - MATRIX_NUM / 2);
  279.                     cube.z = 80 * (j - MATRIX_NUM / 2);
  280.                     cube.y = 100;
  281.                     cube.extra = { u:i, v:j };
  282.                     cube.rotationX = 90;
  283.                     cube.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, cubeClickHandler);
  284.                     world.scene.addChild(cube);
  285.                     cubes[i][j] = cube;
  286.                     logicMatrix[i][j] = DEF_COLOR;
  287.                     rollOverMatrix[i][j] = false;
  288.                 }
  289.             }
  290.             
  291.             // ついでにパーティクルを生成します(彗星)
  292.             var particleMat:ParticleMaterial = new ParticleMaterial(0xFFFFFF, 1);
  293.             var particles:ParticleField = new ParticleField(particleMat, 5005600040006000);
  294.             particles.y = -150;
  295.             world.scene.addChild( particles );
  296.             
  297.             dispMatrix = copyArray2(logicMatrix);
  298.             oldDispMatrix = copyArray2(dispMatrix);
  299.             
  300.             // ライト
  301.             light.x = 200;
  302.             light.y = 400;
  303.             light.z = 200;
  304.             
  305.             world.camera.zoom = 1;
  306.             world.camera.focus = 400;
  307.             
  308.             addEventListener(Event.ENTER_FRAME, loop);
  309.         }
  310.         
  311.         private function beat(beat16th:int):void 
  312.         {
  313.             for (var i:int = 0; i < dispMatrix.length; i++) 
  314.             {
  315.                 for (var j:int = 0; j < dispMatrix[i].length; j++) 
  316.                 {
  317.                     if (beat16th == i)
  318.                     {
  319.                         dispMatrix[i][j] = ACTIVE_COLOR;
  320.                         
  321.                         if (logicMatrix[i][j] != DEF_COLOR)
  322.                             dispMatrix[i][j] = uint(logicMatrix[i][j] * 0x666666);
  323.                     }
  324.                     else
  325.                     {
  326.                         dispMatrix[i][j] = logicMatrix[i][j];
  327.                     }
  328.                     
  329.                     if (rollOverMatrix[i][j]) dispMatrix[i][j] = OVER_COLOR;
  330.                 }
  331.             }
  332.             
  333.             update();
  334.         }
  335.         
  336.         private function cubeClickHandler(e:InteractiveScene3DEvent):void 
  337.         {
  338.             var u:int = e.target.extra.u;
  339.             var v:int = e.target.extra.v;
  340.             
  341.             if (logicMatrix[u][v] == DEF_COLOR)
  342.             {
  343.                 logicMatrix[u][v] = USER_COLOR;
  344.                 sendCellStatus( { colorId:USER_COLOR, u:u, v:v } );
  345.             }
  346.             else
  347.             {
  348.                 logicMatrix[u][v] = DEF_COLOR;
  349.                 sendCellStatus( { colorId:DEF_COLOR, u:u, v:v } );
  350.             }
  351.             
  352.             update();
  353.         }
  354.         
  355.         private function update():void
  356.         {
  357.             var oldTime:Number = getTimer();
  358.             for (var i:int = 0; i < dispMatrix.length; i++) 
  359.             {
  360.                 for (var j:int = 0; j < dispMatrix[i].length; j++) 
  361.                 {
  362.                     var c:Plane = cubes[i][j];
  363.                     if (dispMatrix[i][j] != oldDispMatrix[i][j])
  364.                     {
  365.                         var material:MaterialObject3D = new FlatShadeMaterial(light, dispMatrix[i][j]);
  366.                         material.interactive = true;
  367.                         c.material = material;
  368.                     }
  369.                 }
  370.             }
  371.             
  372.             oldDispMatrix = copyArray2(dispMatrix);
  373.             //trace((getTimer() - oldTime) / 1000);
  374.         }
  375.         
  376.         private function copyArray2(arr:Array):Array
  377.         {
  378.             var r:Array = [];
  379.             for (var i:int = 0; i < arr.length; i++) 
  380.             {
  381.                 r[i] = arr[i].concat();
  382.             }
  383.             return r;
  384.         }
  385.         // アニメーション
  386.         private var rot:Number = 45// 角度
  387.         private var pitch:Number = 500// 高さ
  388.         private function loop(e:Event):void
  389.         {
  390.             rot += 0.1;
  391.             pitch = 500 * Math.sin(getTimer() / 2500) + 900;
  392.             
  393.             // 角度に応じてカメラの位置を設定
  394.             world.camera.x = 1000 * Math.sin(rot * Math.PI / 180);
  395.             world.camera.z = 1000 * Math.cos(rot * Math.PI / 180);
  396.             world.camera.y = pitch;
  397.         }
  398.         
  399.         private function setupUI():void
  400.         {
  401.             var bmp:Bitmap = new Bitmap(new BitmapData(1010false, USER_COLOR));
  402.             bmp.x = 10;
  403.             bmp.y = 26;
  404.             addChild(bmp);
  405.             
  406.             var txtFormat:TextFormat = new TextFormat();
  407.             txtFormat.font = "Arial";
  408.             
  409.             var text1:TextField = new TextField();
  410.             text1.selectable = false;
  411.             text1.defaultTextFormat = txtFormat;
  412.             text1.x = 8;
  413.             text1.y = 6;
  414.             text1.autoSize = "left";
  415.             text1.htmlText = "<font color='#FFFFFF' size='14'>Online Share Tenorion</font>";
  416.             addChild(text1);
  417.             
  418.             var text:TextField = new TextField();
  419.             text.selectable = false;
  420.             text.defaultTextFormat = txtFormat;
  421.             text.x = 25;
  422.             text.y = 24;
  423.             text.htmlText = "<font color='#FFFFFF' size='9'>YOUR COLOR</font>";
  424.             addChild(text);
  425.             
  426.             // BackGround Color
  427.             var bgMatrix:Matrix = new Matrix();
  428.             bgMatrix.rotate(90 * Math.PI / 180);
  429.             graphics.clear()
  430.             graphics.beginGradientFill("linear", [0x332244, 0x000000], [100100], [0255], bgMatrix);
  431.             graphics.drawRect(00, stage.stageWidth, stage.stageHeight);
  432.         }
  433.     }
  434. }
noswf

[3D Tenorion] colin challenge for professionals forked from: [3D Tenorion] colin challenge for professionals [diff(1)]

  1. // forked from clockmaker's [3D Tenorion] colin challenge for professionals
  2. // forked from checkmate's colin challenge for professionals
  3. /**
  4.  * Create a Flash app using Union Platform,
  5.  * where you can collaborate with more than 4 people online.
  6.  *
  7.  * UnionRamen is an example app,
  8.  * you can write code based on this, or build from scratch.
  9.  *
  10.  * UnionRamen is a multiuser bowl of ramen built on the Union Platform.
  11.  * Press the 'n' key to add naruto to the bowl.
  12.  * For Union Platform documentation, see www.unionplatform.com.
  13.  * 
  14.  * @author   Colin Moock
  15.  * @date     July 2009
  16.  * @location Toronto, Canada
  17.  */
  18.  /**
  19.   * テノリオンのオンライン共有型で3Dで作ってみました。
  20.   * ネット上の誰かが変更すると、その変更が反映されます。
  21.   * 
  22.   * 音 powered by SiONライブラリ
  23.   * ネット共有 powered by Union プラットフォーム
  24.   * 3D powered by Papervision3D
  25.   */
  26.   
  27. package
  28. {
  29.     // Flash
  30.     import flash.display.*;
  31.     import flash.events.*;
  32.     import flash.filters.*;
  33.     import flash.geom.*;
  34.     import flash.text.*;
  35.     import flash.utils.*;
  36.     
  37.     // Union
  38.     import net.user1.reactor.*;
  39.     import net.user1.logger.Logger;
  40.     
  41.     // SiON
  42.     import org.si.sion.*;
  43.     import org.si.sion.events.*;
  44.     import org.si.sion.sequencer.SiMMLTrack;
  45.     import org.si.sion.utils.SiONPresetVoice;
  46.     
  47.     // PV3D
  48.     import org.papervision3d.core.proto.MaterialObject3D;
  49.     import org.papervision3d.lights.PointLight3D;
  50.     import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
  51.     import org.papervision3d.objects.primitives.*;
  52.     import org.papervision3d.view.BasicView;
  53.     import org.papervision3d.events.InteractiveScene3DEvent;
  54.     import org.papervision3d.materials.special.*;
  55.     import org.papervision3d.materials.*;
  56.     import org.papervision3d.objects.special.*;
  57.     
  58.     [SWF(width = "465", height = "465", backgroundColor = "0", frameRate = 30)]
  59.     
  60.     public class Main extends Sprite
  61.     {
  62.         static private const USER_COLOR:uint = Math.random() * 0xFF0000;
  63.         static private const MATRIX_NUM:int = 16;
  64.         static private const DEF_COLOR:int = 0x555555;
  65.         static private const ACTIVE_COLOR:int = 0xEEEEEE;
  66.         static private const OVER_COLOR:int = 0x999999;
  67.             
  68.         //-----------------------------------
  69.         // Union
  70.         //-----------------------------------
  71.         protected var reactor:Reactor;
  72.         protected var room:Room;
  73.         
  74.         
  75.         //-----------------------------------
  76.         // SiON
  77.         //-----------------------------------
  78.         
  79.         // driver
  80.         public var driver:SiONDriver = new SiONDriver();
  81.         
  82.         // preset voice
  83.         public var presetVoice:SiONPresetVoice = new SiONPresetVoice();
  84.         
  85.         // voices, notes and tracks
  86.         public var tracks:Vector.<SiMMLTrack> = new Vector.<SiMMLTrack>(16);
  87.         public var voices:Vector.<int> = Vector.<int>([ 0123,  4444,  4444,  4444]);
  88.         public var notes:Vector.<int>  = Vector.<int>([36,48,60,7243,48,55,6065,67,70,7277,79,82,84]);
  89.         
  90.         // beat counter
  91.         public var beatCounter:int;
  92.         
  93.         
  94.         //-----------------------------------
  95.         // PV3d
  96.         //-----------------------------------
  97.         private var world:BasicView = new BasicView(465465falsetrue);
  98.         private var light:PointLight3D = new PointLight3D();
  99.         private var cubes:Array = [];
  100.         private var logicMatrix:Array = [];
  101.         private var oldDispMatrix:Array = [];
  102.         private var dispMatrix:Array = [];
  103.         private var rollOverMatrix:Array = [];
  104.         
  105.         
  106.         /**
  107.          * コンストラクタ
  108.          */
  109.         public function Main()
  110.         {
  111.             stage.quality = StageQuality.MEDIUM;
  112.             
  113.             setupUnion();
  114.             setupPV3D();
  115.             setupSiON();
  116.             setupUI();
  117.             
  118.             Wonderfl.capture_delay( 10 );
  119.         }
  120.         
  121.         //-----------------------------------
  122.         // Union
  123.         //-----------------------------------
  124.         
  125.         private function setupUnion():void
  126.         {
  127.             // 接続用のReactorオブジェクトを作成
  128.             reactor = new Reactor();
  129.             // 接続完了したら readyListener() を起動
  130.             reactor.addEventListener(ReactorEvent.READY, readyListener);
  131.             // Unionに接続。
  132.             // "tryunion.com:9100"は自由に使えるUnionテスト用の公開サーバーです
  133.             reactor.connect("tryunion.com"9100);
  134.             reactor.getLog().setLevel(Logger.DEBUG);
  135.         }
  136.         
  137.         // 接続完了時に起動されるメソッド
  138.         protected function readyListener (e:ReactorEvent):void
  139.         {
  140.             reactor.getMessageManager().addMessageListener("GIVE_ME_LOG", sendLog);
  141.             reactor.getMessageManager().addMessageListener("THIS_IS_LOG", happyToReceiveLog);
  142.             
  143.             // このアプリ用のルームを作成
  144.             room = reactor.getRoomManager().createRoom("wonderfl.clockmaker.tenorion");
  145.             // 他ユーザーがこのルームに送信する"SOMEONE_CHANGE"メッセージを監視します
  146.             room.addMessageListener("SOMEONE_CHANGE", changeCellHandler);
  147.             room.addEventListener(RoomEvent.SYNCHRONIZE, onSynchronize);
  148.             // ルームに入室
  149.             room.join();
  150.         }
  151.         
  152.         // invoked when received map from someone
  153.         protected function happyToReceiveLog(from:IClient, data:String):void
  154.         {
  155.             trace(data);
  156.             var arr:Array = data.split(",");
  157.             
  158.             for (var i:int = 0; i < arr.length; i++) 
  159.             {
  160.                 var u:int = i % MATRIX_NUM;
  161.                 var v:int = Math.floor(i / MATRIX_NUM);
  162.                 
  163.                 logicMatrix[u][v] = arr[i];
  164.             }
  165.         }
  166.         
  167.         // send map to new comer
  168.         protected function sendLog(from:IClient):void
  169.         {
  170.             var data:Array = [];
  171.             for (var i:int = 0; i < logicMatrix.length; i++) 
  172.                 for (var j:int = 0; j < logicMatrix[i].length; j++) 
  173.                     data.push(logicMatrix[i][j]);
  174.             from.sendMessage("THIS_IS_LOG", data.join(","));
  175.         }
  176.         
  177.         private function onSynchronize(e:RoomEvent):void 
  178.         {
  179.             if ( room.getClients().length == 1 ) {
  180.                 // 何もしない
  181.             } else {
  182.                 var topClient:IClient = room.getClients()[0];
  183.                 topClient.sendMessage("GIVE_ME_LOG");
  184.             }
  185.         }
  186.         
  187.         protected function sendCellStatus (o:Object):void
  188.         {
  189.             // 未接続だったら何もしない
  190.             if (!reactor.isReady()) return;
  191.             room.sendMessage("SOMEONE_CHANGE"truenull, o.colorId, o.u, o.v);
  192.         }
  193.         // 他ユーザーの"ADD_NARUTO"メッセージ受信時に起動するメソッド
  194.         protected function changeCellHandler (fromClient:IClient, colorId:uint, u:int, v:int):void
  195.         {
  196.             logicMatrix[u][v] = colorId;
  197.         }
  198.         
  199.         
  200.         
  201.         //-----------------------------------
  202.         // SiON
  203.         //-----------------------------------
  204.         
  205.         private function setupSiON():void
  206.         {
  207.             driver.setVoice(0, presetVoice["valsound.percus1"]);  // bass drum
  208.             driver.setVoice(1, presetVoice["valsound.percus28"]); // snare drum
  209.             driver.setVoice(2, presetVoice["valsound.percus17"]); // close hihat
  210.             driver.setVoice(3, presetVoice["valsound.percus23"]); // open hihat
  211.             driver.setVoice(4, presetVoice["valsound.bass18"]);
  212.             
  213.             // listen click
  214.             driver.setTimerInterruption(1, _onTimerInterruption);
  215.             driver.setBeatCallbackInterval(1);
  216.             driver.addEventListener(SiONTrackEvent.BEAT, _onBeat);
  217.             driver.addEventListener(SiONEvent.STREAM_START, _onStreamStart);
  218.             // start streaming
  219.             driver.play();
  220.         }
  221.         
  222.         // _onStreamStart (SiONEvent.STREAM_START) is called back first of all after SiONDriver.play().
  223.         private function _onStreamStart(e:SiONEvent) : void
  224.         {
  225.             // create new controlable tracks and set voice
  226.             for (var i:int=0; i<MATRIX_NUM; i++) {
  227.                 tracks[i] = driver.sequencer.newControlableTrack();
  228.                 tracks[i].setChannelModuleType(60, voices[i]);
  229.                 tracks[i].velocity = 64;
  230.             }
  231.             beatCounter = 0;
  232.         }
  233.         
  234.         
  235.         // _onBeat (SiONTrackEvent.BEAT) is called back in each beat at the sound timing.
  236.         private function _onBeat(e:SiONTrackEvent) : void 
  237.         {
  238.             //matrixPad.beat(e.eventTriggerID & 15);
  239.             beat(e.eventTriggerID & MATRIX_NUM - 1);
  240.         }
  241.         
  242.         
  243.         // _onTimerInterruption (SiONDriver.setTimerInterruption) is called back in each beat at the buffering timing.
  244.         private function _onTimerInterruption() : void
  245.         {
  246.             var beatIndex:int = beatCounter & (MATRIX_NUM - 1);
  247.             for (var i:int = 0; i < MATRIX_NUM; i++)
  248.             {
  249.                 if (logicMatrix[beatIndex][i] != DEF_COLOR)
  250.                     tracks[i].keyOn(notes[i]);
  251.             }
  252.             
  253.             beatCounter++;
  254.         }
  255.         
  256.         
  257.         
  258.         //-----------------------------------
  259.         // PV3d
  260.         //-----------------------------------
  261.         
  262.         private function setupPV3D():void
  263.         {
  264.             addChild(world);
  265.             world.startRendering();
  266.             
  267.             for (var i:int = 0; i < MATRIX_NUM; i++) 
  268.             {
  269.                 cubes[i] = [];
  270.                 logicMatrix[i] = [];
  271.                 rollOverMatrix[i] = [];
  272.                 for (var j:int = 0; j < MATRIX_NUM; j++) 
  273.                 {
  274.                     var material:MaterialObject3D = new FlatShadeMaterial(light, DEF_COLOR);
  275.                     //var material:MaterialObject3D = new ColorMaterial(DEF_COLOR);
  276.                     material.interactive = true;
  277.                     var cube:Plane = new Plane(material, 7070);
  278.                     cube.x = 80 * (i - MATRIX_NUM / 2);
  279.                     cube.z = 80 * (j - MATRIX_NUM / 2);
  280.                     cube.y = 100;
  281.                     cube.extra = { u:i, v:j };
  282.                     cube.rotationX = 90;
  283.                     cube.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, cubeClickHandler);
  284.                     world.scene.addChild(cube);
  285.                     cubes[i][j] = cube;
  286.                     logicMatrix[i][j] = DEF_COLOR;
  287.                     rollOverMatrix[i][j] = false;
  288.                 }
  289.             }
  290.             
  291.             // ついでにパーティクルを生成します(彗星)
  292.             var particleMat:ParticleMaterial = new ParticleMaterial(0xFFFFFF, 1);
  293.             var particles:ParticleField = new ParticleField(particleMat, 5005600040006000);
  294.             particles.y = -150;
  295.             world.scene.addChild( particles );
  296.             
  297.             dispMatrix = copyArray2(logicMatrix);
  298.             oldDispMatrix = copyArray2(dispMatrix);
  299.             
  300.             // ライト
  301.             light.x = 200;
  302.             light.y = 400;
  303.             light.z = 200;
  304.             
  305.             world.camera.zoom = 1;
  306.             world.camera.focus = 400;
  307.             
  308.             addEventListener(Event.ENTER_FRAME, loop);
  309.         }
  310.         
  311.         private function beat(beat16th:int):void 
  312.         {
  313.             for (var i:int = 0; i < dispMatrix.length; i++) 
  314.             {
  315.                 for (var j:int = 0; j < dispMatrix[i].length; j++) 
  316.                 {
  317.                     if (beat16th == i)
  318.                     {
  319.                         dispMatrix[i][j] = ACTIVE_COLOR;
  320.                         
  321.                         if (logicMatrix[i][j] != DEF_COLOR)
  322.                             dispMatrix[i][j] = uint(logicMatrix[i][j] * 0x666666);
  323.                     }
  324.                     else
  325.                     {
  326.                         dispMatrix[i][j] = logicMatrix[i][j];
  327.                     }
  328.                     
  329.                     if (rollOverMatrix[i][j]) dispMatrix[i][j] = OVER_COLOR;
  330.                 }
  331.             }
  332.             
  333.             update();
  334.         }
  335.         
  336.         private function cubeClickHandler(e:InteractiveScene3DEvent):void 
  337.         {
  338.             var u:int = e.target.extra.u;
  339.             var v:int = e.target.extra.v;
  340.             
  341.             if (logicMatrix[u][v] == DEF_COLOR)
  342.             {
  343.                 logicMatrix[u][v] = USER_COLOR;
  344.                 sendCellStatus( { colorId:USER_COLOR, u:u, v:v } );
  345.             }
  346.             else
  347.             {
  348.                 logicMatrix[u][v] = DEF_COLOR;
  349.                 sendCellStatus( { colorId:DEF_COLOR, u:u, v:v } );
  350.             }
  351.             
  352.             update();
  353.         }
  354.         
  355.         private function update():void
  356.         {
  357.             var oldTime:Number = getTimer();
  358.             for (var i:int = 0; i < dispMatrix.length; i++) 
  359.             {
  360.                 for (var j:int = 0; j < dispMatrix[i].length; j++) 
  361.                 {
  362.                     var c:Plane = cubes[i][j];
  363.                     if (dispMatrix[i][j] != oldDispMatrix[i][j])
  364.                     {
  365.                         var material:MaterialObject3D = new FlatShadeMaterial(light, dispMatrix[i][j]);
  366.                         material.interactive = true;
  367.                         c.material = material;
  368.                     }
  369.                 }
  370.             }
  371.             
  372.             oldDispMatrix = copyArray2(dispMatrix);
  373.             //trace((getTimer() - oldTime) / 1000);
  374.         }
  375.         
  376.         private function copyArray2(arr:Array):Array
  377.         {
  378.             var r:Array = [];
  379.             for (var i:int = 0; i < arr.length; i++) 
  380.             {
  381.                 r[i] = arr[i].concat();
  382.             }
  383.             return r;
  384.         }
  385.         // アニメーション
  386.         private var rot:Number = 45// 角度
  387.         private var pitch:Number = 500// 高さ
  388.         private function loop(e:Event):void
  389.         {
  390.             rot += 0.1;
  391.             pitch = 500 * Math.sin(getTimer() / 2500) + 900;
  392.             
  393.             // 角度に応じてカメラの位置を設定
  394.             world.camera.x = 1000 * Math.sin(rot * Math.PI / 180);
  395.             world.camera.z = 1000 * Math.cos(rot * Math.PI / 180);
  396.             world.camera.y = pitch;
  397.         }
  398.         
  399.         private function setupUI():void
  400.         {
  401.             var bmp:Bitmap = new Bitmap(new BitmapData(1010false, USER_COLOR));
  402.             bmp.x = 10;
  403.             bmp.y = 26;
  404.             addChild(bmp);
  405.             
  406.             var txtFormat:TextFormat = new TextFormat();
  407.             txtFormat.font = "Arial";
  408.             
  409.             var text1:TextField = new TextField();
  410.             text1.selectable = false;
  411.             text1.defaultTextFormat = txtFormat;
  412.             text1.x = 8;
  413.             text1.y = 6;
  414.             text1.autoSize = "left";
  415.             text1.htmlText = "<font color='#FFFFFF' size='14'>Online Share Tenorion</font>";
  416.             addChild(text1);
  417.             
  418.             var text:TextField = new TextField();
  419.             text.selectable = false;
  420.             text.defaultTextFormat = txtFormat;
  421.             text.x = 25;
  422.             text.y = 24;
  423.             text.htmlText = "<font color='#FFFFFF' size='9'>YOUR COLOR</font>";
  424.             addChild(text);
  425.             
  426.             // BackGround Color
  427.             var bgMatrix:Matrix = new Matrix();
  428.             bgMatrix.rotate(90 * Math.PI / 180);
  429.             graphics.clear()
  430.             graphics.beginGradientFill("linear", [0x332244, 0x000000], [100100], [0255], bgMatrix);
  431.             graphics.drawRect(00, stage.stageWidth, stage.stageHeight);
  432.         }
  433.     }
  434. }
noswf
  1. // forked from clockmaker's [3D Tenorion] colin challenge for professionals
  2. // forked from checkmate's colin challenge for professionals
  3. /**
  4.  * Create a Flash app using Union Platform,
  5.  * where you can collaborate with more than 4 people online.
  6.  *
  7.  * UnionRamen is an example app,
  8.  * you can write code based on this, or build from scratch.
  9.  *
  10.  * UnionRamen is a multiuser bowl of ramen built on the Union Platform.
  11.  * Press the 'n' key to add naruto to the bowl.
  12.  * For Union Platform documentation, see www.unionplatform.com.
  13.  * 
  14.  * @author   Colin Moock
  15.  * @date     July 2009
  16.  * @location Toronto, Canada
  17.  */
  18.  /**
  19.   * テノリオンのオンライン共有型で3Dで作ってみました。
  20.   * ネット上の誰かが変更すると、その変更が反映されます。
  21.   * 
  22.   * 音 powered by SiONライブラリ
  23.   * ネット共有 powered by Union プラットフォーム
  24.   * 3D powered by Papervision3D
  25.   */
  26. package
  27. {
  28.     // Flash
  29.     import flash.display.*;
  30.     import flash.events.*;
  31.     import flash.filters.*;
  32.     import flash.geom.*;
  33.     import flash.text.*;
  34.     import flash.utils.*;
  35.     
  36.     // Union
  37.     import net.user1.reactor.*;
  38.     import net.user1.logger.Logger;
  39.     
  40.     // SiON
  41.     import org.si.sion.*;
  42.     import org.si.sion.events.*;
  43.     import org.si.sion.sequencer.SiMMLTrack;
  44.     import org.si.sion.utils.SiONPresetVoice;
  45.     
  46.     // PV3D
  47.     import org.papervision3d.core.proto.MaterialObject3D;
  48.     import org.papervision3d.lights.PointLight3D;
  49.     import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
  50.     import org.papervision3d.objects.primitives.*;
  51.     import org.papervision3d.view.BasicView;
  52.     import org.papervision3d.events.InteractiveScene3DEvent;
  53.     import org.papervision3d.materials.special.*;
  54.     import org.papervision3d.materials.*;
  55.     import org.papervision3d.objects.special.*;
  56.     
  57.     [SWF(width = "465", height = "465", backgroundColor = "0", frameRate = 30)]
  58.     
  59.     public class Main extends Sprite
  60.     {
  61.         static private const USER_COLOR:uint = Math.random() * 0xFF0000;
  62.         static private const MATRIX_NUM:int = 16;
  63.         static private const DEF_COLOR:int = 0x555555;
  64.         static private const ACTIVE_COLOR:int = 0xEEEEEE;
  65.         static private const OVER_COLOR:int = 0x999999;
  66.             
  67.         //-----------------------------------
  68.         // Union
  69.         //-----------------------------------
  70.         protected var reactor:Reactor;
  71.         protected var room:Room;
  72.         
  73.         
  74.         //-----------------------------------
  75.         // SiON
  76.         //-----------------------------------
  77.         
  78.         // driver
  79.         public var driver:SiONDriver = new SiONDriver();
  80.         
  81.         // preset voice
  82.         public var presetVoice:SiONPresetVoice = new SiONPresetVoice();
  83.         
  84.         // voices, notes and tracks
  85.         public var tracks:Vector.<SiMMLTrack> = new Vector.<SiMMLTrack>(16);
  86.         public var voices:Vector.<int> = Vector.<int>([ 0123,  4444,  4444,  4444]);
  87.         public var notes:Vector.<int>  = Vector.<int>([36,48,60,7243,48,55,6065,67,70,7277,79,82,84]);
  88.         
  89.         // beat counter
  90.         public var beatCounter:int;
  91.         
  92.         
  93.         //-----------------------------------
  94.         // PV3d
  95.         //-----------------------------------
  96.         private var world:BasicView = new BasicView(465465falsetrue);
  97.         private var light:PointLight3D = new PointLight3D();
  98.         private var cubes:Array = [];
  99.         private var logicMatrix:Array = [];
  100.         private var oldDispMatrix:Array = [];
  101.         private var dispMatrix:Array = [];
  102.         private var rollOverMatrix:Array = [];
  103.         
  104.         
  105.         /**
  106.          * コンストラクタ
  107.          */
  108.         public function Main()
  109.         {
  110.             stage.quality = StageQuality.MEDIUM;
  111.             
  112.             setupUnion();
  113.             setupPV3D();
  114.             setupSiON();
  115.             setupUI();
  116.             
  117.             Wonderfl.capture_delay( 10 );
  118.         }
  119.         
  120.         //-----------------------------------
  121.         // Union
  122.         //-----------------------------------
  123.         
  124.         private function setupUnion():void
  125.         {
  126.             // 接続用のReactorオブジェクトを作成
  127.             reactor = new Reactor();
  128.             // 接続完了したら readyListener() を起動
  129.             reactor.addEventListener(ReactorEvent.READY, readyListener);
  130.             // Unionに接続。
  131.             // "tryunion.com:9100"は自由に使えるUnionテスト用の公開サーバーです
  132.             reactor.connect("tryunion.com"9100);
  133.             reactor.getLog().setLevel(Logger.DEBUG);
  134.         }
  135.         
  136.         // 接続完了時に起動されるメソッド
  137.         protected function readyListener (e:ReactorEvent):void
  138.         {
  139.             reactor.getMessageManager().addMessageListener("GIVE_ME_LOG", sendLog);
  140.             reactor.getMessageManager().addMessageListener("THIS_IS_LOG", happyToReceiveLog);
  141.             
  142.             // このアプリ用のルームを作成
  143.             room = reactor.getRoomManager().createRoom("wonderfl.clockmaker.tenorion");
  144.             // 他ユーザーがこのルームに送信する"SOMEONE_CHANGE"メッセージを監視します
  145.             room.addMessageListener("SOMEONE_CHANGE", changeCellHandler);
  146.             room.addEventListener(RoomEvent.SYNCHRONIZE, onSynchronize);
  147.             // ルームに入室
  148.             room.join();
  149.         }
  150.         
  151.         // invoked when received map from someone
  152.         protected function happyToReceiveLog(from:IClient, data:String):void
  153.         {
  154.             trace(data);
  155.             var arr:Array = data.split(",");
  156.             
  157.             for (var i:int = 0; i < arr.length; i++) 
  158.             {
  159.                 var u:int = i % MATRIX_NUM;
  160.                 var v:int = Math.floor(i / MATRIX_NUM);
  161.                 
  162.                 logicMatrix[u][v] = arr[i];
  163.             }
  164.         }
  165.         
  166.         // send map to new comer
  167.         protected function sendLog(from:IClient):void
  168.         {
  169.             var data:Array = [];
  170.             for (var i:int = 0; i < logicMatrix.length; i++) 
  171.                 for (var j:int = 0; j < logicMatrix[i].length; j++) 
  172.                     data.push(logicMatrix[i][j]);
  173.             from.sendMessage("THIS_IS_LOG", data.join(","));
  174.         }
  175.         
  176.         private function onSynchronize(e:RoomEvent):void 
  177.         {
  178.             if ( room.getClients().length == 1 ) {
  179.                 // 何もしない
  180.             } else {
  181.                 var topClient:IClient = room.getClients()[0];
  182.                 topClient.sendMessage("GIVE_ME_LOG");
  183.             }
  184.         }
  185.         
  186.         protected function sendCellStatus (o:Object):void
  187.         {
  188.             // 未接続だったら何もしない
  189.             if (!reactor.isReady()) return;
  190.             room.sendMessage("SOMEONE_CHANGE"truenull, o.colorId, o.u, o.v);
  191.         }
  192.         // 他ユーザーの"ADD_NARUTO"メッセージ受信時に起動するメソッド
  193.         protected function changeCellHandler (fromClient:IClient, colorId:uint, u:int, v:int):void
  194.         {
  195.             logicMatrix[u][v] = colorId;
  196.         }
  197.         
  198.         
  199.         
  200.         //-----------------------------------
  201.         // SiON
  202.         //-----------------------------------
  203.         
  204.         private function setupSiON():void
  205.         {
  206.             driver.setVoice(0, presetVoice["valsound.percus1"]);  // bass drum
  207.             driver.setVoice(1, presetVoice["valsound.percus28"]); // snare drum
  208.             driver.setVoice(2, presetVoice["valsound.percus17"]); // close hihat
  209.             driver.setVoice(3, presetVoice["valsound.percus23"]); // open hihat
  210.             driver.setVoice(4, presetVoice["valsound.bass18"]);
  211.             
  212.             // listen click
  213.             driver.setTimerInterruption(1, _onTimerInterruption);
  214.             driver.setBeatCallbackInterval(1);
  215.             driver.addEventListener(SiONTrackEvent.BEAT, _onBeat);
  216.             driver.addEventListener(SiONEvent.STREAM_START, _onStreamStart);
  217.             // start streaming
  218.             driver.play();
  219.         }
  220.         
  221.         // _onStreamStart (SiONEvent.STREAM_START) is called back first of all after SiONDriver.play().
  222.         private function _onStreamStart(e:SiONEvent) : void
  223.         {
  224.             // create new controlable tracks and set voice
  225.             for (var i:int=0; i<MATRIX_NUM; i++) {
  226.                 tracks[i] = driver.sequencer.newControlableTrack();
  227.                 tracks[i].setChannelModuleType(60, voices[i]);
  228.                 tracks[i].velocity = 64;
  229.             }
  230.             beatCounter = 0;
  231.         }
  232.         
  233.         
  234.         // _onBeat (SiONTrackEvent.BEAT) is called back in each beat at the sound timing.
  235.         private function _onBeat(e:SiONTrackEvent) : void 
  236.         {
  237.             //matrixPad.beat(e.eventTriggerID & 15);
  238.             beat(e.eventTriggerID & MATRIX_NUM - 1);
  239.         }
  240.         
  241.         
  242.         // _onTimerInterruption (SiONDriver.setTimerInterruption) is called back in each beat at the buffering timing.
  243.         private function _onTimerInterruption() : void
  244.         {
  245.             var beatIndex:int = beatCounter & (MATRIX_NUM - 1);
  246.             for (var i:int = 0; i < MATRIX_NUM; i++)
  247.             {
  248.                 if (logicMatrix[beatIndex][i] != DEF_COLOR)
  249.                     tracks[i].keyOn(notes[i]);
  250.             }
  251.             
  252.             beatCounter++;
  253.         }
  254.         
  255.         
  256.         
  257.         //-----------------------------------
  258.         // PV3d
  259.         //-----------------------------------
  260.         
  261.         private function setupPV3D():void
  262.         {
  263.             addChild(world);
  264.             world.startRendering();
  265.             
  266.             for (var i:int = 0; i < MATRIX_NUM; i++) 
  267.             {
  268.                 cubes[i] = [];
  269.                 logicMatrix[i] = [];
  270.                 rollOverMatrix[i] = [];
  271.                 for (var j:int = 0; j < MATRIX_NUM; j++) 
  272.                 {
  273.                     var material:MaterialObject3D = new FlatShadeMaterial(light, DEF_COLOR);
  274.                     //var material:MaterialObject3D = new ColorMaterial(DEF_COLOR);
  275.                     material.interactive = true;
  276.                     var cube:Plane = new Plane(material, 7070);
  277.                     cube.x = 80 * (i - MATRIX_NUM / 2);
  278.                     cube.z = 80 * (j - MATRIX_NUM / 2);
  279.                     cube.y = 100;
  280.                     cube.extra = { u:i, v:j };
  281.                     cube.rotationX = 90;
  282.                     cube.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, cubeClickHandler);
  283.                     world.scene.addChild(cube);
  284.                     cubes[i][j] = cube;
  285.                     logicMatrix[i][j] = DEF_COLOR;
  286.                     rollOverMatrix[i][j] = false;
  287.                 }
  288.             }
  289.             
  290.             // ついでにパーティクルを生成します(彗星)
  291.             var particleMat:ParticleMaterial = new ParticleMaterial(0xFFFFFF, 1);
  292.             var particles:ParticleField = new ParticleField(particleMat, 5005600040006000);
  293.             particles.y = -150;
  294.             world.scene.addChild( particles );
  295.             
  296.             dispMatrix = copyArray2(logicMatrix);
  297.             oldDispMatrix = copyArray2(dispMatrix);
  298.             
  299.             // ライト
  300.             light.x = 200;
  301.             light.y = 400;
  302.             light.z = 200;
  303.             
  304.             world.camera.zoom = 1;
  305.             world.camera.focus = 400;
  306.             
  307.             addEventListener(Event.ENTER_FRAME, loop);
  308.         }
  309.         
  310.         private function beat(beat16th:int):void 
  311.         {
  312.             for (var i:int = 0; i < dispMatrix.length; i++) 
  313.             {
  314.                 for (var j:int = 0; j < dispMatrix[i].length; j++) 
  315.                 {
  316.                     if (beat16th == i)
  317.                     {
  318.                         dispMatrix[i][j] = ACTIVE_COLOR;
  319.                         
  320.                         if (logicMatrix[i][j] != DEF_COLOR)
  321.                             dispMatrix[i][j] = uint(logicMatrix[i][j] * 0x666666);
  322.                     }
  323.                     else
  324.                     {
  325.                         dispMatrix[i][j] = logicMatrix[i][j];
  326.                     }
  327.                     
  328.                     if (rollOverMatrix[i][j]) dispMatrix[i][j] = OVER_COLOR;
  329.                 }
  330.             }
  331.             
  332.             update();
  333.         }
  334.         
  335.         private function cubeClickHandler(e:InteractiveScene3DEvent):void 
  336.         {
  337.             var u:int = e.target.extra.u;
  338.             var v:int = e.target.extra.v;
  339.             
  340.             if (logicMatrix[u][v] == DEF_COLOR)
  341.             {
  342.                 logicMatrix[u][v] = USER_COLOR;
  343.                 sendCellStatus( { colorId:USER_COLOR, u:u, v:v } );
  344.             }
  345.             else
  346.             {
  347.                 logicMatrix[u][v] = DEF_COLOR;
  348.                 sendCellStatus( { colorId:DEF_COLOR, u:u, v:v } );
  349.             }
  350.             
  351.             update();
  352.         }
  353.         
  354.         private function update():void
  355.         {
  356.             var oldTime:Number = getTimer();
  357.             for (var i:int = 0; i < dispMatrix.length; i++) 
  358.             {
  359.                 for (var j:int = 0; j < dispMatrix[i].length; j++) 
  360.                 {
  361.                     var c:Plane = cubes[i][j];
  362.                     if (dispMatrix[i][j] != oldDispMatrix[i][j])
  363.                     {
  364.                         var material:MaterialObject3D = new FlatShadeMaterial(light, dispMatrix[i][j]);
  365.                         material.interactive = true;
  366.                         c.material = material;
  367.                     }
  368.                 }
  369.             }
  370.             
  371.             oldDispMatrix = copyArray2(dispMatrix);
  372.             //trace((getTimer() - oldTime) / 1000);
  373.         }
  374.         
  375.         private function copyArray2(arr:Array):Array
  376.         {
  377.             var r:Array = [];
  378.             for (var i:int = 0; i < arr.length; i++) 
  379.             {
  380.                 r[i] = arr[i].concat();
  381.             }
  382.             return r;
  383.         }
  384.         // アニメーション
  385.         private var rot:Number = 45// 角度
  386.         private var pitch:Number = 500// 高さ
  387.         private function loop(e:Event):void
  388.         {
  389.             rot += 0.1;
  390.             pitch = 500 * Math.sin(getTimer() / 2500) + 900;
  391.             
  392.             // 角度に応じてカメラの位置を設定
  393.             world.camera.x = 1000 * Math.sin(rot * Math.PI / 180);
  394.             world.camera.z = 1000 * Math.cos(rot * Math.PI / 180);
  395.             world.camera.y = pitch;
  396.         }
  397.         
  398.         private function setupUI():void
  399.         {
  400.             var bmp:Bitmap = new Bitmap(new BitmapData(1010false, USER_COLOR));
  401.             bmp.x = 10;
  402.             bmp.y = 26;
  403.             addChild(bmp);
  404.             
  405.             var txtFormat:TextFormat = new TextFormat();
  406.             txtFormat.font = "Arial";
  407.             
  408.             var text1:TextField = new TextField();
  409.             text1.selectable = false;
  410.             text1.defaultTextFormat = txtFormat;
  411.             text1.x = 8;
  412.             text1.y = 6;
  413.             text1.autoSize = "left";
  414.             text1.htmlText = "<font color='#FFFFFF' size='14'>Online Share Tenorion</font>";
  415.             addChild(text1);
  416.             
  417.             var text:TextField = new TextField();
  418.             text.selectable = false;
  419.             text.defaultTextFormat = txtFormat;
  420.             text.x = 25;
  421.             text.y = 24;
  422.             text.htmlText = "<font color='#FFFFFF' size='9'>YOUR COLOR</font>";
  423.             addChild(text);
  424.             
  425.             // BackGround Color
  426.             var bgMatrix:Matrix = new Matrix();
  427.             bgMatrix.rotate(90 * Math.PI / 180);
  428.             graphics.clear()
  429.             graphics.beginGradientFill("linear", [0x332244, 0x000000], [100100], [0255], bgMatrix);
  430.             graphics.drawRect(00, stage.stageWidth, stage.stageHeight);
  431.         }
  432.     }
  433. }
noswf
  1. // forked from clockmaker's [3D Tenorion] colin challenge for professionals
  2. // forked from checkmate's colin challenge for professionals
  3. /**
  4.  * Create a Flash app using Union Platform,
  5.  * where you can collaborate with more than 4 people online.
  6.  *
  7.  * UnionRamen is an example app,
  8.  * you can write code based on this, or build from scratch.
  9.  *
  10.  * UnionRamen is a multiuser bowl of ramen built on the Union Platform.
  11.  * Press the 'n' key to add naruto to the bowl.
  12.  * For Union Platform documentation, see www.unionplatform.com.
  13.  * 
  14.  * @author   Colin Moock
  15.  * @date     July 2009
  16.  * @location Toronto, Canada
  17.  */
  18.  /**
  19.   * テノリオンのオンライン共有型で3Dで作ってみました。
  20.   * ネット上の誰かが変更すると、その変更が反映されます。
  21.   * 
  22.   * 音 powered by SiONライブラリ
  23.   * ネット共有 powered by Union プラットフォーム
  24.   * 3D powered by Papervision3D
  25.   */
  26. package
  27. {
  28.     // Flash
  29.     import flash.display.*;
  30.     import flash.events.*;
  31.     import flash.filters.*;
  32.     import flash.geom.*;
  33.     import flash.text.*;
  34.     import flash.utils.*;
  35.     
  36.     // Union
  37.     import net.user1.reactor.*;
  38.     import net.user1.logger.Logger;
  39.     
  40.     // SiON
  41.     import org.si.sion.*;
  42.     import org.si.sion.events.*;
  43.     import org.si.sion.sequencer.SiMMLTrack;
  44.     import org.si.sion.utils.SiONPresetVoice;
  45.     
  46.     // PV3D
  47.     import org.papervision3d.core.proto.MaterialObject3D;
  48.     import org.papervision3d.lights.PointLight3D;
  49.     import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
  50.     import org.papervision3d.objects.primitives.*;
  51.     import org.papervision3d.view.BasicView;
  52.     import org.papervision3d.events.InteractiveScene3DEvent;
  53.     import org.papervision3d.materials.special.*;
  54.     import org.papervision3d.materials.*;
  55.     import org.papervision3d.objects.special.*;
  56.     
  57.     [SWF(width = "465", height = "465", backgroundColor = "0", frameRate = 30)]
  58.     
  59.     public class Main extends Sprite
  60.     {
  61.         static private const USER_COLOR:uint = Math.random() * 0xFF0000;
  62.         static private const MATRIX_NUM:int = 16;
  63.         static private const DEF_COLOR:int = 0x555555;
  64.         static private const ACTIVE_COLOR:int = 0xEEEEEE;
  65.         static private const OVER_COLOR:int = 0x999999;
  66.             
  67.         //-----------------------------------
  68.         // Union
  69.         //-----------------------------------
  70.         protected var reactor:Reactor;
  71.         protected var room:Room;
  72.         
  73.         
  74.         //-----------------------------------
  75.         // SiON
  76.         //-----------------------------------
  77.         
  78.         // driver
  79.         public var driver:SiONDriver = new SiONDriver();
  80.         
  81.         // preset voice
  82.         public var presetVoice:SiONPresetVoice = new SiONPresetVoice();
  83.         
  84.         // voices, notes and tracks
  85.         public var tracks:Vector.<SiMMLTrack> = new Vector.<SiMMLTrack>(16);
  86.         public var voices:Vector.<int> = Vector.<int>([ 0123,  4444,  4444,  4444]);
  87.         public var notes:Vector.<int>  = Vector.<int>([36,48,60,7243,48,55,6065,67,70,7277,79,82,84]);
  88.         
  89.         // beat counter
  90.         public var beatCounter:int;
  91.         
  92.         
  93.         //-----------------------------------
  94.         // PV3d
  95.         //-----------------------------------
  96.         private var world:BasicView = new BasicView(465465falsetrue);
  97.         private var light:PointLight3D = new PointLight3D();
  98.         private var cubes:Array = [];
  99.         private var logicMatrix:Array = [];
  100.         private var oldDispMatrix:Array = [];
  101.         private var dispMatrix:Array = [];
  102.         private var rollOverMatrix:Array = [];
  103.         
  104.         
  105.         /**
  106.          * コンストラクタ
  107.          */
  108.         public function Main()
  109.         {
  110.             stage.quality = StageQuality.MEDIUM;
  111.             
  112.             setupUnion();
  113.             setupPV3D();
  114.             setupSiON();
  115.             setupUI();
  116.             
  117.             Wonderfl.capture_delay( 10 );
  118.         }
  119.         
  120.         //-----------------------------------
  121.         // Union
  122.         //-----------------------------------
  123.         
  124.         private function setupUnion():void
  125.         {
  126.             // 接続用のReactorオブジェクトを作成
  127.             reactor = new Reactor();
  128.             // 接続完了したら readyListener() を起動
  129.             reactor.addEventListener(ReactorEvent.READY, readyListener);
  130.             // Unionに接続。
  131.             // "tryunion.com:9100"は自由に使えるUnionテスト用の公開サーバーです
  132.             reactor.connect("tryunion.com"9100);
  133.             reactor.getLog().setLevel(Logger.DEBUG);
  134.         }
  135.         
  136.         // 接続完了時に起動されるメソッド
  137.         protected function readyListener (e:ReactorEvent):void
  138.         {
  139.             reactor.getMessageManager().addMessageListener("GIVE_ME_LOG", sendLog);
  140.             reactor.getMessageManager().addMessageListener("THIS_IS_LOG", happyToReceiveLog);
  141.             
  142.             // このアプリ用のルームを作成
  143.             room = reactor.getRoomManager().createRoom("wonderfl.clockmaker.tenorion");
  144.             // 他ユーザーがこのルームに送信する"SOMEONE_CHANGE"メッセージを監視します
  145.             room.addMessageListener("SOMEONE_CHANGE", changeCellHandler);
  146.             room.addEventListener(RoomEvent.SYNCHRONIZE, onSynchronize);
  147.             // ルームに入室
  148.             room.join();
  149.         }
  150.         
  151.         // invoked when received map from someone
  152.         protected function happyToReceiveLog(from:IClient, data:String):void
  153.         {
  154.             trace(data);
  155.             var arr:Array = data.split(",");
  156.             
  157.             for (var i:int = 0; i < arr.length; i++) 
  158.             {
  159.                 var u:int = i % MATRIX_NUM;
  160.                 var v:int = Math.floor(i / MATRIX_NUM);
  161.                 
  162.                 logicMatrix[u][v] = arr[i];
  163.             }
  164.         }
  165.         
  166.         // send map to new comer
  167.         protected function sendLog(from:IClient):void
  168.         {
  169.             var data:Array = [];
  170.             for (var i:int = 0; i < logicMatrix.length; i++) 
  171.                 for (var j:int = 0; j < logicMatrix[i].length; j++) 
  172.                     data.push(logicMatrix[i][j]);
  173.             from.sendMessage("THIS_IS_LOG", data.join(","));
  174.         }
  175.         
  176.         private function onSynchronize(e:RoomEvent):void 
  177.         {
  178.             if ( room.getClients().length == 1 ) {
  179.                 // 何もしない
  180.             } else {
  181.                 var topClient:IClient = room.getClients()[0];
  182.                 topClient.sendMessage("GIVE_ME_LOG");
  183.             }
  184.         }
  185.         
  186.         protected function sendCellStatus (o:Object):void
  187.         {
  188.             // 未接続だったら何もしない
  189.             if (!reactor.isReady()) return;
  190.             room.sendMessage("SOMEONE_CHANGE"truenull, o.colorId, o.u, o.v);
  191.         }
  192.         // 他ユーザーの"ADD_NARUTO"メッセージ受信時に起動するメソッド
  193.         protected function changeCellHandler (fromClient:IClient, colorId:uint, u:int, v:int):void
  194.         {
  195.             logicMatrix[u][v] = colorId;
  196.         }
  197.         
  198.         
  199.         
  200.         //-----------------------------------
  201.         // SiON
  202.         //-----------------------------------
  203.         
  204.         private function setupSiON():void
  205.         {
  206.             driver.setVoice(0, presetVoice["valsound.percus1"]);  // bass drum
  207.             driver.setVoice(1, presetVoice["valsound.percus28"]); // snare drum
  208.             driver.setVoice(2, presetVoice["valsound.percus17"]); // close hihat
  209.             driver.setVoice(3, presetVoice["valsound.percus23"]); // open hihat
  210.             driver.setVoice(4, presetVoice["valsound.bass18"]);
  211.             
  212.             // listen click
  213.             driver.setTimerInterruption(1, _onTimerInterruption);
  214.             driver.setBeatCallbackInterval(1);
  215.             driver.addEventListener(SiONTrackEvent.BEAT, _onBeat);
  216.             driver.addEventListener(SiONEvent.STREAM_START, _onStreamStart);
  217.             // start streaming
  218.             driver.play();
  219.         }
  220.         
  221.         // _onStreamStart (SiONEvent.STREAM_START) is called back first of all after SiONDriver.play().
  222.         private function _onStreamStart(e:SiONEvent) : void
  223.         {
  224.             // create new controlable tracks and set voice
  225.             for (var i:int=0; i<MATRIX_NUM; i++) {
  226.                 tracks[i] = driver.sequencer.newControlableTrack();
  227.                 tracks[i].setChannelModuleType(60, voices[i]);
  228.                 tracks[i].velocity = 64;
  229.             }
  230.             beatCounter = 0;
  231.         }
  232.         
  233.         
  234.         // _onBeat (SiONTrackEvent.BEAT) is called back in each beat at the sound timing.
  235.         private function _onBeat(e:SiONTrackEvent) : void 
  236.         {
  237.             //matrixPad.beat(e.eventTriggerID & 15);
  238.             beat(e.eventTriggerID & MATRIX_NUM - 1);
  239.         }
  240.         
  241.         
  242.         // _onTimerInterruption (SiONDriver.setTimerInterruption) is called back in each beat at the buffering timing.
  243.         private function _onTimerInterruption() : void
  244.         {
  245.             var beatIndex:int = beatCounter & (MATRIX_NUM - 1);
  246.             for (var i:int = 0; i < MATRIX_NUM; i++)
  247.             {
  248.                 if (logicMatrix[beatIndex][i] != DEF_COLOR)
  249.                     tracks[i].keyOn(notes[i]);
  250.             }
  251.             
  252.             beatCounter++;
  253.         }
  254.         
  255.         
  256.         
  257.         //-----------------------------------
  258.         // PV3d
  259.         //-----------------------------------
  260.         
  261.         private function setupPV3D():void
  262.         {
  263.             addChild(world);
  264.             world.startRendering();
  265.             
  266.             for (var i:int = 0; i < MATRIX_NUM; i++) 
  267.             {
  268.                 cubes[i] = [];
  269.                 logicMatrix[i] = [];
  270.                 rollOverMatrix[i] = [];
  271.                 for (var j:int = 0; j < MATRIX_NUM; j++) 
  272.                 {
  273.                     var material:MaterialObject3D = new FlatShadeMaterial(light, DEF_COLOR);
  274.                     //var material:MaterialObject3D = new ColorMaterial(DEF_COLOR);
  275.                     material.interactive = true;
  276.                     var cube:Plane = new Plane(material, 7070);
  277.                     cube.x = 80 * (i - MATRIX_NUM / 2);
  278.                     cube.z = 80 * (j - MATRIX_NUM / 2);
  279.                     cube.y = 100;
  280.                     cube.extra = { u:i, v:j };
  281.                     cube.rotationX = 90;
  282.                     cube.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, cubeClickHandler);
  283.                     world.scene.addChild(cube);
  284.                     cubes[i][j] = cube;
  285.                     logicMatrix[i][j] = DEF_COLOR;
  286.                     rollOverMatrix[i][j] = false;
  287.                 }
  288.             }
  289.             
  290.             // ついでにパーティクルを生成します(彗星)
  291.             var particleMat:ParticleMaterial = new ParticleMaterial(0xFFFFFF, 1);
  292.             var particles:ParticleField = new ParticleField(particleMat, 5005600040006000);
  293.             particles.y = -150;
  294.             world.scene.addChild( particles );
  295.             
  296.             dispMatrix = copyArray2(logicMatrix);
  297.             oldDispMatrix = copyArray2(dispMatrix);
  298.             
  299.             // ライト
  300.             light.x = 200;
  301.             light.y = 400;
  302.             light.z = 200;
  303.             
  304.             world.camera.zoom = 1;
  305.             world.camera.focus = 400;
  306.             
  307.             addEventListener(Event.ENTER_FRAME, loop);
  308.         }
  309.         
  310.         private function beat(beat16th:int):void 
  311.         {
  312.             for (var i:int = 0; i < dispMatrix.length; i++) 
  313.             {
  314.                 for (var j:int = 0; j < dispMatrix[i].length; j++) 
  315.                 {
  316.                     if (beat16th == i)
  317.                     {
  318.                         dispMatrix[i][j] = ACTIVE_COLOR;
  319.                         
  320.                         if (logicMatrix[i][j] != DEF_COLOR)
  321.                             dispMatrix[i][j] = uint(logicMatrix[i][j] * 0x666666);
  322.                     }
  323.                     else
  324.                     {
  325.                         dispMatrix[i][j] = logicMatrix[i][j];
  326.                     }
  327.                     
  328.                     if (rollOverMatrix[i][j]) dispMatrix[i][j] = OVER_COLOR;
  329.                 }
  330.             }
  331.             
  332.             update();
  333.         }
  334.         
  335.         private function cubeClickHandler(e:InteractiveScene3DEvent):void 
  336.         {
  337.             var u:int = e.target.extra.u;
  338.             var v:int = e.target.extra.v;
  339.             
  340.             if (logicMatrix[u][v] == DEF_COLOR)
  341.             {
  342.                 logicMatrix[u][v] = USER_COLOR;
  343.                 sendCellStatus( { colorId:USER_COLOR, u:u, v:v } );
  344.             }
  345.             else
  346.             {
  347.                 logicMatrix[u][v] = DEF_COLOR;
  348.                 sendCellStatus( { colorId:DEF_COLOR, u:u, v:v } );
  349.             }
  350.             
  351.             update();
  352.         }
  353.         
  354.         private function update():void
  355.         {
  356.             var oldTime:Number = getTimer();
  357.             for (var i:int = 0; i < dispMatrix.length; i++) 
  358.             {
  359.                 for (var j:int = 0; j < dispMatrix[i].length; j++) 
  360.                 {
  361.                     var c:Plane = cubes[i][j];
  362.                     if (dispMatrix[i][j] != oldDispMatrix[i][j])
  363.                     {
  364.                         var material:MaterialObject3D = new FlatShadeMaterial(light, dispMatrix[i][j]);
  365.                         material.interactive = true;
  366.                         c.material = material;
  367.                     }
  368.                 }
  369.             }
  370.             
  371.             oldDispMatrix = copyArray2(dispMatrix);
  372.             //trace((getTimer() - oldTime) / 1000);
  373.         }
  374.         
  375.         private function copyArray2(arr:Array):Array
  376.         {
  377.             var r:Array = [];
  378.             for (var i:int = 0; i < arr.length; i++) 
  379.             {
  380.                 r[i] = arr[i].concat();
  381.             }
  382.             return r;
  383.         }
  384.         // アニメーション
  385.         private var rot:Number = 45// 角度
  386.         private var pitch:Number = 500// 高さ
  387.         private function loop(e:Event):void
  388.         {
  389.             rot += 0.1;
  390.             pitch = 500 * Math.sin(getTimer() / 2500) + 900;
  391.             
  392.             // 角度に応じてカメラの位置を設定
  393.             world.camera.x = 1000 * Math.sin(rot * Math.PI / 180);
  394.             world.camera.z = 1000 * Math.cos(rot * Math.PI / 180);
  395.             world.camera.y = pitch;
  396.         }
  397.         
  398.         private function setupUI():void
  399.         {
  400.             var bmp:Bitmap = new Bitmap(new BitmapData(1010false, USER_COLOR));
  401.             bmp.x = 10;
  402.             bmp.y = 26;
  403.             addChild(bmp);
  404.             
  405.             var txtFormat:TextFormat = new TextFormat();
  406.             txtFormat.font = "Arial";
  407.             
  408.             var text1:TextField = new TextField();
  409.             text1.selectable = false;
  410.             text1.defaultTextFormat = txtFormat;
  411.             text1.x = 8;
  412.             text1.y = 6;
  413.             text1.autoSize = "left";
  414.             text1.htmlText = "<font color='#FFFFFF' size='14'>Online Share Tenorion</font>";
  415.             addChild(text1);
  416.             
  417.             var text:TextField = new TextField();
  418.             text.selectable = false;
  419.             text.defaultTextFormat = txtFormat;
  420.             text.x = 25;
  421.             text.y = 24;
  422.             text.htmlText = "<font color='#FFFFFF' size='9'>YOUR COLOR</font>";
  423.             addChild(text);
  424.             
  425.             // BackGround Color
  426.             var bgMatrix:Matrix = new Matrix();
  427.             bgMatrix.rotate(90 * Math.PI / 180);
  428.             graphics.clear()
  429.             graphics.beginGradientFill("linear", [0x332244, 0x000000], [100100], [0255], bgMatrix);
  430.             graphics.drawRect(00, stage.stageWidth, stage.stageHeight);
  431.         }
  432.     }
  433. }
noswf
  1. // forked from clockmaker's [3D Tenorion] colin challenge for professionals
  2. // forked from checkmate's colin challenge for professionals
  3. /**
  4.  * Create a Flash app using Union Platform,
  5.  * where you can collaborate with more than 4 people online.
  6.  *
  7.  * UnionRamen is an example app,
  8.  * you can write code based on this, or build from scratch.
  9.  *
  10.  * UnionRamen is a multiuser bowl of ramen built on the Union Platform.
  11.  * Press the 'n' key to add naruto to the bowl.
  12.  * For Union Platform documentation, see www.unionplatform.com.
  13.  * 
  14.  * @author   Colin Moock
  15.  * @date     July 2009
  16.  * @location Toronto, Canada
  17.  */
  18.  /**
  19.   * テノリオンのオンライン共有型で3Dで作ってみました。
  20.   * ネット上の誰かが変更すると、その変更が反映されます。
  21.   * 
  22.   * 音 powered by SiONライブラリ
  23.   * ネット共有 powered by Union プラットフォーム
  24.   * 3D powered by Papervision3D
  25.   */
  26. package
  27. {
  28.     // Flash
  29.     import flash.display.*;
  30.     import flash.events.*;
  31.     import flash.filters.*;
  32.     import flash.geom.*;
  33.     import flash.text.*;
  34.     import flash.utils.*;
  35.     
  36.     // Union
  37.     import net.user1.reactor.*;
  38.     import net.user1.logger.Logger;
  39.     
  40.     // SiON
  41.     import org.si.sion.*;
  42.     import org.si.sion.events.*;
  43.     import org.si.sion.sequencer.SiMMLTrack;
  44.     import org.si.sion.utils.SiONPresetVoice;
  45.     
  46.     // PV3D
  47.     import org.papervision3d.core.proto.MaterialObject3D;
  48.     import org.papervision3d.lights.PointLight3D;
  49.     import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
  50.     import org.papervision3d.objects.primitives.*;
  51.     import org.papervision3d.view.BasicView;
  52.     import org.papervision3d.events.InteractiveScene3DEvent;
  53.     import org.papervision3d.materials.special.*;
  54.     import org.papervision3d.materials.*;
  55.     import org.papervision3d.objects.special.*;
  56.     
  57.     [SWF(width = "465", height = "465", backgroundColor = "0", frameRate = 30)]
  58.     
  59.     public class Main extends Sprite
  60.     {
  61.         static private const USER_COLOR:uint = Math.random() * 0xFF0000;
  62.         static private const MATRIX_NUM:int = 16;
  63.         static private const DEF_COLOR:int = 0x555555;
  64.         static private const ACTIVE_COLOR:int = 0xEEEEEE;
  65.         static private const OVER_COLOR:int = 0x999999;
  66.             
  67.         //-----------------------------------
  68.         // Union
  69.         //-----------------------------------
  70.         protected var reactor:Reactor;
  71.         protected var room:Room;
  72.         
  73.         
  74.         //-----------------------------------
  75.         // SiON
  76.         //-----------------------------------
  77.         
  78.         // driver
  79.         public var driver:SiONDriver = new SiONDriver();
  80.         
  81.         // preset voice
  82.         public var presetVoice:SiONPresetVoice = new SiONPresetVoice();
  83.         
  84.         // voices, notes and tracks
  85.         public var tracks:Vector.<SiMMLTrack> = new Vector.<SiMMLTrack>(16);
  86.         public var voices:Vector.<int> = Vector.<int>([ 0123,  4444,  4444,  4444]);
  87.         public var notes:Vector.<int>  = Vector.<int>([36,48,60,7243,48,55,6065,67,70,7277,79,82,84]);
  88.         
  89.         // beat counter
  90.         public var beatCounter:int;
  91.         
  92.         
  93.         //-----------------------------------
  94.         // PV3d
  95.         //-----------------------------------
  96.         private var world:BasicView = new BasicView(465465falsetrue);
  97.         private var light:PointLight3D = new PointLight3D();
  98.         private var cubes:Array = [];
  99.         private var logicMatrix:Array = [];
  100.         private var oldDispMatrix:Array = [];
  101.         private var dispMatrix:Array = [];
  102.         private var rollOverMatrix:Array = [];
  103.         
  104.         
  105.         /**
  106.          * コンストラクタ
  107.          */
  108.         public function Main()
  109.         {
  110.             stage.quality = StageQuality.MEDIUM;
  111.             
  112.             setupUnion();
  113.             setupPV3D();
  114.             setupSiON();
  115.             setupUI();
  116.             
  117.             Wonderfl.capture_delay( 10 );
  118.         }
  119.         
  120.         //-----------------------------------
  121.         // Union
  122.         //-----------------------------------
  123.         
  124.         private function setupUnion():void
  125.         {
  126.             // 接続用のReactorオブジェクトを作成
  127.             reactor = new Reactor();
  128.             // 接続完了したら readyListener() を起動
  129.             reactor.addEventListener(ReactorEvent.READY, readyListener);
  130.             // Unionに接続。
  131.             // "tryunion.com:9100"は自由に使えるUnionテスト用の公開サーバーです
  132.             reactor.connect("tryunion.com"9100);
  133.             reactor.getLog().setLevel(Logger.DEBUG);
  134.         }
  135.         
  136.         // 接続完了時に起動されるメソッド
  137.         protected function readyListener (e:ReactorEvent):void
  138.         {
  139.             reactor.getMessageManager().addMessageListener("GIVE_ME_LOG", sendLog);
  140.             reactor.getMessageManager().addMessageListener("THIS_IS_LOG", happyToReceiveLog);
  141.             
  142.             // このアプリ用のルームを作成
  143.             room = reactor.getRoomManager().createRoom("wonderfl.clockmaker.tenorion");
  144.             // 他ユーザーがこのルームに送信する"SOMEONE_CHANGE"メッセージを監視します
  145.             room.addMessageListener("SOMEONE_CHANGE", changeCellHandler);
  146.             room.addEventListener(RoomEvent.SYNCHRONIZE, onSynchronize);
  147.             // ルームに入室
  148.             room.join();
  149.         }
  150.         
  151.         // invoked when received map from someone
  152.         protected function happyToReceiveLog(from:IClient, data:String):void
  153.         {
  154.             trace(data);
  155.             var arr:Array = data.split(",");
  156.             
  157.             for (var i:int = 0; i < arr.length; i++) 
  158.             {
  159.                 var u:int = i % MATRIX_NUM;
  160.                 var v:int = Math.floor(i / MATRIX_NUM);
  161.                 
  162.                 logicMatrix[u][v] = arr[i];
  163.             }
  164.         }
  165.         
  166.         // send map to new comer
  167.         protected function sendLog(from:IClient):void
  168.         {
  169.             var data:Array = [];
  170.             for (var i:int = 0; i < logicMatrix.length; i++) 
  171.                 for (var j:int = 0; j < logicMatrix[i].length; j++) 
  172.                     data.push(logicMatrix[i][j]);
  173.             from.sendMessage("THIS_IS_LOG", data.join(","));
  174.         }
  175.         
  176.         private function onSynchronize(e:RoomEvent):void 
  177.         {
  178.             if ( room.getClients().length == 1 ) {
  179.                 // 何もしない
  180.             } else {
  181.                 var topClient:IClient = room.getClients()[0];
  182.                 topClient.sendMessage("GIVE_ME_LOG");
  183.             }
  184.         }
  185.         
  186.         protected function sendCellStatus (o:Object):void
  187.         {
  188.             // 未接続だったら何もしない
  189.             if (!reactor.isReady()) return;
  190.             room.sendMessage("SOMEONE_CHANGE"truenull, o.colorId, o.u, o.v);
  191.         }
  192.         // 他ユーザーの"ADD_NARUTO"メッセージ受信時に起動するメソッド
  193.         protected function changeCellHandler (fromClient:IClient, colorId:uint, u:int, v:int):void
  194.         {
  195.             logicMatrix[u][v] = colorId;
  196.         }
  197.         
  198.         
  199.         
  200.         //-----------------------------------
  201.         // SiON
  202.         //-----------------------------------
  203.         
  204.         private function setupSiON():void
  205.         {
  206.             driver.setVoice(0, presetVoice["valsound.percus1"]);  // bass drum
  207.             driver.setVoice(1, presetVoice["valsound.percus28"]); // snare drum
  208.             driver.setVoice(2, presetVoice["valsound.percus17"]); // close hihat
  209.             driver.setVoice(3, presetVoice["valsound.percus23"]); // open hihat
  210.             driver.setVoice(4, presetVoice["valsound.bass18"]);
  211.             
  212.             // listen click
  213.             driver.setTimerInterruption(1, _onTimerInterruption);
  214.             driver.setBeatCallbackInterval(1);
  215.             driver.addEventListener(SiONTrackEvent.BEAT, _onBeat);
  216.             driver.addEventListener(SiONEvent.STREAM_START, _onStreamStart);
  217.             // start streaming
  218.             driver.play();
  219.         }
  220.         
  221.         // _onStreamStart (SiONEvent.STREAM_START) is called back first of all after SiONDriver.play().
  222.         private function _onStreamStart(e:SiONEvent) : void
  223.         {
  224.             // create new controlable tracks and set voice
  225.             for (var i:int=0; i<MATRIX_NUM; i++) {
  226.                 tracks[i] = driver.sequencer.newControlableTrack();
  227.                 tracks[i].setChannelModuleType(60, voices[i]);
  228.                 tracks[i].velocity = 64;
  229.             }
  230.             beatCounter = 0;
  231.         }
  232.         
  233.         
  234.         // _onBeat (SiONTrackEvent.BEAT) is called back in each beat at the sound timing.
  235.         private function _onBeat(e:SiONTrackEvent) : void 
  236.         {
  237.             //matrixPad.beat(e.eventTriggerID & 15);
  238.             beat(e.eventTriggerID & MATRIX_NUM - 1);
  239.         }
  240.         
  241.         
  242.         // _onTimerInterruption (SiONDriver.setTimerInterruption) is called back in each beat at the buffering timing.
  243.         private function _onTimerInterruption() : void
  244.         {
  245.             var beatIndex:int = beatCounter & (MATRIX_NUM - 1);
  246.             for (var i:int = 0; i < MATRIX_NUM; i++)
  247.             {
  248.                 if (logicMatrix[beatIndex][i] != DEF_COLOR)
  249.                     tracks[i].keyOn(notes[i]);
  250.             }
  251.             
  252.             beatCounter++;
  253.         }
  254.         
  255.         
  256.         
  257.         //-----------------------------------
  258.         // PV3d
  259.         //-----------------------------------
  260.         
  261.         private function setupPV3D():void
  262.         {
  263.             addChild(world);
  264.             world.startRendering();
  265.             
  266.             for (var i:int = 0; i < MATRIX_NUM; i++) 
  267.             {
  268.                 cubes[i] = [];
  269.                 logicMatrix[i] = [];
  270.                 rollOverMatrix[i] = [];
  271.                 for (var j:int = 0; j < MATRIX_NUM; j++) 
  272.                 {
  273.                     var material:MaterialObject3D = new FlatShadeMaterial(light, DEF_COLOR);
  274.                     //var material:MaterialObject3D = new ColorMaterial(DEF_COLOR);
  275.                     material.interactive = true;
  276.                     var cube:Plane = new Plane(material, 7070);
  277.                     cube.x = 80 * (i - MATRIX_NUM / 2);
  278.                     cube.z = 80 * (j - MATRIX_NUM / 2);
  279.                     cube.y = 100;
  280.                     cube.extra = { u:i, v:j };
  281.                     cube.rotationX = 90;
  282.                     cube.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, cubeClickHandler);
  283.                     world.scene.addChild(cube);
  284.                     cubes[i][j] = cube;
  285.                     logicMatrix[i][j] = DEF_COLOR;
  286.                     rollOverMatrix[i][j] = false;
  287.                 }
  288.             }
  289.             
  290.             // ついでにパーティクルを生成します(彗星)
  291.             var particleMat:ParticleMaterial = new ParticleMaterial(0xFFFFFF, 1);
  292.             var particles:ParticleField = new ParticleField(particleMat, 5005600040006000);
  293.             particles.y = -150;
  294.             world.scene.addChild( particles );
  295.             
  296.             dispMatrix = copyArray2(logicMatrix);
  297.             oldDispMatrix = copyArray2(dispMatrix);
  298.             
  299.             // ライト
  300.             light.x = 200;
  301.             light.y = 400;
  302.             light.z = 200;
  303.             
  304.             world.camera.zoom = 1;
  305.             world.camera.focus = 400;
  306.             
  307.             addEventListener(Event.ENTER_FRAME, loop);
  308.         }
  309.         
  310.         private function beat(beat16th:int):void 
  311.         {
  312.             for (var i:int = 0; i < dispMatrix.length; i++) 
  313.             {
  314.                 for (var j:int = 0; j < dispMatrix[i].length; j++) 
  315.                 {
  316.                     if (beat16th == i)
  317.                     {
  318.                         dispMatrix[i][j] = ACTIVE_COLOR;
  319.                         
  320.                         if (logicMatrix[i][j] != DEF_COLOR)
  321.                             dispMatrix[i][j] = uint(logicMatrix[i][j] * 0x666666);
  322.                     }
  323.                     else
  324.                     {
  325.                         dispMatrix[i][j] = logicMatrix[i][j];
  326.                     }
  327.                     
  328.                     if (rollOverMatrix[i][j]) dispMatrix[i][j] = OVER_COLOR;
  329.                 }
  330.             }
  331.             
  332.             update();
  333.         }
  334.         
  335.         private function cubeClickHandler(e:InteractiveScene3DEvent):void 
  336.         {
  337.             var u:int = e.target.extra.u;
  338.             var v:int = e.target.extra.v;
  339.             
  340.             if (logicMatrix[u][v] == DEF_COLOR)
  341.             {
  342.                 logicMatrix[u][v] = USER_COLOR;
  343.                 sendCellStatus( { colorId:USER_COLOR, u:u, v:v } );
  344.             }
  345.             else
  346.             {
  347.                 logicMatrix[u][v] = DEF_COLOR;
  348.                 sendCellStatus( { colorId:DEF_COLOR, u:u, v:v } );
  349.             }
  350.             
  351.             update();
  352.         }
  353.         
  354.         private function update():void
  355.         {
  356.             var oldTime:Number = getTimer();
  357.             for (var i:int = 0; i < dispMatrix.length; i++) 
  358.             {
  359.                 for (var j:int = 0; j < dispMatrix[i].length; j++) 
  360.                 {
  361.                     var c:Plane = cubes[i][j];
  362.                     if (dispMatrix[i][j] != oldDispMatrix[i][j])
  363.                     {
  364.                         var material:MaterialObject3D = new FlatShadeMaterial(light, dispMatrix[i][j]);
  365.                         material.interactive = true;
  366.                         c.material = material;
  367.                     }
  368.                 }
  369.             }
  370.             
  371.             oldDispMatrix = copyArray2(dispMatrix);
  372.             //trace((getTimer() - oldTime) / 1000);
  373.         }
  374.         
  375.         private function copyArray2(arr:Array):Array
  376.         {
  377.             var r:Array = [];
  378.             for (var i:int = 0; i < arr.length; i++) 
  379.             {
  380.                 r[i] = arr[i].concat();
  381.             }
  382.             return r;
  383.         }
  384.         // アニメーション
  385.         private var rot:Number = 45// 角度
  386.         private var pitch:Number = 500// 高さ
  387.         private function loop(e:Event):void
  388.         {
  389.             rot += 0.1;
  390.             pitch = 500 * Math.sin(getTimer() / 2500) + 900;
  391.             
  392.             // 角度に応じてカメラの位置を設定
  393.             world.camera.x = 1000 * Math.sin(rot * Math.PI / 180);
  394.             world.camera.z = 1000 * Math.cos(rot * Math.PI / 180);
  395.             world.camera.y = pitch;
  396.         }
  397.         
  398.         private function setupUI():void
  399.         {
  400.             var bmp:Bitmap = new Bitmap(new BitmapData(1010false, USER_COLOR));
  401.             bmp.x = 10;
  402.             bmp.y = 26;
  403.             addChild(bmp);
  404.             
  405.             var txtFormat:TextFormat = new TextFormat();
  406.             txtFormat.font = "Arial";
  407.             
  408.             var text1:TextField = new TextField();
  409.             text1.selectable = false;
  410.             text1.defaultTextFormat = txtFormat;
  411.             text1.x = 8;
  412.             text1.y = 6;
  413.             text1.autoSize = "left";
  414.             text1.htmlText = "<font color='#FFFFFF' size='14'>Online Share Tenorion</font>";
  415.             addChild(text1);
  416.             
  417.             var text:TextField = new TextField();
  418.             text.selectable = false;
  419.             text.defaultTextFormat = txtFormat;
  420.             text.x = 25;
  421.             text.y = 24;
  422.             text.htmlText = "<font color='#FFFFFF' size='9'>YOUR COLOR</font>";
  423.             addChild(text);
  424.             
  425.             // BackGround Color
  426.             var bgMatrix:Matrix = new Matrix();
  427.             bgMatrix.rotate(90 * Math.PI / 180);
  428.             graphics.clear()
  429.             graphics.beginGradientFill("linear", [0x332244, 0x000000], [100100], [0255], bgMatrix);
  430.             graphics.drawRect(00, stage.stageWidth, stage.stageHeight);
  431.         }
  432.     }
  433. }
noswf
Get Adobe Flash Player