Box2d是一個很出名的2d物理引擎,有C++、Java等等版本。libgdx對Box2D進行了很高效的封裝,極大的降低了學習和使用成本。
但是我覺得和Libgdx的UI庫比起來,Box2D的使用始終比較複雜,單純的物體降落什麼的還好說,要是遇上一個特別複雜的物體,有時候就有點繁瑣了。
在網上遊盪時發現了physics-body-editor,絕對堪稱神器。
physics-body-editor
項目首頁:http://code.google.com/p/box2d-editor/
複雜物件的建立只需要用滑鼠點點就行了。
工具可以到處Json格式的檔案,還可以用於其他環境中。
對於Libgdx而言,該項目有一個專門的loader可供使用。
第一個小瓶子
我想了半天都沒有找到一個合適的例子可以用做示範,乾脆就用官方提供了那個瓶子的圖片做示範。
啟動編輯器,建立一個項目,匯入我們要的圖片。
點點滑鼠把邊描繪出來。
編輯器還可以進行測試,點擊滑鼠拖動就可以出現不同大小和速度的小球。
儲存項目,你可以獲得一個Json格式的檔案。
將壓縮包中的loader引入項目。
使用
BodyEditorLoader loader = new BodyEditorLoader(Gdx.files.internal("box2d/b.json"));
讀入設定檔。然後建立一個動態對象:
BodyDef bd = new BodyDef();bd.type = BodyType.DynamicBody;
指定密度等等
FixtureDef fd = new FixtureDef();fd.density = 1;fd.friction = 0.5f;fd.restitution = 0.3f;
建立Body
bottleModel = world.createBody(bd);
使用loader建立細節
loader.attachFixture(bottleModel, "p", fd, BOTTLE_WIDTH);bottleModelOrigin = loader.getOrigin("p", BOTTLE_WIDTH).cpy();
其中的那個“p”是我的圖片的名稱,大家根據自己的情況更改。
為了方便測試,我們建立幾個小球。
BodyDef ballBodyDef = new BodyDef();ballBodyDef.type = BodyType.DynamicBody;CircleShape shape = new CircleShape();shape.setRadius(0.15f);FixtureDef fd = new FixtureDef();fd.density = 1;fd.friction = 0.5f;fd.restitution = 0.5f;fd.shape = shape;ballModels = new Body[100];for (int i=0; i<100; i++) {ballModels[i] = world.createBody(ballBodyDef);ballModels[i].createFixture(fd);}
小球的半徑為0.15f,一共100個。
繪製的時候通過
bottleModel.getPosition().sub(bottleModelOrigin)
擷取座標,賦給對象。
效果:
physics-body-editor到底產生了什麼
physics-body-editor最後匯出的是一個Json格式的檔案。找一個Json查看器看看。
可以看到,萬變不離其宗。產生的Json檔案其實記錄下了每一個點的座標,在Loader讀入的時候進行轉換和聲明。
具體可以參考一下Libgdx的Loader,根據其思路可以將這個工具用到其他語言和環境中去。
寫在最後
如果想在Stage中使用的話要注意相機的處理。同時不要把Stage的大小和World中的大小混為一談,最好有一個轉換比例。一般10~100。
最後附上用到的兩張圖:
資源來自:http://www.aurelienribon.com