Box2DFlash筆記(一)

來源:互聯網
上載者:User

聲明:歡迎任何人和組織轉載本blog中文章,但必須標記文章原始連結和作者資訊。

本文連結:http://blog.csdn.net/li_007/archive/2009/04/08/4057340.aspx

開拓進取的小烏龜------->CSDN點滴點點滴滴Blog

 玩了一段時間的Box2D這個C++的Physicas Engine,突然發現有人把它寫成了Flash版的,官網為:http://box2dflash.sourceforge.net/,大家可以去玩玩,很不錯的。Download下來後,自己也照著做了個,其實很簡單的,沒C++哪麼複雜。由於沒有flash版的Docs,所以大家去找C++版的Manual看吧,下載C++版源碼,解壓就有Documents,C++的官網是打不開的,不知道為什麼國內把它屏蔽了,好友日本就能開啟這個網站的。廢話不說,貼上My Code:

//<br />// PhysEngine.as<br />//<br />// the entry of application<br />//<br />// Written by Leezhm, 8st April, 2009<br />// Contact : Leezhm@126.com<br />// Last Modified by Leezhm on 8st April, 2009<br />//</p><p>package Srcs<br />{<br />import Box2D.Collision.Shapes.b2CircleDef;<br />import Box2D.Collision.Shapes.b2PolygonDef;<br />import Box2D.Collision.Shapes.b2ShapeDef;<br />import Box2D.Common.Math.b2Vec2;<br />import Box2D.Dynamics.b2Body;<br />import Box2D.Dynamics.b2BodyDef;<br />import Box2D.Collision.b2AABB;<br />import Box2D.Dynamics.b2World;</p><p>import flash.display.Sprite;<br />import flash.events.Event;</p><p>public class PhysEngine extends Sprite<br />{<br />private var _b2World:b2World;<br />private var _b2WorldAABB:b2AABB;<br />private var _gravityVector:b2Vec2;<br />private var _b2TimerStep:Number = 1.0 / 30.0;<br />private var _b2Interations:uint = 10;</p><p>public function PhysEngine()<br />{<br />if (!stage)<br />{<br />InitApplication();<br />}<br />else<br />{<br />this.addEventListener(Event.ADDED_TO_STAGE, InitApplication);<br />}<br />}</p><p>private function InitApplication(evt:Event = null):void<br />{<br />this.removeEventListener(Event.ADDED_TO_STAGE, InitApplication);</p><p>this.addEventListener(Event.ENTER_FRAME, OnMainEnterFrame, false, 0, true);</p><p>InitPhysicsEngine();</p><p>AddBodiesToWorld();<br />}</p><p>private function InitPhysicsEngine():void<br />{<br />// create the world AABB<br />if (null == this._b2WorldAABB)<br />{<br />this._b2WorldAABB = new b2AABB();<br />this._b2WorldAABB.lowerBound.Set( -100.0, -100.0);<br />this._b2WorldAABB.upperBound.Set( 100.0, 100.0);<br />}</p><p>// define the gravity vector<br />if (null == this._gravityVector)<br />{<br />this._gravityVector = new b2Vec2(0.0, 10.0);<br />}</p><p>// allow body can be sleep<br />var _b2Sleep:Boolean = true;</p><p>// create the b2World<br />if (null == this._b2World)<br />{<br />this._b2World = new b2World(this._b2WorldAABB, this._gravityVector, _b2Sleep);<br />}<br />}</p><p>private function AddBodiesToWorld():void<br />{<br />var _body:b2Body;<br />var _bodyDef:b2BodyDef;<br />var _boxDef:b2PolygonDef;<br />var _circleDef:b2CircleDef;</p><p>// create the ground body<br />_bodyDef = new b2BodyDef();<br />_bodyDef.position.Set(10, 20);</p><p>_boxDef = new b2PolygonDef();<br />_boxDef.SetAsBox(30, 3);<br />_boxDef.friction = 0.3;<br />_boxDef.density = 0;</p><p>_bodyDef.userData = new CPhysRectangle();<br />_bodyDef.userData.width = 1800;<br />_bodyDef.userData.height = 180;<br />this.addChild(_bodyDef.userData);</p><p>_body = this._b2World.CreateBody(_bodyDef);<br />_body.CreateShape(_boxDef);<br />_body.SetMassFromShapes();</p><p>// create dynamic body<br />for (var i:uint = 0; i < 36; i ++)<br />{<br />var _xScale:Number = Math.random() + 0.5;<br />var _yScale:Number = Math.random() + 0.5;</p><p>_bodyDef = new b2BodyDef();<br />_bodyDef.position.x = Math.random() * 15 + 5;<br />_bodyDef.position.y = Math.random() * 10;</p><p>switch(uint(Math.random() * 3))<br />{<br />case 0:<br />{<br />// create a circle<br />_circleDef = new b2CircleDef();<br />_circleDef.radius = _xScale;<br />_circleDef.friction = 0.5;<br />_circleDef.density = 1.0;<br />_circleDef.restitution = 0.2;</p><p>_bodyDef.userData = new CCircle();<br />_bodyDef.userData.width = _xScale * 2 * 30;<br />_bodyDef.userData.height = _xScale * 2 * 30;</p><p>_body = _b2World.CreateBody(_bodyDef);<br />_body.CreateShape(_circleDef);<br />break;<br />}<br />case 1:<br />{<br />// create a square<br />_boxDef = new b2PolygonDef();<br />_boxDef.SetAsBox(_xScale, _xScale);<br />_boxDef.friction = 0.5;<br />_boxDef.density = 1.0;<br />_boxDef.restitution = 0.2;</p><p>_bodyDef.userData = new CSquare();<br />_bodyDef.userData.width = _xScale * 2 * 30;<br />_bodyDef.userData.height = _xScale * 2 * 30;</p><p>_body = _b2World.CreateBody(_bodyDef);<br />_body.CreateShape(_boxDef);<br />break;<br />}<br />case 2:<br />{<br />// create a rectangle<br />_boxDef = new b2PolygonDef();<br />_boxDef.SetAsBox(_xScale, _yScale);<br />_boxDef.friction = 0.5;<br />_boxDef.density = 1.0;<br />_boxDef.restitution = 0.2;</p><p>_bodyDef.userData = new CRectangle();<br />_bodyDef.userData.width = _xScale * 2 * 30;<br />_bodyDef.userData.height = _yScale * 2 * 30;</p><p>_body = _b2World.CreateBody(_bodyDef);<br />_body.CreateShape(_boxDef);<br />break;<br />}<br />default:<br />{<br />trace("No Boby can be created!!!");<br />}<br />}</p><p>_body.SetMassFromShapes();<br />this.addChild(_bodyDef.userData);<br />}<br />}</p><p>private function OnMainEnterFrame(evt:Event = null):void<br />{<br />this._b2World.Step(this._b2TimerStep, this._b2Interations);</p><p>for (var bb:b2Body = this._b2World.m_bodyList; bb; bb = bb.GetNext())<br />{<br />if (bb.m_userData is Sprite)<br />{<br />bb.m_userData.x = bb.GetPosition().x * 30;<br />bb.m_userData.y = bb.GetPosition().y * 30;<br />bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI);<br />}<br />}<br />}</p><p>}</p><p>}

 

不好意思啊,fla檔案是沒法上傳了。運行如下:

 

BTW:不是很喜歡Box2DFlash的源碼編碼風格,特別是變數都放在最後定義。變數的名字很像C++的風格,嘿嘿,還沒正式開始研究源碼,不是很多的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.