diff --git a/.gitignore b/.gitignore index 47454ee..70660bf 100644 --- a/.gitignore +++ b/.gitignore @@ -62,3 +62,4 @@ build/ ## OS Specific .DS_Store +/.nb-gradle/private/ \ No newline at end of file diff --git a/core/assets/badlogic.jpg b/core/assets/badlogic.jpg deleted file mode 100644 index 4390da6..0000000 Binary files a/core/assets/badlogic.jpg and /dev/null differ diff --git a/core/assets/sprites/ground.png b/core/assets/sprites/ground.png new file mode 100644 index 0000000..7ee0e8c Binary files /dev/null and b/core/assets/sprites/ground.png differ diff --git a/core/assets/sprites/wall.png b/core/assets/sprites/wall.png new file mode 100644 index 0000000..92b00bf Binary files /dev/null and b/core/assets/sprites/wall.png differ diff --git a/core/src/com/saltosion/gladiator/GladiatorBrawler.java b/core/src/com/saltosion/gladiator/GladiatorBrawler.java index 88c13de..1ef549f 100644 --- a/core/src/com/saltosion/gladiator/GladiatorBrawler.java +++ b/core/src/com/saltosion/gladiator/GladiatorBrawler.java @@ -3,7 +3,6 @@ package com.saltosion.gladiator; import com.badlogic.ashley.core.Engine; import com.badlogic.ashley.core.Entity; import com.badlogic.ashley.core.EntityListener; -import com.badlogic.ashley.core.Family; import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.g2d.Sprite; @@ -11,85 +10,131 @@ import com.badlogic.gdx.math.Vector2; import com.saltosion.gladiator.components.CPhysics; import com.saltosion.gladiator.components.CRenderedObject; import com.saltosion.gladiator.input.InputHandler; +import com.saltosion.gladiator.systems.PhysicsSystem; import com.saltosion.gladiator.systems.RenderingSystem; import com.saltosion.gladiator.util.AppUtil; +import com.saltosion.gladiator.util.Global; import com.saltosion.gladiator.util.Name; import com.saltosion.gladiator.util.SpriteLoader; import com.saltosion.gladiator.util.SpriteSequence; public class GladiatorBrawler extends ApplicationAdapter { - - private Engine engine; - private InputHandler inputHandler; - - private float physics_accumulator = 0f; - - private Entity player; - - @Override - public void create () { - - // Initialize the Engine - - engine = new Engine(); - - engine.addSystem(new RenderingSystem()); - - engine.addEntityListener(Family.getFor(), - 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); - - } - }); - - - // Initialize stuff in the world - - initializePlayer(); - - // Initialize input - - inputHandler = new InputHandler(); - Gdx.input.setInputProcessor(inputHandler); - } - @Override - public void render () { - engine.update(Gdx.graphics.getDeltaTime()); - } - - public void initializePlayer() { - - player = new Entity(); - - 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()); - - engine.addEntity(player); - - AppUtil.player = player; - } - - @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); - } + private Engine engine; + private InputHandler inputHandler; + + private Entity player; + + @Override + public void create() { + + // 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); + } + + @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); + } + + @Override + public void entityAdded(Entity entity) { + RenderingSystem rs = engine.getSystem(RenderingSystem.class); + rs.updateEntities(engine); + } + }); + + // Initialize stuff in the world + initializePlayer(); + initializeLevel(); + + // Initialize input + inputHandler = new InputHandler(); + Gdx.input.setInputProcessor(inputHandler); + } + + @Override + public void render() { + engine.update(Gdx.graphics.getDeltaTime()); + } + + public void initializePlayer() { + + player = new Entity(); + + 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)); + + engine.addEntity(player); + + AppUtil.player = player; + } + + public void initializeLevel() { + Entity ground = new Entity(); + + 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) + .setSize(groundSprite.getRegionWidth() * Global.SPRITE_SCALE, + groundSprite.getRegionHeight() * Global.SPRITE_SCALE); + physics.position.set(new Vector2(-2.5f, -5)); + ground.add(physics); + + Sprite wallSprite = SpriteLoader.loadSprite(Name.WALLIMG, 0, 0, 64, 64); + + Entity wall0 = new Entity(); + CRenderedObject wall0RenderedObject = new CRenderedObject(wallSprite); + CPhysics wall0Physics = new CPhysics().setMovable(false).setGravityApplied(false) + .setSize(wallSprite.getRegionWidth() * Global.SPRITE_SCALE, + wallSprite.getRegionHeight() * Global.SPRITE_SCALE); + wall0Physics.position.set(new Vector2(5, 0)); + wall0.add(wall0RenderedObject); + wall0.add(wall0Physics); + + Entity wall1 = new Entity(); + CRenderedObject wall1RenderedObject = new CRenderedObject(wallSprite); + CPhysics wall1Physics = new CPhysics().setMovable(false).setGravityApplied(false) + .setSize(wallSprite.getRegionWidth() * Global.SPRITE_SCALE, + wallSprite.getRegionHeight() * Global.SPRITE_SCALE); + wall1Physics.position.set(new Vector2(-5, 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); + } } diff --git a/core/src/com/saltosion/gladiator/components/CPhysics.java b/core/src/com/saltosion/gladiator/components/CPhysics.java index 71fbbde..e4b11d1 100644 --- a/core/src/com/saltosion/gladiator/components/CPhysics.java +++ b/core/src/com/saltosion/gladiator/components/CPhysics.java @@ -4,11 +4,43 @@ import com.badlogic.ashley.core.Component; import com.badlogic.gdx.math.Vector2; public class CPhysics extends Component { - - public Vector2 position = new Vector2(0, 0); - public Vector2 velocity = new Vector2(0, 0); - public boolean movingLeft = false; - public boolean movingRight = false; - public boolean jumping = false; - public boolean grounded = true; + + public Vector2 position = new Vector2(); + public Vector2 velocity = new Vector2(); + public Vector2 size = new Vector2(); + public float movespeed = 5f, jumpForce = 5f, gravity = 1f; + public boolean grounded = 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; + + public CPhysics setMovable(boolean movable) { + this.movable = movable; + return this; + } + + public CPhysics setGravityApplied(boolean gravityApplied) { + this.gravityApplied = gravityApplied; + 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; + } + } diff --git a/core/src/com/saltosion/gladiator/input/IRJump.java b/core/src/com/saltosion/gladiator/input/IRJump.java index 6a926c5..9b06737 100644 --- a/core/src/com/saltosion/gladiator/input/IRJump.java +++ b/core/src/com/saltosion/gladiator/input/IRJump.java @@ -5,19 +5,18 @@ import com.saltosion.gladiator.util.AppUtil; public class IRJump implements InputReceiver { - @Override - public boolean pressed() { - CPhysics physics = AppUtil.player.getComponent(CPhysics.class); - physics.jumping = true; - return true; - } + @Override + public boolean pressed() { + CPhysics physics = AppUtil.player.getComponent(CPhysics.class); + physics.jumping = true; + return true; + } - @Override - public boolean released() { - CPhysics physics = AppUtil.player.getComponent(CPhysics.class); - physics.jumping = false; - physics.grounded = true; - return true; - } + @Override + public boolean released() { + CPhysics physics = AppUtil.player.getComponent(CPhysics.class); + physics.jumping = false; + return true; + } } diff --git a/core/src/com/saltosion/gladiator/systems/PhysicsSystem.java b/core/src/com/saltosion/gladiator/systems/PhysicsSystem.java new file mode 100644 index 0000000..1db5fa1 --- /dev/null +++ b/core/src/com/saltosion/gladiator/systems/PhysicsSystem.java @@ -0,0 +1,119 @@ +package com.saltosion.gladiator.systems; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Engine; +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.core.EntitySystem; +import com.badlogic.ashley.core.Family; +import com.badlogic.ashley.utils.ImmutableArray; +import com.saltosion.gladiator.components.CPhysics; + +/** + * + * @author Jens "Jeasonfire" Pitkänen + */ +public class PhysicsSystem extends EntitySystem { + + private ComponentMapper pm = ComponentMapper.getFor(CPhysics.class); + private ImmutableArray entities; + + @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)); + + // 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.velocity.y = obj.jumpForce; + } + } + + // 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; + } + CPhysics other = pm.get(entities.get(j)); + collision(obj, other); + } + } + + // Apply movement + obj.position.add(obj.velocity); + } + } + + public void collision(CPhysics cp0, CPhysics cp1) { + 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; + cp0.grounded = false; + cp1.grounded = false; + + boolean colliding = (x00 < x11) && (x01 > x10) && (y00 < y11) && (y01 > y10); + + if (!colliding) { + return; + } + + if (x00 <= x11 && Math.abs(x00 - x11) < (cp0.size.x + cp1.size.x) / 4) { + // 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 (x01 > x10 && Math.abs(x01 - x10) < (cp0.size.x + cp1.size.x) / 4) { + // 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 (y00 <= y11 && Math.abs(y00 - y11) < (cp0.size.y + cp1.size.y) / 4) { + // 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 (y01 > y10 && Math.abs(y01 - y10) < (cp0.size.y + cp1.size.y) / 4) { + // 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)); + } + +} diff --git a/core/src/com/saltosion/gladiator/util/Global.java b/core/src/com/saltosion/gladiator/util/Global.java index 0b7bf0c..bc4b4b4 100644 --- a/core/src/com/saltosion/gladiator/util/Global.java +++ b/core/src/com/saltosion/gladiator/util/Global.java @@ -1,13 +1,13 @@ - package com.saltosion.gladiator.util; +package com.saltosion.gladiator.util; public class Global { - - public static final String STATICPLAYER = "STATICPLAYER"; - public static final String PLAYERIMG = "PLAYERIMG"; - - public static final String GAME_NAME = "Gladiator Brawl"; - - public static final int VPHEIGHT_CONST = 14; - public static final float PHYSICS_TIMESTEP = 1/45f; + + public static final String STATICPLAYER = "STATICPLAYER"; + public static final String PLAYERIMG = "PLAYERIMG"; + + public static final String GAME_NAME = "Gladiator Brawl"; + + public static final int VPHEIGHT_CONST = 14; + public static final float SPRITE_SCALE = 1 / 16f; } diff --git a/core/src/com/saltosion/gladiator/util/Name.java b/core/src/com/saltosion/gladiator/util/Name.java index a4a4cdf..11892db 100644 --- a/core/src/com/saltosion/gladiator/util/Name.java +++ b/core/src/com/saltosion/gladiator/util/Name.java @@ -1,14 +1,16 @@ package com.saltosion.gladiator.util; public class Name { - - public static final String GAME_NAME = "Gladiator Brawl"; - - public static final String STATICPLAYER = "STATICPLAYER"; - public static final String PLAYERIMG = "PLAYERIMG"; - - public static final String MOVE_LEFT = "MOVE_LEFT"; - public static final String MOVE_RIGHT = "MOVE_RIGHT"; - public static final String JUMP = "JUMP"; + + public static final String GAME_NAME = "Gladiator Brawl"; + + public static final String STATICPLAYER = "STATICPLAYER"; + public static final String PLAYERIMG = "PLAYERIMG"; + public static final String GROUNDIMG = "GROUNDIMG"; + public static final String WALLIMG = "WALLIMG"; + + public static final String MOVE_LEFT = "MOVE_LEFT"; + public static final String MOVE_RIGHT = "MOVE_RIGHT"; + public static final String JUMP = "JUMP"; } diff --git a/core/src/com/saltosion/gladiator/util/SpriteLoader.java b/core/src/com/saltosion/gladiator/util/SpriteLoader.java index 330d1c2..c0f89c3 100644 --- a/core/src/com/saltosion/gladiator/util/SpriteLoader.java +++ b/core/src/com/saltosion/gladiator/util/SpriteLoader.java @@ -8,56 +8,61 @@ import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.TextureRegion; public class SpriteLoader { - - public static HashMap textures = new HashMap(); - - static { - loadTexture(Name.STATICPLAYER, "sprites/staticplayer.png"); - loadTexture(Name.PLAYERIMG, "sprites/player/player.png"); - } - - /** - * Returns a sprite, which is a piece from texture. - * @param texKey - * @param x - * @param y - * @param width - * @param height - * @return - */ - public static Sprite loadSprite(String texKey, int x, int y, int width, int height) { - TextureRegion tr = new TextureRegion(textures.get(texKey), x*width, y*height, width, height); - Sprite s = new Sprite(tr); - s.setScale(1/16f); - return s; - } - - /** - * Returns a sprite, which is originally a texture. - * @param texKey - * @return - */ - public static Sprite loadSprite(String texKey) { - return loadSprite(texKey, 0, 0, textures.get(texKey).getWidth(), textures.get(texKey).getHeight()); - } - - /** - * Load texture from path. - * @param filePath - */ - public static Texture loadTexture(String key, String filePath) { - Texture t = new Texture(Gdx.files.internal(filePath)); - textures.put(key, t); - return t; - } - - /** - * Disposes all the textures loaded so far. - */ - public static void dispose () { - for (Texture tex : textures.values()) { - tex.dispose(); - } - } + + public static HashMap textures = new HashMap(); + + static { + loadTexture(Name.STATICPLAYER, "sprites/staticplayer.png"); + loadTexture(Name.PLAYERIMG, "sprites/player/player.png"); + loadTexture(Name.GROUNDIMG, "sprites/ground.png"); + loadTexture(Name.WALLIMG, "sprites/wall.png"); + } + + /** + * Returns a sprite, which is a piece from texture. + * + * @param texKey + * @param x + * @param y + * @param width + * @param height + * @return + */ + public static Sprite loadSprite(String texKey, int x, int y, int width, int height) { + TextureRegion tr = new TextureRegion(textures.get(texKey), x * width, y * height, width, height); + Sprite s = new Sprite(tr); + s.setScale(Global.SPRITE_SCALE); + return s; + } + + /** + * Returns a sprite, which is originally a texture. + * + * @param texKey + * @return + */ + public static Sprite loadSprite(String texKey) { + return loadSprite(texKey, 0, 0, textures.get(texKey).getWidth(), textures.get(texKey).getHeight()); + } + + /** + * Load texture from path. + * + * @param filePath + */ + public static Texture loadTexture(String key, String filePath) { + Texture t = new Texture(Gdx.files.internal(filePath)); + textures.put(key, t); + return t; + } + + /** + * Disposes all the textures loaded so far. + */ + public static void dispose() { + for (Texture tex : textures.values()) { + tex.dispose(); + } + } } diff --git a/core/src/com/saltosion/gladiator/util/SpriteSequence.java b/core/src/com/saltosion/gladiator/util/SpriteSequence.java index 6d59a32..31bd42d 100644 --- a/core/src/com/saltosion/gladiator/util/SpriteSequence.java +++ b/core/src/com/saltosion/gladiator/util/SpriteSequence.java @@ -5,40 +5,38 @@ import java.util.ArrayList; import com.badlogic.gdx.graphics.g2d.Sprite; public class SpriteSequence { - - private ArrayList sprites = new ArrayList(); - private float defaultPlayspeed = 1; - - /** - * A static single image. - * @param sprite - */ - public SpriteSequence(Sprite sprite) { - sprites.add(sprite); - defaultPlayspeed = 0; - } - - public SpriteSequence(float playspeed) { - this.defaultPlayspeed = playspeed; - if (sprites != null) { - this.sprites = sprites; - } - } - - public SpriteSequence addSprite(Sprite s) { - sprites.add(s); - return this; - } - - public Sprite getSprite(int index) { - return sprites.get(index); - } - - public float getPlayspeed() { - return defaultPlayspeed; - } - - public int frameCount() { - return sprites.size(); - } + + private final ArrayList sprites = new ArrayList(); + private float defaultPlayspeed = 1; + + /** + * A static single image. + * + * @param sprite + */ + public SpriteSequence(Sprite sprite) { + sprites.add(sprite); + defaultPlayspeed = 0; + } + + public SpriteSequence(float playspeed) { + this.defaultPlayspeed = playspeed; + } + + public SpriteSequence addSprite(Sprite s) { + sprites.add(s); + return this; + } + + public Sprite getSprite(int index) { + return sprites.get(index); + } + + public float getPlayspeed() { + return defaultPlayspeed; + } + + public int frameCount() { + return sprites.size(); + } }