From e3935fe4b6ecfbe161001fc95d295f53e8520c52 Mon Sep 17 00:00:00 2001 From: Dmitri Morozov Date: Fri, 2 Feb 2024 18:58:12 +0100 Subject: Initial commit --- .../endless/physics/Box2DDebugRenderer.java | 28 +++++ .../endless/physics/Box2DLocation.java | 46 +++++++++ .../endless/physics/Box2DRenderer.java | 22 ++++ .../snoopdesigns/endless/physics/PhysicalBody.java | 32 ++++++ .../endless/physics/SteerablePhysicalBody.java | 115 +++++++++++++++++++++ .../snoopdesigns/endless/physics/WorldContext.java | 17 +++ .../endless/physics/camera/CameraContext.java | 48 +++++++++ .../endless/physics/camera/CameraRenderer.java | 55 ++++++++++ 8 files changed, 363 insertions(+) create mode 100644 core/src/org/snoopdesigns/endless/physics/Box2DDebugRenderer.java create mode 100644 core/src/org/snoopdesigns/endless/physics/Box2DLocation.java create mode 100644 core/src/org/snoopdesigns/endless/physics/Box2DRenderer.java create mode 100644 core/src/org/snoopdesigns/endless/physics/PhysicalBody.java create mode 100644 core/src/org/snoopdesigns/endless/physics/SteerablePhysicalBody.java create mode 100644 core/src/org/snoopdesigns/endless/physics/WorldContext.java create mode 100644 core/src/org/snoopdesigns/endless/physics/camera/CameraContext.java create mode 100644 core/src/org/snoopdesigns/endless/physics/camera/CameraRenderer.java (limited to 'core/src/org/snoopdesigns/endless/physics') 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 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 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 { + + 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 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; + } +} -- cgit v1.2.3