From 71a2ce2b40870810521b656e7999f0ee7c37459e Mon Sep 17 00:00:00 2001 From: Jeasonfire Date: Sun, 10 May 2015 01:09:54 +0300 Subject: [PATCH] Fixed bug where player sinks into the ground. --- .../saltosion/gladiator/GladiatorBrawler.java | 194 ++++++++-------- .../gladiator/components/CPhysics.java | 80 +++---- .../gladiator/systems/PhysicsSystem.java | 209 +++++++++--------- 3 files changed, 243 insertions(+), 240 deletions(-) diff --git a/core/src/com/saltosion/gladiator/GladiatorBrawler.java b/core/src/com/saltosion/gladiator/GladiatorBrawler.java index cf42e1e..5bb6f8b 100644 --- a/core/src/com/saltosion/gladiator/GladiatorBrawler.java +++ b/core/src/com/saltosion/gladiator/GladiatorBrawler.java @@ -20,122 +20,120 @@ import com.saltosion.gladiator.util.SpriteSequence; public class GladiatorBrawler extends ApplicationAdapter { - private Engine engine; - private InputHandler inputHandler; + private Engine engine; + private InputHandler inputHandler; - private Entity player; + private Entity player; - @Override - public void create() { + @Override + public void create() { + // Initialize the Engine + engine = new Engine(); - // Initialize the Engine - engine = new Engine(); + engine.addSystem(new PhysicsSystem()); + engine.addEntityListener(new EntityListener() { + @Override + public void entityAdded(Entity entity) { + PhysicsSystem ps = engine.getSystem(PhysicsSystem.class); + ps.updateEntities(engine); + } - engine.addSystem(new PhysicsSystem()); - engine.addEntityListener(new EntityListener() { - @Override - public void entityAdded(Entity entity) { - PhysicsSystem ps = engine.getSystem(PhysicsSystem.class); - ps.updateEntities(engine); - } + @Override + public void entityRemoved(Entity entity) { + PhysicsSystem ps = engine.getSystem(PhysicsSystem.class); + ps.updateEntities(engine); + } + }); - @Override - public void entityRemoved(Entity entity) { - PhysicsSystem ps = engine.getSystem(PhysicsSystem.class); - ps.updateEntities(engine); - } - }); + engine.addSystem(new RenderingSystem()); + engine.addEntityListener(new EntityListener() { + @Override + public void entityRemoved(Entity entity) { + RenderingSystem rs = engine.getSystem(RenderingSystem.class); + rs.updateEntities(engine); + } - engine.addSystem(new RenderingSystem()); - engine.addEntityListener(new EntityListener() { - @Override - public void entityRemoved(Entity entity) { - RenderingSystem rs = engine.getSystem(RenderingSystem.class); - rs.updateEntities(engine); - } + @Override + public void entityAdded(Entity entity) { + RenderingSystem rs = engine.getSystem(RenderingSystem.class); + rs.updateEntities(engine); + } + }); - @Override - public void entityAdded(Entity entity) { - RenderingSystem rs = engine.getSystem(RenderingSystem.class); - rs.updateEntities(engine); - } - }); + // Initialize stuff in the world + initializePlayer(); + initializeLevel(); - // Initialize stuff in the world - initializePlayer(); - initializeLevel(); + // Initialize input + inputHandler = new InputHandler(); + Gdx.input.setInputProcessor(inputHandler); + } - // Initialize input - inputHandler = new InputHandler(); - Gdx.input.setInputProcessor(inputHandler); - } + @Override + public void render() { + engine.update(Gdx.graphics.getDeltaTime()); + } - @Override - public void render() { - engine.update(Gdx.graphics.getDeltaTime()); - } + public void initializePlayer() { + player = new Entity(); - public void initializePlayer() { + CRenderedObject renderedObject = new CRenderedObject(); + Sprite player1 = SpriteLoader.loadSprite(Name.PLAYERIMG, 0, 0, 64, 64); + Sprite player2 = SpriteLoader.loadSprite(Name.PLAYERIMG, 1, 0, 64, 64); + SpriteSequence sequence = new SpriteSequence(1).addSprite(player1).addSprite(player2); + renderedObject.addSequence("Idle", sequence); + renderedObject.playAnimation("Idle"); + player.add(renderedObject); + player.add(new CPhysics().setSize(player1.getRegionWidth() * Global.SPRITE_SCALE, + player1.getRegionHeight() * Global.SPRITE_SCALE).setPosition(0, 5)); - player = new Entity(); + engine.addEntity(player); - CRenderedObject renderedObject = new CRenderedObject(); - Sprite player1 = SpriteLoader.loadSprite(Name.PLAYERIMG, 0, 0, 64, 64); - Sprite player2 = SpriteLoader.loadSprite(Name.PLAYERIMG, 1, 0, 64, 64); - SpriteSequence sequence = new SpriteSequence(1).addSprite(player1).addSprite(player2); - renderedObject.addSequence("Idle", sequence); - renderedObject.playAnimation("Idle"); - player.add(renderedObject); - player.add(new CPhysics().setSize(player1.getRegionWidth() * Global.SPRITE_SCALE, - player1.getRegionHeight() * Global.SPRITE_SCALE).setPosition(0, 5)); + AppUtil.player = player; + } - engine.addEntity(player); + public void initializeLevel() { + Entity ground = new Entity(); - AppUtil.player = player; - } + Sprite groundSprite = SpriteLoader.loadSprite(Name.GROUNDIMG, 0, 0, 256, 64); + CRenderedObject renderedObject = new CRenderedObject(groundSprite); + ground.add(renderedObject); + CPhysics physics = new CPhysics().setMovable(false).setGravityApplied(false).setDynamic(false) + .setSize(groundSprite.getRegionWidth() * Global.SPRITE_SCALE, + groundSprite.getRegionHeight() * Global.SPRITE_SCALE); + physics.position.set(new Vector2(0, -4)); + ground.add(physics); - public void initializeLevel() { - Entity ground = new Entity(); + Sprite wallSprite = SpriteLoader.loadSprite(Name.WALLIMG, 0, 0, 64, 64); - Sprite groundSprite = SpriteLoader.loadSprite(Name.GROUNDIMG, 0, 0, 256, 64); - CRenderedObject renderedObject = new CRenderedObject(groundSprite); - ground.add(renderedObject); - CPhysics physics = new CPhysics().setMovable(false).setGravityApplied(false).setDynamic(false) - .setSize(groundSprite.getRegionWidth() * Global.SPRITE_SCALE, - groundSprite.getRegionHeight() * Global.SPRITE_SCALE); - physics.position.set(new Vector2(0, -4)); - ground.add(physics); + Entity wall0 = new Entity(); + CRenderedObject wall0RenderedObject = new CRenderedObject(wallSprite); + CPhysics wall0Physics = new CPhysics().setMovable(false).setGravityApplied(false).setDynamic(false) + .setSize(wallSprite.getRegionWidth() * Global.SPRITE_SCALE, + wallSprite.getRegionHeight() * Global.SPRITE_SCALE); + wall0Physics.position.set(new Vector2(6, 0)); + wall0.add(wall0RenderedObject); + wall0.add(wall0Physics); - Sprite wallSprite = SpriteLoader.loadSprite(Name.WALLIMG, 0, 0, 64, 64); + Entity wall1 = new Entity(); + CRenderedObject wall1RenderedObject = new CRenderedObject(wallSprite); + CPhysics wall1Physics = new CPhysics().setMovable(false).setGravityApplied(false).setDynamic(false) + .setSize(wallSprite.getRegionWidth() * Global.SPRITE_SCALE, + wallSprite.getRegionHeight() * Global.SPRITE_SCALE); + wall1Physics.position.set(new Vector2(-6, 0)); + wall1.add(wall1RenderedObject); + wall1.add(wall1Physics); - Entity wall0 = new Entity(); - CRenderedObject wall0RenderedObject = new CRenderedObject(wallSprite); - CPhysics wall0Physics = new CPhysics().setMovable(false).setGravityApplied(false).setDynamic(false) - .setSize(wallSprite.getRegionWidth() * Global.SPRITE_SCALE, - wallSprite.getRegionHeight() * Global.SPRITE_SCALE); - wall0Physics.position.set(new Vector2(6, 0)); - wall0.add(wall0RenderedObject); - wall0.add(wall0Physics); + engine.addEntity(ground); + engine.addEntity(wall0); + engine.addEntity(wall1); + } - Entity wall1 = new Entity(); - CRenderedObject wall1RenderedObject = new CRenderedObject(wallSprite); - CPhysics wall1Physics = new CPhysics().setMovable(false).setGravityApplied(false).setDynamic(false) - .setSize(wallSprite.getRegionWidth() * Global.SPRITE_SCALE, - wallSprite.getRegionHeight() * Global.SPRITE_SCALE); - wall1Physics.position.set(new Vector2(-6, 0)); - wall1.add(wall1RenderedObject); - wall1.add(wall1Physics); - - engine.addEntity(ground); - engine.addEntity(wall0); - engine.addEntity(wall1); - } - - @Override - public void resize(int width, int height) { - super.resize(width, height); - RenderingSystem rs = engine.getSystem(RenderingSystem.class); - float aspectratio = ((float) width) / ((float) height); - rs.setViewport((int) (AppUtil.VPHEIGHT_CONST * aspectratio), AppUtil.VPHEIGHT_CONST); - } + @Override + public void resize(int width, int height) { + super.resize(width, height); + RenderingSystem rs = engine.getSystem(RenderingSystem.class); + float aspectratio = ((float) width) / ((float) height); + rs.setViewport((int) (AppUtil.VPHEIGHT_CONST * aspectratio), AppUtil.VPHEIGHT_CONST); + } } diff --git a/core/src/com/saltosion/gladiator/components/CPhysics.java b/core/src/com/saltosion/gladiator/components/CPhysics.java index 97b7ef9..bb78161 100644 --- a/core/src/com/saltosion/gladiator/components/CPhysics.java +++ b/core/src/com/saltosion/gladiator/components/CPhysics.java @@ -6,53 +6,53 @@ import com.saltosion.gladiator.physics.CollisionListener; public class CPhysics extends Component { - public Vector2 position = new Vector2(); - public Vector2 velocity = new Vector2(); - public Vector2 size = new Vector2(); - public float movespeed = 5f, jumpForce = 0.3f, gravity = 1f; - public boolean grounded = true; - public CollisionListener collisionListener = null; + public Vector2 position = new Vector2(); + public Vector2 velocity = new Vector2(); + public Vector2 size = new Vector2(); + public float movespeed = 5f, jumpForce = 0.5f, gravity = 1f; + public boolean grounded = true; + public CollisionListener collisionListener = null; - // Movable toggles if the entity can move by itself - public boolean movable = true; - // GravityApplied toggles if the entity is affected by gravity - public boolean gravityApplied = true; - // Dynamic toggles if the entity processes collisions - public boolean dynamic = true; + // Movable toggles if the entity can move by itself + public boolean movable = true; + // GravityApplied toggles if the entity is affected by gravity + public boolean gravityApplied = true; + // Dynamic toggles if the entity processes collisions + public boolean dynamic = true; - // Movement (/input) vars - public boolean movingLeft = false; - public boolean movingRight = false; - public boolean jumping = false; + // Movement (/input) vars + public boolean movingLeft = false; + public boolean movingRight = false; + public boolean jumping = false; - public CPhysics setMovable(boolean movable) { - this.movable = movable; - return this; - } + public CPhysics setMovable(boolean movable) { + this.movable = movable; + return this; + } - public CPhysics setGravityApplied(boolean gravityApplied) { - this.gravityApplied = gravityApplied; - return this; - } + public CPhysics setGravityApplied(boolean gravityApplied) { + this.gravityApplied = gravityApplied; + return this; + } - public CPhysics setDynamic(boolean dynamic) { - this.dynamic = dynamic; - return this; - } + public CPhysics setDynamic(boolean dynamic) { + this.dynamic = dynamic; + return this; + } - public CPhysics setSize(float w, float h) { - this.size.set(w, h); - return this; - } + public CPhysics setSize(float w, float h) { + this.size.set(w, h); + return this; + } - public CPhysics setPosition(float x, float y) { - this.position.set(x, y); - return this; - } + public CPhysics setPosition(float x, float y) { + this.position.set(x, y); + return this; + } - public CPhysics setCollisionListener(CollisionListener collisionListener) { - this.collisionListener = collisionListener; - return this; - } + public CPhysics setCollisionListener(CollisionListener collisionListener) { + this.collisionListener = collisionListener; + return this; + } } diff --git a/core/src/com/saltosion/gladiator/systems/PhysicsSystem.java b/core/src/com/saltosion/gladiator/systems/PhysicsSystem.java index 1659c93..4a40284 100644 --- a/core/src/com/saltosion/gladiator/systems/PhysicsSystem.java +++ b/core/src/com/saltosion/gladiator/systems/PhysicsSystem.java @@ -15,123 +15,128 @@ import com.saltosion.gladiator.physics.CollisionSide; */ public class PhysicsSystem extends EntitySystem { - private ComponentMapper pm = ComponentMapper.getFor(CPhysics.class); - private ImmutableArray entities; + private static final float MAX_VEL = 0.5f; + private ComponentMapper pm = ComponentMapper.getFor(CPhysics.class); + private ImmutableArray entities; - @Override - public void addedToEngine(Engine engine) { - updateEntities(engine); - } + @Override + public void addedToEngine(Engine engine) { + updateEntities(engine); + } - @Override - public void update(float deltaTime) { - for (int i = 0; i < entities.size(); i++) { - CPhysics obj = pm.get(entities.get(i)); + @Override + public void update(float deltaTime) { + deltaTime = Math.min(deltaTime, 0.033f); + for (int i = 0; i < entities.size(); i++) { + CPhysics obj = pm.get(entities.get(i)); - // Movement - if (obj.movable) { - float move = 0; - if (obj.movingLeft) { - move--; - } - if (obj.movingRight) { - move++; - } - obj.velocity.x = move * obj.movespeed * deltaTime; - if (obj.jumping && obj.grounded) { - obj.grounded = false; - obj.velocity.y = obj.jumpForce; - } - } + // Movement + if (obj.movable) { + float move = 0; + if (obj.movingLeft) { + move--; + } + if (obj.movingRight) { + move++; + } + obj.velocity.x = move * obj.movespeed * deltaTime; + if (obj.jumping && obj.grounded) { + obj.grounded = false; + obj.velocity.y = obj.jumpForce; + } + } - // Gravity - if (obj.gravityApplied) { - obj.velocity.y -= obj.gravity * deltaTime; - } + // Gravity + if (obj.gravityApplied) { + obj.velocity.y -= obj.gravity * deltaTime; + } - // Collisions - if (obj.dynamic) { - for (int j = 0; j < entities.size(); j++) { - if (i == j) { - continue; - } - collision(entities.get(i), entities.get(j)); - } - } + obj.velocity.y = Math.max(Math.min(obj.velocity.y, MAX_VEL), -MAX_VEL); - // Apply movement - obj.position.add(obj.velocity); - } - } + // Collisions + if (obj.dynamic) { + for (int j = 0; j < entities.size(); j++) { + if (i == j) { + continue; + } + collision(entities.get(i), entities.get(j)); + } + } - public void collision(Entity entity0, Entity entity1) { - CPhysics cp0 = pm.get(entity0); - CPhysics cp1 = pm.get(entity1); + // Apply movement + obj.position.add(obj.velocity); + } + } - float x00 = cp0.position.x - cp0.size.x / 2; - float x01 = cp0.position.x + cp0.size.x / 2; - float x10 = cp1.position.x - cp1.size.x / 2; - float x11 = cp1.position.x + cp1.size.x / 2; - float y00 = cp0.position.y - cp0.size.y / 2; - float y01 = cp0.position.y + cp0.size.y / 2; - float y10 = cp1.position.y - cp1.size.y / 2; - float y11 = cp1.position.y + cp1.size.y / 2; + public void collision(Entity entity0, Entity entity1) { + CPhysics cp0 = pm.get(entity0); + CPhysics cp1 = pm.get(entity1); - boolean colliding = (x00 < x11) && (x01 > x10) && (y00 < y11) && (y01 > y10); + float x00 = cp0.position.x - cp0.size.x / 2; + float x01 = cp0.position.x + cp0.size.x / 2; + float x10 = cp1.position.x - cp1.size.x / 2; + float x11 = cp1.position.x + cp1.size.x / 2; + float y00 = cp0.position.y - cp0.size.y / 2; + float y01 = cp0.position.y + cp0.size.y / 2; + float y10 = cp1.position.y - cp1.size.y / 2; + float y11 = cp1.position.y + cp1.size.y / 2; - if (!colliding) { - return; - } + boolean colliding = (x00 < x11) && (x01 > x10) && (y00 < y11) && (y01 > y10); - if (x00 <= x11 && Math.abs(x00 - x11) < (cp0.size.x + cp1.size.x) / 16) { - // cp0's left side is colliding with cp1's right side - if (cp0.velocity.x < 0) { - // cp0 is going left, stop - cp0.velocity.x = 0; - } + if (!colliding) { + return; + } - if (cp0.collisionListener != null) { - cp0.collisionListener.collision(CollisionSide.LEFT, entity0, entity1); - } - } - if (x01 > x10 && Math.abs(x01 - x10) < (cp0.size.x + cp1.size.x) / 16) { - // cp0's right side is colliding with cp1's left side - if (cp0.velocity.x > 0) { - // cp0 is going right, stop - cp0.velocity.x = 0; - } + if (x00 <= x11 && Math.abs(x00 - x11) < (cp0.size.x + cp1.size.x) / 16) { + // cp0's left side is colliding with cp1's right side + if (cp0.velocity.x < 0) { + // cp0 is going left, stop + cp0.velocity.x = 0; + } - if (cp0.collisionListener != null) { - cp0.collisionListener.collision(CollisionSide.RIGHT, entity0, entity1); - } - } - if (y00 <= y11 && Math.abs(y00 - y11) < (cp0.size.y + cp1.size.y) / 16) { - // cp0's bottom side is colliding with cp1's top side - if (cp0.velocity.y < 0) { - // cp0 is going down, stop - cp0.velocity.y = 0; - } - cp0.grounded = true; + if (cp0.collisionListener != null) { + cp0.collisionListener.collision(CollisionSide.LEFT, entity0, entity1); + } + } + if (x01 > x10 && Math.abs(x01 - x10) < (cp0.size.x + cp1.size.x) / 16) { + // cp0's right side is colliding with cp1's left side + if (cp0.velocity.x > 0) { + // cp0 is going right, stop + cp0.velocity.x = 0; + } - if (cp0.collisionListener != null) { - cp0.collisionListener.collision(CollisionSide.BOTTOM, entity0, entity1); - } - } - if (y01 > y10 && Math.abs(y01 - y10) < (cp0.size.y + cp1.size.y) / 16) { - // cp0's top side is colliding with cp1's bottom side - if (cp0.velocity.y > 0) { - // cp0 is going up, stop - cp0.velocity.y = 0; - } + if (cp0.collisionListener != null) { + cp0.collisionListener.collision(CollisionSide.RIGHT, entity0, entity1); + } + } + if (y00 <= y11 && Math.abs(y00 - y11) < (cp0.size.y + cp1.size.y) / 16) { + // cp0's bottom side is colliding with cp1's top side + if (cp0.velocity.y < 0) { + // cp0 is going down, stop + cp0.velocity.y = 0; + } + cp0.grounded = true; + cp0.position.y += (y11 - y00) * 1.1f; - if (cp0.collisionListener != null) { - cp0.collisionListener.collision(CollisionSide.TOP, entity0, entity1); - } - } - } + if (cp0.collisionListener != null) { + cp0.collisionListener.collision(CollisionSide.BOTTOM, entity0, entity1); + } + } + if (y01 > y10 && Math.abs(y01 - y10) < (cp0.size.y + cp1.size.y) / 16) { + // cp0's top side is colliding with cp1's bottom side + if (cp0.velocity.y > 0) { + // cp0 is going up, stop + cp0.velocity.y = 0; + } - public void updateEntities(Engine engine) { - entities = engine.getEntitiesFor(Family.getFor(CPhysics.class)); - } + if (cp0.collisionListener != null) { + cp0.collisionListener.collision(CollisionSide.TOP, entity0, entity1); + } + } + } + + public void updateEntities(Engine engine) { + entities = engine.getEntitiesFor(Family.getFor(CPhysics.class)); + } }