Box2DFlashAS3をお試し
こんばんわ。iyamaです。
今日はwonderflを使ってActionScriptで遊んでみようと思います。
久々にwonderflのアカウント引っ張り出してきたよ。
wonderflでサポートされている物理演算ライブラリのBox2DFlashAS3(2.0.2)を使ってみましょー。
お手本として以下のサイトを参考にさせてもらいました。
Box2DFlashAS3 の単純なサンプルと使い方 (2.0.2版)
そして作成したwonderflは以下からどうぞ。
Box2DFlashAS3 on 2011-11-5 – wonderfl build flash online
ソースは以下のとおり。
参考サイトを元にちょこちょこと私好みに書き換えてあります。
wonderflではBox2FlashAS3のライブラリが使えるので、
import Box2D.*とするだけで使えるのです。楽チン。
/** * Copyright aiyco ( http://wonderfl.net/user/aiyco ) * MIT License ( http://www.opensource.org/licenses/mit-license.php ) * Downloaded from: http://wonderfl.net/c/mX2o */ package { import Box2D.Dynamics.*; import Box2D.Collision.*; import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; import flash.events.Event; import flash.events.MouseEvent; import flash.display.Sprite; import flash.display.Stage; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.text.TextField; [SWF(backgroundColor="#ffffcc", width="350", height="200")] public class FlashTest extends Sprite { // 重力 private const SCALE:Number = 8; private var world:b2World; private var tf:TextField; private var animation:Boolean = false; private var count:int = 0; // 世界 private var worldAABB:b2AABB; private var gravity:b2Vec2; private var wallBdDef:b2BodyDef; private var wallBd:b2Body; private var wallShapeDef:b2PolygonDef; private var debugDraw:b2DebugDraw; // Object private var objBdDef:b2BodyDef; private var objBd:b2Body; private var shapeDef:b2PolygonDef; public function FlashTest() { // write as3 code here.. stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; tf = new TextField(); tf.textColor = 0x000000; tf.text = "Click to start"; addChild(tf); animation = false; stage.addEventListener(MouseEvent.CLICK, tfClickEventHandler); // 初期化 init(); createObject(); count = 0; stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler); } /** * init */ private function init():void { // 世界を作る worldAABB = new b2AABB(); worldAABB.lowerBound.Set(-100.0, -100.0); worldAABB.upperBound.Set(100.0, 100.0); // 重力 gravity = new b2Vec2(0.0, 10.0); // 世界のインスタンス world = new b2World(worldAABB, gravity, true); // 床 wallBdDef = new b2BodyDef(); wallBdDef.position.Set(400 / SCALE / 2, 300 / SCALE); wallBdDef.angle = Math.PI / 20; wallBd = world.CreateBody(wallBdDef); wallShapeDef = new b2PolygonDef(); wallShapeDef.SetAsBox(180 / SCALE, 10 / SCALE); wallBd.CreateShape(wallShapeDef); // DebugDraw debugDraw = new b2DebugDraw(); debugDraw.m_sprite = this; debugDraw.m_drawScale = SCALE; debugDraw.m_fillAlpha = .5; debugDraw.m_lineThickness = 3; debugDraw.m_drawFlags = b2DebugDraw.e_shapeBit; world.SetDebugDraw(debugDraw); } /** * createObject */ private function createObject():void { objBdDef = new b2BodyDef(); objBdDef.position.Set((300 * Math.random()) / SCALE, 0); objBdDef.angle = Math.PI / 2 * Math.random(); objBd = world.CreateBody(objBdDef); shapeDef = new b2PolygonDef(); shapeDef.SetAsBox(30 / SCALE, 30 / SCALE); shapeDef.density = 1; shapeDef.restitution = 0.4; shapeDef.friction = 0.1; objBd.CreateShape(shapeDef); shapeDef.SetAsBox(40 / SCALE, 5 / SCALE); objBd.CreateShape(shapeDef); objBd.SetMassFromShapes(); } /** * tfClickEventHandler * @event : MouseEvent */ private function tfClickEventHandler(event:MouseEvent):void { count = 0; animation = !animation; if (animation) { tf.text = "Click to stop"; } else { tf.text = "Click to start"; } } /** * enterFrameHandler * @event : Event */ private function enterFrameHandler(event:Event):void { world.Step(1 / 15, 10); if (count == 0 && animation) { createObject(); } count = (count + 1) % 30; // 下に行ったオブジェクトを削除 for (var b:b2Body = world.GetBodyList(); b; b = b.GetNext()) { if (b.GetWorldCenter().y * SCALE > 600) { world.DestroyBody(b); } } } } }
wonderflはいいですね。
リアルタイムにコーディングしたものがプレビューできるので。
前に紹介したas3corelibもサポートしているので、ちょっとしたテストにはもってこいです。
そして、皆様ご存知かと思いますが、Javascript版のjsdo itもあるよーん。
以上です。
コメント 0