繼上一篇我們簡單的試範了如何在Box2D的world建立可動及固定的物件
並利用Box2d內建的Debug用的Shape在晝面上顯了結果
在實務上不會是只用那些簡單的形狀就要發佈實作品
這一篇我們來說明如何把設計的圖連結及Box2D的物件
前一篇我們為了簡化Box2D的基本結構未加上任何的使用者操作
這一篇我們加個Space按鈕,按一下我們就增加一個動態的物件(請先focus在flash上)
先來看一下成果(圖片未做去背處理)
繼上一篇我們簡單的試範了如何在Box2D的world建立可動及固定的物件
並利用Box2d內建的Debug用的Shape在晝面上顯了結果
在實務上不會是只用那些簡單的形狀就要發佈實作品
這一篇我們來說明如何把設計的圖連結及Box2D的物件
前一篇我們為了簡化Box2D的基本結構未加上任何的使用者操作
這一篇我們加個Space按鈕,按一下我們就增加一個動態的物件(請先focus在flash上)
先來看一下成果(圖片未做去背處理)
使用BOX2D由於網上看到很多範例
若沒有促一說明,確實有點點感到複雜
這些說明應該適用於各種不同的版本
那初始主要分為二個部份
其實初始大概這麼做就夠了,大部份範例主要是使用其內建的繪圖,才會需要第三步驟,實際作業只需要前二步
不過若是只做了前二步,在畫面上是不會有任何,東西在動的,我們先來看一下程式
1: package2: {3: import Box2D.Common.Math.b2Vec2;4: import Box2D.Dynamics.b2World;5: import Box2D.Dynamics.b2DebugDraw;6:7: import flash.display.Sprite;8: import flash.events.Event;9:10: public class Initialization extends Sprite11: {12: private var _world:b2World;13: private var scale:uint=30;14:15: public function Initialization()16: {17: super();18: this.addEventListener(Event.ENTER_FRAME, function():void19: {20: _world.Step(1 / 30, 10, 10);21: _world.ClearForces();22: _world.DrawDebugData();23: });24:25: this._world=new b2World(new b2Vec2(0, -30), true);26:27:28: var dbgDraw:b2DebugDraw=new b2DebugDraw();29:30: dbgDraw=new b2DebugDraw();31: dbgDraw.SetSprite(this);32: dbgDraw.SetDrawScale(30.0);33: dbgDraw.SetFillAlpha(0.5);34: dbgDraw.SetLineThickness(1.0);35: dbgDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit);36:37: _world.SetDebugDraw(dbgDraw);38: }39: }40: }41:
以上程式算是對物理引擎設置好了基本環境,目前還未加上在世界裡的物件,所以執行時,不會看到任何東西,
物理引擎做的事是在協助我們在畫面上的物作可以做些實際的物理運動,所以當我們做運作時,是會由一些非可視物件關連到
我們的可視物件去做運動的,當我們還沒關連到畫面上的可視物件時,我們就可以先利用DebugDraw(line 28~37)來測試我們希望物理引擎幫我達到的效果(目前試了二個物理引擎,基本都是這樣設計的)
其中28~37為輔助在還未放上所以設計的圖片或DisplayObject時所用的內建繪圖,在整體完成作單時建議是要拿掉的
下個部份我們再來加上一些可運動物件或加一些固定的運件吧
2011/07/26 updated
接下來的後續篇及以上所使用的Lib是使用 Box2D 2.0 版的
為了有網友提到可能使用不相同的版本,造成某些資料不同,故提供flex所建的 liberary project及swc給有需的人下載
基於上一個拆解 APE的DEMO中
右上角的小搖桿,把其想法做了一個 輪子(Wheel)及在上面釘一些點(pin)
並希望這些點可碰撞到一個針 讓這個針可在 被點碰撞到的情況做的小擺動
我們先做一個 由於這些點及輪子會一起連動所以使用了 Composite來把這些解構結合
程式如下:
1: package comp2: {3: import org.cove.ape.*;4:5: import ui.*;6:7: public class Wheel extends Composite8: {9: public function Wheel()10: {11: super();12:13: var wheel:WheelParticle=new WheelParticle(100, 100, 20, true);14: var myWheel:ui.MyWheel;15: wheel.setDisplay(myWheel=new ui.MyWheel());16: wheel.alwaysRepaint=true;17: //wheel.angularVelocity=0.0001;18: //圓轉 結合的釘子不會動19:20: this.addParticle(wheel);21:22: var rCount:uint=0;23: var number:uint=10;24: var r:uint=360 / number;25: for (var i:uint=0; i < number; i++)26: {27: var X2:uint=Math.cos(rCount / 180 * Math.PI) * 80 + 100;28: var Y2:uint=Math.sin(rCount / 180 * Math.PI) * 80 + 100;29:30: rCount+=r;31:32: var pin:CircleParticle=new CircleParticle(X2, Y2, 2, true);33: pin.setDisplay(new ui.Pin());34: pin.alwaysRepaint=true;35: this.addParticle(pin);36: }37: }38: }39: }40:
Line 13~16:使用WheelParticle製作一個 輪子並由flash中指定一個 MovieClip給這個Particle
Line 22~36:在輪子上增加點(pin),目前增加20個點,使用三角涵數環繞擺放,並將flash中的MovieClip指定給各個點
以上即完成我們要的輪子
接著我們要在主場景上,放上一個針,這個針會由一個圓粒子去挓住這個針,讓它不會被地心引力帶著往下掉
1: //needle start2: var point1:CircleParticle=new CircleParticle(100, 180, 2);3:4: group2.addParticle(point1);5:6: var point2:CircleParticle=new CircleParticle(100, 220, 1, true);7:8: group2.addParticle(point2);9:10: var line:SpringConstraint=new SpringConstraint(point1, point2, 1, false, 0);11: line.setDisplay(new ui.MyNeedle());12: group2.addConstraint(line);13: //needle end14:15:16:17: //Drag line start18: var point_left:CircleParticle=new CircleParticle(100, 165, 0, true);19:20: group2.addParticle(point_left);21:22: var line_left:SpringConstraint=new SpringConstraint(point1, point_left, 0.01, true, 1);23:24: line_left.restLength=2;25: group2.addConstraint(line_left);26: //Drag line end
line 2~12為主要的針的解構
line 18~25為挓住針的解構(座標會在針的正上方)
1: package2: {3: import comp.Wheel;4:5: import flash.display.Sprite;6: import flash.events.Event;7:8: import org.cove.ape.*;9:10: import ui.*;11:12: public class MyWheel extends Sprite13: {14: private var wheel:comp.Wheel;15:16: public function MyWheel()17: {18: super();19: this.addEventListener(Event.ENTER_FRAME, run);20: APEngine.init(1 / 4);21: APEngine.container=this;22: APEngine.addForce(new org.cove.ape.Vector(0, 2));23:24: var groupWheel:Group=new Group();25: groupWheel.collideInternal=true;26:27: wheel=new comp.Wheel();28:29: groupWheel.addComposite(wheel);30:31:32: var groupNeedle:Group=new Group();33: groupNeedle.collideInternal=true;34:35:36: //needle start37: var point1:CircleParticle=new CircleParticle(100, 180, 2);38: point1.visible=false;39: groupNeedle.addParticle(point1);40:41: var point2:CircleParticle=new CircleParticle(100, 220, 1, true);42: point2.visible=false;43: groupNeedle.addParticle(point2);44:45: var line:SpringConstraint=new SpringConstraint(point1, point2, 1, false, 0);46: line.setDisplay(new ui.MyNeedle());47: groupNeedle.addConstraint(line);48: //needle end49:50:51:52: //Drag line start53: var point_left:CircleParticle=new CircleParticle(100, 165, 0, true);54: point_left.visible=false;55: groupNeedle.addParticle(point_left);56:57: var line_left:SpringConstraint=new SpringConstraint(point1, point_left, 0.01, true, 1);58: line_left.visible=false;59: line_left.restLength=2;60: groupNeedle.addConstraint(line_left);61: //Drag line end62:63: APEngine.addGroup(groupWheel);64: APEngine.addGroup(groupNeedle);65:66: groupWheel.addCollidable(groupNeedle);67: }68:69: private function run(event:Event):void70: {71: APEngine.step();72: APEngine.paint();73: wheel.rotateByRadian(0.02, new org.cove.ape.Vector(100, 100));74: }75: }76: }77:
line 24~29 接下來 把我們做的輪子放上 (groupWheel)
line 32~60 針及拖曳線拼起來(groupNeedle)
line 60 這二個不同的Group知道彼此的存在做碰撞(Collision detection)
line 73 不停的轉動輪子
P.S Collision detection only apply for praticle