From 71f048e3caa4643fbb06bdb6ea0acbad8c500e57 Mon Sep 17 00:00:00 2001 From: Ash Reynolds Date: Tue, 9 Feb 2016 16:37:43 +0000 Subject: [PATCH] Implemented boundary and jumping collision detection --- .../player.PNG => textures/player.png} | Bin core/src/com/game/Actor/Platform.java | 31 +++--- core/src/com/game/Actor/Player.java | 48 ++++----- core/src/com/game/Game.java | 6 -- core/src/com/game/States/Play.java | 95 +++++++++++++++--- 5 files changed, 112 insertions(+), 68 deletions(-) rename core/assets/{spritesheets/player.PNG => textures/player.png} (100%) diff --git a/core/assets/spritesheets/player.PNG b/core/assets/textures/player.png similarity index 100% rename from core/assets/spritesheets/player.PNG rename to core/assets/textures/player.png diff --git a/core/src/com/game/Actor/Platform.java b/core/src/com/game/Actor/Platform.java index 24a1154..7cefecd 100644 --- a/core/src/com/game/Actor/Platform.java +++ b/core/src/com/game/Actor/Platform.java @@ -29,24 +29,23 @@ public class Platform extends Base { FixtureDef fd = new FixtureDef(); - /*ChainShape chain = new ChainShape(); - Vector2[] v = new Vector2[3]; - v[0] = new Vector2( - -TILESIZE / 2 / PPM, -TILESIZE / 2 / PPM); - v[1] = new Vector2( - -TILESIZE / 2 / PPM, TILESIZE / 2 / PPM); - v[2] = new Vector2( - TILESIZE / 2 / PPM, TILESIZE / 2 / PPM); - chain.createChain(v); - fd.shape = chain;*/ + // Create the box (platform) PolygonShape polygon = new PolygonShape(); - polygon.setAsBox((TILESIZE / 2) / PPM, (TILESIZE / 2) / PPM); + polygon.setAsBox(TILESIZE / 2 / PPM, TILESIZE / 2 / PPM); fd.shape = polygon; - - fd.density = 1f; - fd.restitution = 0f; - fd.friction = 1f; - body.createFixture(fd); + + // Create a sensor used for jumping above each box + ChainShape chain = new ChainShape(); + Vector2[] v = new Vector2[2]; + v[0] = new Vector2( + (-TILESIZE / 2 + 5) / PPM, (TILESIZE / 2 + 5) / PPM); + v[1] = new Vector2( + (TILESIZE / 2 - 5) / PPM, (TILESIZE / 2 + 5) / PPM); + chain.createChain(v); + fd.shape = chain; + fd.isSensor = true; + + body.createFixture(fd).setUserData("PLATFORM"); } } diff --git a/core/src/com/game/Actor/Player.java b/core/src/com/game/Actor/Player.java index 54a201c..2fc9c38 100644 --- a/core/src/com/game/Actor/Player.java +++ b/core/src/com/game/Actor/Player.java @@ -1,9 +1,10 @@ package com.game.Actor; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.physics.box2d.*; import com.game.Misc.Vars; -import javafx.scene.shape.Circle; import static com.game.Misc.Vars.PPM; @@ -12,6 +13,9 @@ import static com.game.Misc.Vars.PPM; */ public class Player extends Base { + // TODO, remove + private Texture texture = new Texture("textures/player.png"); + private Action curAction; public enum Action { @@ -29,35 +33,21 @@ public class Player extends Base { @Override public void makeBody() { bd = new BodyDef(); - - if(bodyType.equals("STATIC")) { bd.type = BodyDef.BodyType.StaticBody; } // Doesn't move, isn't affected by forces - else if(bodyType.equals("KINEMATIC")) { bd.type = BodyDef.BodyType.KinematicBody; } // Can move, isn't affected by forces - else { bd.type = BodyDef.BodyType.DynamicBody; } // Can move, is affected by forces + bd.type = BodyDef.BodyType.DynamicBody; bd.position.set(pos.x / PPM, pos.y / PPM); body = world.createBody(bd); - //body.setFixedRotation(true); FixtureDef fd = new FixtureDef(); - //PolygonShape polygon = new PolygonShape(); - //polygon.setAsBox((size.x / 2) / PPM, (size.y / 2) / PPM); - //fd.shape = polygon; CircleShape circle = new CircleShape(); circle.setRadius((size.x / 2) / PPM); fd.shape = circle; fd.density = 1f; - fd.restitution = 0f; fd.friction = 0.9f; - body.createFixture(fd).setUserData("player"); - - /*PolygonShape polygon = new PolygonShape(); - polygon.setAsBox((size.x / 4) / PPM, (size.y / 4) / PPM, new Vector2(0, (size.y / -3) / PPM), 0); - fd.shape = polygon; - fd.isSensor = true; - body.createFixture(fd).setUserData("sensor");*/ + body.createFixture(fd).setUserData("PLAYER"); } public void update(float dt) @@ -71,6 +61,16 @@ public class Player extends Base { Vector2 curVel = body.getLinearVelocity(); curVel.x = Vars.SCROLLSPEED.x * dt; body.setLinearVelocity(curVel); + pos = body.getPosition(); + } + + public void render(SpriteBatch sb) + { + sb.draw(texture, + (pos.x * PPM) - size.x / 2, + (pos.y * PPM) - size.y / 2, + size.x, + size.y); } public void jump() @@ -81,20 +81,6 @@ public class Player extends Base { } } - public void moveLeft() - { - Vector2 vel = body.getLinearVelocity(); - vel.x = -5f; - body.setLinearVelocity(vel); - } - - public void moveRight() - { - Vector2 vel = body.getLinearVelocity(); - vel.x = 5f; - body.setLinearVelocity(vel); - } - // Accessors public Action getCurAction() { return curAction; } diff --git a/core/src/com/game/Game.java b/core/src/com/game/Game.java index 6a92990..049cf80 100644 --- a/core/src/com/game/Game.java +++ b/core/src/com/game/Game.java @@ -2,17 +2,11 @@ package com.game; import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration; -import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; -import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.game.Misc.Vars; import com.game.States.StateManager; -import javax.swing.*; -import java.awt.*; - public class Game extends ApplicationAdapter { private float accum; diff --git a/core/src/com/game/States/Play.java b/core/src/com/game/States/Play.java index cb2f475..6f640c7 100644 --- a/core/src/com/game/States/Play.java +++ b/core/src/com/game/States/Play.java @@ -6,11 +6,16 @@ import com.badlogic.gdx.Input; import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; +import com.badlogic.gdx.maps.MapLayer; +import com.badlogic.gdx.maps.objects.PolylineMapObject; +import com.badlogic.gdx.maps.objects.TextureMapObject; import com.badlogic.gdx.maps.tiled.TiledMap; import com.badlogic.gdx.maps.tiled.TiledMapTileLayer; import com.badlogic.gdx.maps.tiled.TmxMapLoader; import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer; +import com.badlogic.gdx.math.Polyline; import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.physics.box2d.*; import com.game.Actor.Base; import com.game.Actor.Platform; @@ -25,7 +30,7 @@ import java.util.ArrayList; public class Play extends State { // TODO, remove - public boolean isDebug = true; + public boolean isDebug = false; // Physics related private World world; @@ -50,7 +55,19 @@ public class Play extends State { ContactListener cl = new ContactListener() { @Override public void beginContact(Contact contact) { - player.setAction(Player.Action.IDLE); + Fixture fa = contact.getFixtureA(); + Fixture fb = contact.getFixtureB(); + + if(fa == null || fb == null) { return; } + if(fa.getUserData() == null || fb.getUserData() == null) { return; } + + if(fa.getUserData().equals("PLAYER") && fb.getUserData().equals("PLATFORM") || + fb.getUserData().equals("PLAYER") && fa.getUserData().equals("PLATFORM")) + { + if(player.getCurAction() != Player.Action.IDLE) { + player.setAction(Player.Action.IDLE); + } + } } @Override @@ -84,24 +101,28 @@ public class Play extends State { @Override public void update(float dt) { world.step(dt, 6, 2); - cam.position.x = player.getPos().x * PPM; - cam.update(); - b2dCam.position.x = player.getPos().x; + cameraUpdate(dt); + + b2dCam.position.x = player.getPos().x / PPM; b2dCam.update(); - player.update(dt); } @Override public void render() { Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + sb.setProjectionMatrix(cam.combined); if(!isDebug) { tmr.setView(cam); tmr.render(); + + sb.begin(); + player.render(sb); + sb.end(); } else { @@ -113,7 +134,7 @@ public class Play extends State { public void handleInput() { if(Gdx.input.isKeyPressed(Input.Keys.SPACE)) { - jumpSound.play(); + //jumpSound.play(); TODO, fix sound? player.jump(); } @@ -125,21 +146,37 @@ public class Play extends State { } + private void cameraUpdate(float dt) + { + Vector3 camPos = cam.position; + + camPos.x = cam.position.x + ((player.getPos().x * PPM) - cam.position.x) * .2f; + camPos.y = cam.position.y + ((player.getPos().y * PPM) - cam.position.y) * .2f; + cam.position.set(camPos); + cam.update(); + } + private void setupLevel() { - player = new Player(world, new Vector2(500, 500), new Vector2(60, 60), Base.Colours.NONE); - - tileMap = new TmxMapLoader().load("levels/level2.tmx"); + tileMap = new TmxMapLoader().load("levels/level1.tmx"); tmr = new OrthogonalTiledMapRenderer(tileMap); - TiledMapTileLayer layer = (TiledMapTileLayer)tileMap.getLayers().get("PLATFORM"); - tileSize = layer.getTileWidth(); + TiledMapTileLayer platformLayer = (TiledMapTileLayer)tileMap.getLayers().get("PLATFORM"); + tileSize = platformLayer.getTileWidth(); - for(int row = 0; row < layer.getHeight(); row++) + MapLayer boundaryLayer = tileMap.getLayers().get("BOUNDARY"); + PolylineMapObject polylineObj = (PolylineMapObject)boundaryLayer.getObjects().get(0); + buildBoundary(polylineObj); + + MapLayer playerLayer = tileMap.getLayers().get("PLAYER"); + TextureMapObject playerObj = (TextureMapObject)playerLayer.getObjects().get(0); + player = new Player(world, new Vector2(playerObj.getX(), playerObj.getY()), new Vector2(60, 60), Base.Colours.NONE); + + for(int row = 0; row < platformLayer.getHeight(); row++) { - for(int col = 0; col < layer.getWidth(); col++) + for(int col = 0; col < platformLayer.getWidth(); col++) { - TiledMapTileLayer.Cell cell = layer.getCell(col, row); + TiledMapTileLayer.Cell cell = platformLayer.getCell(col, row); if(cell == null) { continue; } if(cell.getTile() == null) { continue; } @@ -151,6 +188,34 @@ public class Play extends State { } } + public void buildBoundary(PolylineMapObject polylineObj) + { + Polyline r = polylineObj.getPolyline(); + BodyDef bd = new BodyDef(); + bd.type = BodyDef.BodyType.StaticBody; + + Body body = world.createBody(bd); + + FixtureDef fd = new FixtureDef(); + + ChainShape chain = new ChainShape(); + + float[] v = r.getTransformedVertices(); + Vector2[] finalV = new Vector2[v.length / 2]; + + for(int i = 0; i < v.length / 2; ++i) + { + finalV[i] = new Vector2(); + finalV[i].x = v[i * 2] / PPM; + finalV[i].y = v[i * 2 + 1] / PPM; + } + + chain.createChain(finalV); + fd.shape = chain; + + body.createFixture(fd).setUserData("boundary"); + } + // Accessors // Mutators