Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

寺子屋クスール @STATION5

2,228 views

Published on

2010年5月30日 STATION5で行われた寺子屋クスールのセッション2 [Flash CS5x科学 byくるくる研究室]で使用されたスライドです。

Published in: Technology
  • Be the first to comment

  • Be the first to like this

寺子屋クスール @STATION5

  1. 1. くるくる研究室 ケータイ Flash で 物理演算をしてみた
  2. 2. http://labs.kuru2jam.com/ @hara3 @biscuitjam
  3. 3. 作品紹介 http://labs.kuru2jam.com/ くるくる研究室
  4. 4. 科学?!
  5. 5. センサー大好き!
  6. 6. Flash Lite 4
  7. 7. くるくる研究室 ケータイ Flash で 物理演算をしてみた
  8. 8. ActionScript3 で開発 !
  9. 9. 重力計算をしてみる
  10. 10. 必要なプロパティ 重力加速度 (gravity) 跳ね返り系数 (bounce) 速度 (vy)
  11. 11. 計算の手順 <ul><li>現在の速度に重力加速度を足す </li></ul><ul><li>今の座標に速度を足す </li></ul><ul><li>跳ね返る処理 </li></ul><ul><li>この手順を EnterFrame に書くだけ! </li></ul>
  12. 12. 速度 重力加速度 速度 重力加速度
  13. 13. this . addEventListener ( Event . ENTER_FRAME ,_enterFrameHandler); function _enterFrameHandler(e: Event ){ // 現在の速度に重力加速度を足す vy += gravity; // 今の座標に速度を足す y += vy; // 跳ね返る処理 // ボール底の座標がステージの最下部を超えたら if ( y + height / 2 > stage . stageHeight ){ // ボールの座標をステージの最下部へ y = stage . stageHeight – height / 2; // 速度に跳ね返り係数をかけると跳ね返る vy *= bounce; } }
  14. 14. デモ
  15. 15. タップの判定
  16. 16. タッチイベント this . addEventListener ( TouchEvent.TOUCH_TAP , onTouchTap); function onTouchTap(e: TouchEvent ){ addBall(e. stageX ,e. stageY ); }
  17. 17. デモ
  18. 18. DeciceCentral CS5 新機能
  19. 19. 振れます。
  20. 20. デモ
  21. 21. 加速度の取得
  22. 22. さようなら fscommand2
  23. 23. Accelerometer クラス
  24. 24. //Accelerometer オブジェクトを作成する var acc: Accelerometer = new Accelerometer (); // 端末が加速度センサを使えるかチェックする var isSupportedAcc: Boolean = Accelerometer.isSupported ; if (isSupportedAcc){ // 加速度の取得開始 acc. addEventListener ( AccelerometerEvent . UPDATE , _updateAccHandler); } function _updateAccHandler(e: AccelerometerEvent ){ // 加速度を取得した時の処理 ・・・ }
  25. 25. 「振る」動作の判定
  26. 26. // 以前かかった力 var preF: Number = 0; function _updateAccHandler(e: AccelerometerEvent ){ // マグニチュードの計算 var ax: Number = e. accelerationX ; //X 軸方向の加速度 var ay: Number = e. accelerationY ; //Y 軸方向の加速度 var az: Number = e. accelerationZ ; //Z 軸方向の加速度 // 端末にかかった力の大きさを計算 ( 各加速度を二乗して足す ) var f: Number = ax * ax + ay * ay + az * az; // 前にかかった力との差を取る。 // この差が大きければ、たくさん振ったということ var m: Number = Math . abs (f - preF); if (m > 0.1){ addBall( Math.random () * 240,-30); } // 以前かかった力として更新 preF = f; }
  27. 27. デモ
  28. 28. 衝突判定したい!
  29. 29. 計算がめんどい …
  30. 30. 帰りたい …
  31. 31. そうだ。 AS3 じゃないか!
  32. 32. AS3 神様、 力をお貸し下さい
  33. 33. Box2DFlashAS3 http://sourceforge.net/projects/box2dflash/
  34. 34. 設定の流れ <ul><li>重力を設定 </li></ul><ul><li>シミュレーションの場 (world) を作成 </li></ul><ul><li>個々のオブジェクトを作成 </li></ul><ul><li>シミュレーション実行 </li></ul>
  35. 35. オブジェクトの作成 <ul><li>形を設定 </li></ul><ul><li>性質を設定 </li></ul><ul><li>実体 (Body) を作成 </li></ul><ul><li>Body とムービークリップを結びつける </li></ul><ul><li>Body をワールド内に生成する </li></ul><ul><li>Body に性質を適用 </li></ul>
  36. 36. ( 実際のコードから抜粋 ) function initBox2d(){ // 重力設定 var gravity:b2Vec2 = new b2Vec2(0.0, 10.0); // ワールドを設定 _world = new b2World( gravity, true); // ボールを生成 addBall(120,40); // 更新 addEventListener ( Event . ENTER_FRAME , update); }
  37. 37. function addBall(xx: Number , yy: Number ){ // ボールの形を作成 var circleDef : b2CircleShape = new b2CircleShape(); var radius : uint = 20; circleDef.SetRadius(radius / _m_physScale); // ボールの性質を設定 _fixtureDef.friction = 10; _fixtureDef.density = 10; _fixtureDef.restitution = 0.9; _fixtureDef.shape = circleDef; ・ ・ ・ 続く
  38. 38. ( 続き ) // ボールのボディを設定 var bodyDef : b2BodyDef = new b2BodyDef(); bodyDef.type = b2Body.b2_dynamicBody;// 重力の影響を受けるようにする bodyDef.position.Set(xx / _m_physScale, yy / _m_physScale); // ボディとムービークリップ (Ball) を結びつける bodyDef.userData = new Ball(); bodyDef.userData. x = bodyDef.position. x ; bodyDef.userData. y = bodyDef.position. y ; addChild (bodyDef.userData);// ムービークリップ (Ball) を画面表示 // 作成した bodyDef をワールド内に生成する var circleBody : b2Body = _world.CreateBody(bodyDef); // 生成した circleBody にボールの性質を適用 circleBody.CreateFixture(_fixtureDef); }
  39. 39. function update(e: Event ): void { // ワールド内の時間をすすめる _world.Step(_m_timeStep, _m_iterations, _m_positionIterations); _world.ClearForces(); // ワールド内のボディの状態をムービークリップに対応させる for ( var bb:b2Body = _world.GetBodyList(); bb; bb = bb.GetNext()){ var mc:MovieClip = MovieClip(bb.GetUserData()); if (mc){ mc. x = bb.GetPosition().x * _m_physScale; mc. y = bb.GetPosition().y * _m_physScale; mc. rotation = bb.GetAngle() * (180 / Math.PI ); } } }
  40. 40. デモ
  41. 41. その他の機能
  42. 42. マルチタッチ Multitouch . inputMode = MultitouchInputMode . GESTURE ; GPS Geolocation クラス ( AIR 限定 )
  43. 43. 実機テストしてね
  44. 44. おまけ FlashLite4 はできる子
  45. 45. ありがとうございました。

×