Created
April 18, 2014 12:30
-
-
Save Tom-Ski/11041644 to your computer and use it in GitHub Desktop.
Box2d Application
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package me.tomski.blobrun.desktop; | |
import com.badlogic.gdx.ApplicationListener; | |
import com.badlogic.gdx.Gdx; | |
import com.badlogic.gdx.InputProcessor; | |
import com.badlogic.gdx.backends.lwjgl.LwjglApplication; | |
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration; | |
import com.badlogic.gdx.graphics.GL20; | |
import com.badlogic.gdx.graphics.OrthographicCamera; | |
import com.badlogic.gdx.math.Vector2; | |
import com.badlogic.gdx.math.Vector3; | |
import com.badlogic.gdx.physics.box2d.*; | |
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType; | |
import com.badlogic.gdx.physics.box2d.joints.MouseJoint; | |
import com.badlogic.gdx.physics.box2d.joints.MouseJointDef; | |
import com.badlogic.gdx.physics.box2d.joints.WeldJointDef; | |
import com.badlogic.gdx.utils.Array; | |
import com.badlogic.gdx.utils.TimeUtils; | |
/** | |
* Created by Tom on 15/04/14. | |
*/ | |
public class WeldTest { | |
public static void main(String[] args) { | |
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration(); | |
config.width = 1280; | |
config.height = 720; | |
config.foregroundFPS = 60; | |
config.backgroundFPS = 60; | |
config.fullscreen = false; | |
config.vSyncEnabled = true; | |
config.resizable = false; | |
new LwjglApplication(new WeldTestDemo()); | |
} | |
static class WeldTestDemo implements ApplicationListener, InputProcessor, ContactListener { | |
World world; | |
OrthographicCamera camera; | |
Box2DDebugRenderer renderer; | |
MouseJoint mouseJoint = null; | |
Body hitBody = null; | |
Body groundBody; | |
long lastCreate = 0; | |
Contact createContact = null; | |
Array<Fixture> nudgeFixtures = new Array<Fixture>(); | |
@Override | |
public void create() { | |
world = new World(new Vector2(0, -10), false); | |
world.setContactListener(this); | |
camera = new OrthographicCamera(40, 22.5f); | |
camera.position.set(20, 11.25f, 0); | |
camera.update(); | |
renderer = new Box2DDebugRenderer(); | |
Body bodyOne = createBody(); | |
Body bodyTwo = createBody(); | |
Body kin = createKinematicBody(); | |
bodyOne.setTransform(10, 10, 0); | |
bodyTwo.setTransform(10, 13, 0); | |
kin.setTransform(20,10,0); | |
kin.setAngularVelocity(0.5f); | |
WeldJointDef jointDef = new WeldJointDef(); | |
jointDef.initialize(bodyOne, bodyTwo, bodyTwo.getWorldCenter()); | |
jointDef.collideConnected = false; | |
world.createJoint(jointDef); | |
PolygonShape groundPoly = new PolygonShape(); | |
groundPoly.setAsBox(50, 1); | |
BodyDef groundBodyDef = new BodyDef(); | |
groundBodyDef.type = BodyType.StaticBody; | |
groundBodyDef.position.set(0, 0); | |
groundBody = world.createBody(groundBodyDef); | |
FixtureDef fixtureDef = new FixtureDef(); | |
fixtureDef.shape = groundPoly; | |
fixtureDef.filter.groupIndex = 0; | |
groundBody.createFixture(fixtureDef); | |
groundPoly.dispose(); | |
Gdx.input.setInputProcessor(this); | |
} | |
private Body createBody() { | |
BodyDef def = new BodyDef(); | |
def.type = BodyType.DynamicBody; | |
PolygonShape shape = new PolygonShape(); | |
shape.setAsBox(1, 1); | |
Body b = world.createBody(def); | |
FixtureDef fDef = new FixtureDef(); | |
fDef.shape = shape; | |
fDef.density = 0.2f; | |
fDef.friction = 0.2f; | |
fDef.restitution = 0.5f; | |
b.createFixture(fDef); | |
shape.dispose(); | |
return b; | |
} | |
private Body createKinematicBody() { | |
BodyDef def = new BodyDef(); | |
def.type = BodyType.KinematicBody; | |
PolygonShape shape = new PolygonShape(); | |
shape.setAsBox(3, 3); | |
Body b = world.createBody(def); | |
FixtureDef fDef = new FixtureDef(); | |
fDef.shape = shape; | |
fDef.density = 15f; | |
fDef.friction = 0.2f; | |
fDef.restitution = 0.5f; | |
Fixture f = b.createFixture(fDef); | |
f.setUserData("k"); | |
shape.dispose(); | |
return b; | |
} | |
private void createFallingBody() { | |
BodyDef def = new BodyDef(); | |
def.type = BodyType.DynamicBody; | |
CircleShape shape = new CircleShape(); | |
shape.setRadius(1); | |
Body b = world.createBody(def); | |
FixtureDef fDef = new FixtureDef(); | |
fDef.shape = shape; | |
fDef.density = 0.9f; | |
fDef.friction = 0.2f; | |
fDef.restitution = 0.5f; | |
Fixture f = b.createFixture(fDef); | |
f.setUserData("d"); | |
shape.setRadius( shape.getRadius() * 2.0f); | |
fDef.shape = shape; | |
fDef.density = 0.1f; | |
//fDef.isSensor = false; | |
Fixture outer = b.createFixture(fDef); | |
outer.setUserData("o"); | |
shape.dispose(); | |
b.setTransform(20, 50, 0); | |
} | |
public void createWeldJointFromContact() { | |
System.out.println("A: " + createContact.getFixtureA().getUserData() + " B: " + createContact.getFixtureB().getUserData()); | |
Array<Fixture> bFixtures = createContact.getFixtureB().getBody().getFixtureList(); | |
for (int iB = 0; iB < bFixtures.size; iB++) { | |
System.out.println("\t" + iB + " name: " + bFixtures.get(iB).getUserData()); | |
} | |
WeldJointDef jointDef = new WeldJointDef(); | |
jointDef.initialize(createContact.getFixtureA().getBody(), createContact.getFixtureB().getBody(), createContact.getFixtureB().getBody().getWorldCenter()); | |
jointDef.collideConnected = true; | |
world.createJoint(jointDef); | |
//nudgeFixtures.add(create) | |
createContact = null; | |
} | |
@Override | |
public void resize(int width, int height) { | |
} | |
@Override | |
public void render() { | |
Gdx.gl.glClearColor(0.05f, 0.05f, 0.05f, 1f); | |
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); | |
world.step(1 / 30f, 6, 2); | |
renderer.render(world, camera.combined); | |
if (TimeUtils.millis() - lastCreate > 1000) { | |
createFallingBody(); | |
lastCreate = TimeUtils.millis(); | |
} | |
if (createContact != null) { | |
createWeldJointFromContact(); | |
} | |
} | |
@Override | |
public void pause() { | |
} | |
@Override | |
public void resume() { | |
} | |
@Override | |
public void dispose() { | |
} | |
@Override | |
public boolean keyDown(int keycode) { | |
return false; | |
} | |
@Override | |
public boolean keyUp(int keycode) { | |
return false; | |
} | |
@Override | |
public boolean keyTyped(char character) { | |
return false; | |
} | |
Vector3 testPoint = new Vector3(); | |
QueryCallback callback = new QueryCallback() { | |
@Override | |
public boolean reportFixture(Fixture fixture) { | |
if (fixture.getBody() == groundBody) return true; | |
if (fixture.testPoint(testPoint.x, testPoint.y)) { | |
hitBody = fixture.getBody(); | |
return false; | |
} else | |
return true; | |
} | |
}; | |
@Override | |
public boolean touchDown(int x, int y, int pointer, int newParam) { | |
testPoint.set(x, y, 0); | |
camera.unproject(testPoint); | |
hitBody = null; | |
world.QueryAABB(callback, testPoint.x - 0.1f, testPoint.y - 0.1f, testPoint.x + 0.1f, testPoint.y + 0.1f); | |
if (hitBody != null) { | |
MouseJointDef def = new MouseJointDef(); | |
def.bodyA = groundBody; | |
def.bodyB = hitBody; | |
def.collideConnected = true; | |
def.target.set(testPoint.x, testPoint.y); | |
def.maxForce = 1000.0f * hitBody.getMass(); | |
mouseJoint = (MouseJoint) world.createJoint(def); | |
hitBody.setAwake(true); | |
} | |
return false; | |
} | |
Vector2 target = new Vector2(); | |
@Override | |
public boolean touchDragged(int x, int y, int pointer) { | |
if (mouseJoint != null) { | |
camera.unproject(testPoint.set(x, y, 0)); | |
mouseJoint.setTarget(target.set(testPoint.x, testPoint.y)); | |
} | |
return false; | |
} | |
@Override | |
public boolean touchUp(int x, int y, int pointer, int button) { | |
if (mouseJoint != null) { | |
world.destroyJoint(mouseJoint); | |
mouseJoint = null; | |
} | |
return false; | |
} | |
@Override | |
public boolean mouseMoved(int screenX, int screenY) { | |
return false; | |
} | |
@Override | |
public boolean scrolled(int amount) { | |
return false; | |
} | |
@Override | |
public void beginContact(Contact contact) { | |
if (contact.isEnabled()) { | |
if ( (contact.getFixtureA().getUserData() != null && contact.getFixtureA().getUserData().equals("k")) || | |
(contact.getFixtureB().getUserData() != null && contact.getFixtureB().getUserData().equals("k")) ) { | |
createContact = contact; | |
} | |
} | |
} | |
@Override | |
public void endContact(Contact contact) { | |
// TODO Auto-generated method stub | |
} | |
@Override | |
public void preSolve(Contact contact, Manifold oldManifold) { | |
if ( (contact.getFixtureA().getUserData() != null && contact.getFixtureA().getUserData().equals("o")) || | |
(contact.getFixtureB().getUserData() != null && contact.getFixtureB().getUserData().equals("o")) | |
) { | |
//System.out.println("disabling outer"); | |
contact.setEnabled(false); | |
} | |
} | |
@Override | |
public void postSolve(Contact contact, ContactImpulse impulse) { | |
// TODO Auto-generated method stub | |
} | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment