package info.u250.c2d.tests.box2d; import info.u250.c2d.box2d.Box2dObject; import info.u250.c2d.box2d.DefaultBuilder; import info.u250.c2d.box2d.IOXml; import info.u250.c2d.box2d.MouseJointInput; import info.u250.c2d.box2d.PolygonActor; import info.u250.c2d.box2d.model.b2BodyDefModel; import info.u250.c2d.box2d.model.b2FixtureDefModel; import info.u250.c2d.box2d.model.b2Scene; import info.u250.c2d.box2d.model.fixture.b2CircleFixtureDefModel; import info.u250.c2d.box2d.model.fixture.b2PolygonFixtureDefModel; import info.u250.c2d.box2d.model.fixture.b2RectangleFixtureDefModel; import info.u250.c2d.engine.Engine; import info.u250.c2d.engine.EngineDrive; import info.u250.c2d.engine.SceneStage; import info.u250.c2d.engine.resources.AliasResourceManager; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Random; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.InputProcessor; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer; import com.badlogic.gdx.physics.box2d.World; import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.ui.Image; public class BaseBox2d extends Engine { String file ; public BaseBox2d(String file){ this.file = file; } Random random = new Random(); private List<PolygonActor> meshs = new ArrayList<PolygonActor>(); World world ; private Box2DDebugRenderer box2dRender ; MouseJointInput input; @Override protected EngineDrive onSetupEngineDrive() { return new EngineX(); } @Override public void dispose () { for(PolygonActor actor:meshs){ actor.dispose(); } if(world!=null){ world.dispose(); } super.dispose(); } private class EngineX implements EngineDrive{ @Override public void onResourcesRegister(AliasResourceManager<String> reg) { reg.texture("Polygon", "data/textures/default.png"); reg.texture("Circle", "data/box2d/circle.png"); reg.texture("Box", "data/box2d/box.png"); } @Override public void dispose() {} @Override public EngineOptions onSetupEngine() { final EngineOptions opt = new EngineOptions(new String[]{"data/box2d/circle.png","data/box2d/box.png","data/textures/default.png"},1280,720); return opt; } @Override public void onLoadedResourcesCompleted() { try { world = new World(new Vector2(0,-9.8f), false); box2dRender = new Box2DDebugRenderer(); b2Scene model = IOXml.parse(Gdx.files.internal(file)); DefaultBuilder.buildAll(world, model); input = new MouseJointInput(); input.setWorld(world); input.setFixBody(model.bodyDefModels.iterator().next().body); SceneStage stage = new SceneStage(){ @Override public void update(float delta) { world.step(delta, 3, 3); super.update(delta); } @Override public void render(float delta) { super.render(delta); box2dRender.render(world, Engine.getDefaultCamera().combined.scl(Box2dObject.RADIO)); } @Override public InputProcessor getInputProcessor() { return input; } }; setup(model, stage); Engine.setMainScene(stage); } catch (IOException e) { e.printStackTrace(); } } } Color generateColor() { final int threshold = 250; int r1, g1, b1; while (true) { r1 = random.nextInt(256); g1 = random.nextInt(256); b1 = random.nextInt(256); if (r1+g1+b1 > threshold) break; } Color c = new Color(r1/255f, g1/255f, b1/255f,1); return c; } void setup(b2Scene model,Stage stage){ for(b2BodyDefModel b2Body:model.bodyDefModels){ Box2dObject obj = new Box2dObject(b2Body); for(b2FixtureDefModel b2Def:b2Body.fixtures){ if(b2Def instanceof b2CircleFixtureDefModel){ b2CircleFixtureDefModel tmp = (b2CircleFixtureDefModel)b2Def; Image image = new Image(new TextureRegion(Engine.resource("Circle",Texture.class))); image.setSize(tmp.radius*2, tmp.radius*2); image.setOrigin(tmp.radius, tmp.radius); image.setPosition(b2Body.drawableOffsetX-tmp.radius, b2Body.drawableOffsetY-tmp.radius); image.setColor(generateColor()); obj.addActor(image); }else if(b2Def instanceof b2RectangleFixtureDefModel){ b2RectangleFixtureDefModel tmp = (b2RectangleFixtureDefModel)b2Def; Image image = new Image(new TextureRegion(Engine.resource("Box",Texture.class))); image.setSize(tmp.width, tmp.height); image.setOrigin(tmp.width/2, tmp.height/2); image.setPosition(b2Body.drawableOffsetX-tmp.width/2, b2Body.drawableOffsetY-tmp.height/2); image.setColor(generateColor()); obj.addActor(image); }else if(b2Def instanceof b2PolygonFixtureDefModel){ b2PolygonFixtureDefModel tmp = (b2PolygonFixtureDefModel)b2Def; Vector2 lower = new Vector2(); Vector2 upper = new Vector2(); for(Vector2[] vv:tmp.vertices){ for(Vector2 v:vv){ lower.x = Math.min(lower.x, v.x); lower.y = Math.min(lower.y, v.y); upper.x = Math.max(upper.x, v.x); upper.y = Math.max(upper.y, v.y); } } PolygonActor actor = new PolygonActor(Engine.resource("Polygon",Texture.class), tmp.vertices,b2Body.drawableOffsetX,b2Body.drawableOffsetY); actor.setPosition(b2Body.drawableOffsetX-lower.x,b2Body.drawableOffsetY-lower.y); obj.addActor(actor); meshs.add(actor); } } stage.addActor(obj); } } }