diff options
Diffstat (limited to 'core/src/org/snoopdesigns/endless/physics')
8 files changed, 363 insertions, 0 deletions
diff --git a/core/src/org/snoopdesigns/endless/physics/Box2DDebugRenderer.java b/core/src/org/snoopdesigns/endless/physics/Box2DDebugRenderer.java new file mode 100644 index 0000000..15f930f --- /dev/null +++ b/core/src/org/snoopdesigns/endless/physics/Box2DDebugRenderer.java @@ -0,0 +1,28 @@ +package org.snoopdesigns.endless.physics; + +import org.snoopdesigns.endless.context.Context; +import org.snoopdesigns.endless.renderer.Renderer; + +public class Box2DDebugRenderer implements Renderer { + +    private com.badlogic.gdx.physics.box2d.Box2DDebugRenderer debugRenderer; + +    @Override +    public void create() { +        debugRenderer = new com.badlogic.gdx.physics.box2d.Box2DDebugRenderer(); +        debugRenderer.setDrawBodies(true); +        debugRenderer.setDrawVelocities(true); +        debugRenderer.setDrawAABBs(true); +    } + +    @Override +    public void render() { +        debugRenderer.render( +                Context.getInstance().getWorldContext().getWorld(), +                Context.getInstance().getCameraContext().getCameraProjection()); +    } + +    @Override +    public void dispose() { +    } +} diff --git a/core/src/org/snoopdesigns/endless/physics/Box2DLocation.java b/core/src/org/snoopdesigns/endless/physics/Box2DLocation.java new file mode 100644 index 0000000..338b595 --- /dev/null +++ b/core/src/org/snoopdesigns/endless/physics/Box2DLocation.java @@ -0,0 +1,46 @@ +package org.snoopdesigns.endless.physics; + +import com.badlogic.gdx.ai.utils.Location; +import com.badlogic.gdx.math.Vector2; + +public class Box2DLocation implements Location<Vector2> { +    Vector2 position; +    float orientation; + +    public Box2DLocation () { +        this.position = new Vector2(); +        this.orientation = 0; +    } + +    @Override +    public Vector2 getPosition () { +        return position; +    } + +    @Override +    public float getOrientation () { +        return orientation; +    } + +    @Override +    public void setOrientation (float orientation) { +        this.orientation = orientation; +    } + +    @Override +    public Location<Vector2> newLocation () { +        return new Box2DLocation(); +    } + +    @Override +    public float vectorToAngle (Vector2 vector) { +        return (float)Math.atan2(-vector.x, vector.y); +    } + +    @Override +    public Vector2 angleToVector (Vector2 outVector, float angle) { +        outVector.x = -(float)Math.sin(angle); +        outVector.y = (float)Math.cos(angle); +        return outVector; +    } +} diff --git a/core/src/org/snoopdesigns/endless/physics/Box2DRenderer.java b/core/src/org/snoopdesigns/endless/physics/Box2DRenderer.java new file mode 100644 index 0000000..641e397 --- /dev/null +++ b/core/src/org/snoopdesigns/endless/physics/Box2DRenderer.java @@ -0,0 +1,22 @@ +package org.snoopdesigns.endless.physics; + +import com.badlogic.gdx.physics.box2d.Box2D; +import org.snoopdesigns.endless.context.Context; +import org.snoopdesigns.endless.renderer.Renderer; + +public class Box2DRenderer implements Renderer { + +    @Override +    public void create() { +        Box2D.init(); +    } + +    @Override +    public void render() { +        Context.getInstance().getWorldContext().getWorld().step(1/60f, 6, 2); +    } + +    @Override +    public void dispose() { +    } +} diff --git a/core/src/org/snoopdesigns/endless/physics/PhysicalBody.java b/core/src/org/snoopdesigns/endless/physics/PhysicalBody.java new file mode 100644 index 0000000..23ede8d --- /dev/null +++ b/core/src/org/snoopdesigns/endless/physics/PhysicalBody.java @@ -0,0 +1,32 @@ +package org.snoopdesigns.endless.physics; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.Body; +import com.badlogic.gdx.physics.box2d.BodyDef; +import com.badlogic.gdx.physics.box2d.BodyDef.BodyType; +import com.badlogic.gdx.physics.box2d.FixtureDef; +import org.snoopdesigns.endless.context.Context; + +public abstract class PhysicalBody { + +    Body body; + +    public abstract BodyType getBodyType(); +    public abstract FixtureDef getFixture(); + +    public Vector2 getInitialPosition() { +        return new Vector2(0, 0); +    } + +    public void initBody() { +        final BodyDef bodyDef = new BodyDef(); +        bodyDef.type = getBodyType(); +        bodyDef.position.set(getInitialPosition()); +        body = Context.getInstance().getWorldContext().getWorld().createBody(bodyDef); +        body.createFixture(getFixture()); +    } + +    public Body getBody() { +        return body; +    } +} diff --git a/core/src/org/snoopdesigns/endless/physics/SteerablePhysicalBody.java b/core/src/org/snoopdesigns/endless/physics/SteerablePhysicalBody.java new file mode 100644 index 0000000..9e9a85c --- /dev/null +++ b/core/src/org/snoopdesigns/endless/physics/SteerablePhysicalBody.java @@ -0,0 +1,115 @@ +package org.snoopdesigns.endless.physics; + +import com.badlogic.gdx.ai.steer.Steerable; +import com.badlogic.gdx.ai.utils.Location; +import com.badlogic.gdx.math.Vector2; + +public abstract class SteerablePhysicalBody extends PhysicalBody implements Steerable<Vector2> { + +    public abstract float getMaxSpeed(); +    public abstract float getMaxAcceleration(); +    public abstract float getMaxRotationSpeed(); +    public abstract float getMaxRotationAcceleration(); + +    @Override +    public Vector2 getLinearVelocity() { +        return getBody().getLinearVelocity(); +    } + +    @Override +    public float getAngularVelocity() { +        return getBody().getAngularVelocity(); +    } + +    @Override +    public float getBoundingRadius() { +        return 0.001f; +    } + +    @Override +    public boolean isTagged() { +        return false; +    } + +    @Override +    public void setTagged(boolean tagged) { +    } + +    @Override +    public float getZeroLinearSpeedThreshold() { +        return 0.1f; +    } + +    @Override +    public void setZeroLinearSpeedThreshold(float value) { +    } + +    @Override +    public float getMaxLinearSpeed() { +        return getMaxSpeed(); +    } + +    @Override +    public void setMaxLinearSpeed(float maxLinearSpeed) { +    } + +    @Override +    public float getMaxLinearAcceleration() { +        return getMaxAcceleration(); +    } + +    @Override +    public void setMaxLinearAcceleration(float maxLinearAcceleration) { +    } + +    @Override +    public float getMaxAngularSpeed() { +        return getMaxRotationSpeed(); +    } + +    @Override +    public void setMaxAngularSpeed(float maxAngularSpeed) { +    } + +    @Override +    public float getMaxAngularAcceleration() { +        return getMaxRotationAcceleration(); +    } + +    @Override +    public void setMaxAngularAcceleration(float maxAngularAcceleration) { +    } + +    @Override +    public Vector2 getPosition() { +        return getBody().getPosition(); +    } + +    @Override +    public float getOrientation() { +        return getBody().getAngle(); +    } + +    @Override +    public void setOrientation(float orientation) { +        getBody().setTransform(getPosition(), orientation); +    } + +    @Override +    public float vectorToAngle(Vector2 vector) { +        return vector.angleRad(); +    } + +    @Override +    public Vector2 angleToVector(Vector2 outVector, float angle) { +        final var tmpVector = new Vector2(1, 0).rotateRad(angle); +        outVector.x = tmpVector.x; +        outVector.y = tmpVector.y; +        return outVector; +    } + +    @Override +    public Location<Vector2> newLocation() { +        return new Box2DLocation(); +    } +} diff --git a/core/src/org/snoopdesigns/endless/physics/WorldContext.java b/core/src/org/snoopdesigns/endless/physics/WorldContext.java new file mode 100644 index 0000000..5f10ba8 --- /dev/null +++ b/core/src/org/snoopdesigns/endless/physics/WorldContext.java @@ -0,0 +1,17 @@ +package org.snoopdesigns.endless.physics; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.World; + +public class WorldContext { + +    private final World world; + +    public WorldContext() { +        this.world = new World(new Vector2(0, 0), true); +    } + +    public World getWorld() { +        return world; +    } +} diff --git a/core/src/org/snoopdesigns/endless/physics/camera/CameraContext.java b/core/src/org/snoopdesigns/endless/physics/camera/CameraContext.java new file mode 100644 index 0000000..635813c --- /dev/null +++ b/core/src/org/snoopdesigns/endless/physics/camera/CameraContext.java @@ -0,0 +1,48 @@ +package org.snoopdesigns.endless.physics.camera; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.math.Matrix4; +import com.badlogic.gdx.math.Vector2; + +public final class CameraContext { + +    private static final float DEFAULT_WORLD_WIDTH = 300.0f; + +    private final Vector2 position; +    private final Vector2 viewport; +    private float zoom; +    private Matrix4 cameraProjection; + +    public CameraContext() { +        final float w = Gdx.graphics.getWidth(); +        final float h = Gdx.graphics.getHeight(); + +        this.position = new Vector2(0, 0); +        this.zoom = 1.0f; +        this.viewport = new Vector2(DEFAULT_WORLD_WIDTH, DEFAULT_WORLD_WIDTH * (h / w)); +    } + +    public Matrix4 getCameraProjection() { +        return cameraProjection; +    } + +    public void setCameraProjection(Matrix4 cameraProjection) { +        this.cameraProjection = cameraProjection; +    } + +    public Vector2 getPosition() { +        return position; +    } + +    public float getZoom() { +        return zoom; +    } + +    public void setZoom(float zoom) { +        this.zoom = zoom; +    } + +    public Vector2 getViewport() { +        return viewport; +    } +} diff --git a/core/src/org/snoopdesigns/endless/physics/camera/CameraRenderer.java b/core/src/org/snoopdesigns/endless/physics/camera/CameraRenderer.java new file mode 100644 index 0000000..165240a --- /dev/null +++ b/core/src/org/snoopdesigns/endless/physics/camera/CameraRenderer.java @@ -0,0 +1,55 @@ +package org.snoopdesigns.endless.physics.camera; + +import com.badlogic.gdx.graphics.OrthographicCamera; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.viewport.ExtendViewport; +import com.badlogic.gdx.utils.viewport.Viewport; +import org.snoopdesigns.endless.context.Context; +import org.snoopdesigns.endless.renderer.Renderer; + +public class CameraRenderer implements Renderer { + +    private static final float DEFAULT_WORLD_WIDTH = 300.0f; +    private static final float DEFAULT_WORLD_HEIGHT = 300.0f; + +    private OrthographicCamera camera; +    private Viewport viewport; + +    @Override +    public void create() { +        camera = new OrthographicCamera(); +        camera.zoom = Context.getInstance().getCameraContext().getZoom(); +        viewport = new ExtendViewport( +                Context.getInstance().getCameraContext().getViewport().x, +                Context.getInstance().getCameraContext().getViewport().y, +                camera); +        camera.update(); +        Context.getInstance().getCameraContext().setCameraProjection(camera.combined); +    } + +    @Override +    public void render() { +        final Vector2 cameraPosition = Context.getInstance().getCameraContext().getPosition(); +        camera.position.set(cameraPosition.x, cameraPosition.y, 0); +        camera.update(); +    } + +    @Override +    public void dispose() { +    } + +    @Override +    public void resize(int width, int height) { +        viewport.update(width, height); +        Context.getInstance().getCameraContext().getViewport().set( +                camera.viewportWidth, +                camera.viewportHeight); +    } + +    @Override +    public boolean scrolled(float amountX, float amountY) { +        camera.zoom += amountY / 10f; +        Context.getInstance().getCameraContext().setZoom(camera.zoom); +        return true; +    } +}  | 
