Box2D關節-鼠標關節(鼠標聯合)

咱們能夠經過鼠標聯合點擊、操做世界裏面的剛體。鼠標聯合的原理是當鼠標點擊剛體時,給隱藏的一個鼠標Sprite(位置和當前鼠標相同)和點擊的剛體建立一根聯合線(Joint Line),該聯合線的特色是剛體會沿着聯合線運動,而鼠標的移動就是改變聯合線。ide

鼠標點擊剛體獲取所選剛體的步驟:函數

  • 1.獲取鼠標在物理世界中的座標
  • var mouseXWorldPhys:Number = mouseX / worldScale;
    var mouseYWolrdPhys:Number = mouseY / worldScale;

  • 2.將鼠標的座標存放到一個鼠標向量
  • var mousePVec2:b2Vec2 = new b2Vec2();
    mousePVec2.Set(mouseXWorldPhys,mouseYWorldPhys);

         或者spa

var mousePVec2:b2Vec2 = new b2Vec2(mouseXWorldPhys,mouseYWorldPhys);

  • 3.建立一個包圍盒,很小很小,小到能夠認爲能夠是一個點。經過這個包圍盒去獲取世界中的剛體。
  • var aabb:b2AABB = new b2AABB();
    aabb.lowerBound.Set(mouseXWorldPhys-0.001,mouseYWorldPhys-0.001);
    aabb.upperBound.Set(mouseXWorldPhys+0.001,mouseYWorldPhys+0.001);

  • 4.使用世界的QueryAABB方法。該方法有兩個參數:(1)回調函數;(2)包圍盒AABB的實例,如第三步的包圍盒aabb。該方法用於查詢世界中處於包圍盒內部的全部b2Fixture,回調函數的參數必須是b2Fixture,返回值類型會Boolean,如function callBack(fixture:b2Fixture):Boolean。當返回值爲true時,從新調用該回調函數,直到返回值爲false,即當點擊處於動態剛體內部時候。
  • /**Query the world for all fixtures that potentially overlap the provided AABB.
    */
                                                    
    //Parameters
    //callback:Function — a user implemented callback class. It should match signature function //Callback(fixture:b2Fixture):Boolean Return true to continue to the next fixture.
                                                     
    //aabb:b2AABB — the query box.

  • 5.在回調函數中進行判斷點碰撞檢測。若是fixture.GetBody( ).GetTransform( )與鼠標向量碰撞,則認爲鼠標點擊了該剛體。(從另外一個角度理解:鼠標向量點處於剛體內部中)

核心代碼以下:code

private function GetBodyAtMouse(includeStatic:Boolean = false):b2Body { mousePVec2.Set(mouseXWorldPhys, mouseYWorldPhys); var aabb:b2AABB = new b2AABB(); aabb.lowerBound.Set(mouseXWorldPhys - 0.001, mouseYWorldPhys - 0.001); aabb.upperBound.Set(mouseXWorldPhys + 0.001, mouseYWorldPhys + 0.001); var body:b2Body; function getBodyCallback(fixture:b2Fixture):Boolean { var shape:b2Shape = fixture.GetShape(); if (fixture.GetBody().GetType() != b2Body.b2_staticBody||includeStatic) { var inside:Boolean = shape.TestPoint(fixture.GetBody().GetTransform(), mousePVec2); if (inside) { body = fixture.GetBody(); return false; } } return true; } world.QueryAABB(getBodyCallback, aabb); return body; }
相關文章
相關標籤/搜索