diff --git a/core/src/com/saltosion/gladiator/GladiatorBrawler.java b/core/src/com/saltosion/gladiator/GladiatorBrawler.java index 192abb9..82e016b 100644 --- a/core/src/com/saltosion/gladiator/GladiatorBrawler.java +++ b/core/src/com/saltosion/gladiator/GladiatorBrawler.java @@ -14,6 +14,7 @@ import com.saltosion.gladiator.state.MainMenuState; import com.saltosion.gladiator.systems.AISystem; import com.saltosion.gladiator.systems.CombatSystem; import com.saltosion.gladiator.systems.MiscManagerSystem; +import com.saltosion.gladiator.systems.ParticleSystem; import com.saltosion.gladiator.systems.PhysicsSystem; import com.saltosion.gladiator.systems.RenderingSystem; import com.saltosion.gladiator.util.AppUtil; @@ -67,6 +68,7 @@ public class GladiatorBrawler extends ApplicationAdapter { engine.addSystem(new CombatSystem()); engine.addSystem(new MiscManagerSystem()); engine.addSystem(new AISystem()); + engine.addSystem(new ParticleSystem()); engine.addEntityListener(new EntityListener() { @Override public void entityAdded(Entity entity) { diff --git a/core/src/com/saltosion/gladiator/components/CParticle.java b/core/src/com/saltosion/gladiator/components/CParticle.java new file mode 100644 index 0000000..2357570 --- /dev/null +++ b/core/src/com/saltosion/gladiator/components/CParticle.java @@ -0,0 +1,79 @@ +package com.saltosion.gladiator.components; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.math.Vector2; + +public class CParticle extends Component { + + private final Vector2 position = new Vector2(); + private final Vector2 velocity = new Vector2(); + private final Vector2 gravity = new Vector2(); + private final Vector2 size = new Vector2(0.1f, 0.1f); + private final Color color = new Color(); + private final float creationTime; + private float decayTime = 1; + + public CParticle() { + this.creationTime = System.currentTimeMillis(); + } + + public CParticle setPosition(float x, float y) { + this.position.set(x, y); + return this; + } + + public CParticle setVelocity(float x, float y) { + this.velocity.set(x, y); + return this; + } + + public CParticle setGravity(float x, float y) { + this.gravity.set(x, y); + return this; + } + + public CParticle setSize(float x, float y) { + this.size.set(x, y); + return this; + } + + public CParticle setColor(float r, float g, float b, float a) { + this.color.set(r, g, b, a); + return this; + } + + public CParticle setDecayTime(float decayTime) { + this.decayTime = decayTime; + return this; + } + + public Vector2 getPosition() { + return this.position; + } + + public Vector2 getVelocity() { + return this.velocity; + } + + public Vector2 getGravity() { + return this.gravity; + } + + public Vector2 getSize() { + return this.size; + } + + public Color getColor() { + return this.color; + } + + public float getCreationTime() { + return this.creationTime; + } + + public float getDecayTime() { + return this.decayTime; + } + +} diff --git a/core/src/com/saltosion/gladiator/listeners/BasicDeathListener.java b/core/src/com/saltosion/gladiator/listeners/BasicDeathListener.java index 16d483a..8e3660d 100644 --- a/core/src/com/saltosion/gladiator/listeners/BasicDeathListener.java +++ b/core/src/com/saltosion/gladiator/listeners/BasicDeathListener.java @@ -1,17 +1,46 @@ package com.saltosion.gladiator.listeners; import com.badlogic.ashley.core.Entity; +import com.saltosion.gladiator.components.CParticle; +import com.saltosion.gladiator.components.CPhysics; +import com.saltosion.gladiator.util.AppUtil; import com.saltosion.gladiator.util.Global; public class BasicDeathListener implements CombatListener { + private static final float FX_FORCE = 16f, FX_GRAV = -40f; + private static final int FX_HIT_AMT = 4, FX_DEAD_AMT = 96; + @Override public void died(Entity source, Entity target, int damageTaken) { target.flags &= ~Global.FLAG_ALIVE; + + CPhysics cp = target.getComponent(CPhysics.class); + for (int i = 0; i < FX_DEAD_AMT; i++) { + Entity fx = new Entity(); + fx.add(new CParticle().setColor(1, 0, 0, 1).setDecayTime(2).setGravity(0, FX_GRAV) + .setVelocity((float) Math.cos(Math.toRadians(Math.random() * 360)) * FX_FORCE, + (float) Math.sin(Math.toRadians(Math.random() * 360)) * FX_FORCE) + .setPosition(cp.getPosition().x + (float) Math.random() - 0.5f, + cp.getPosition().y + (float) Math.random() - 0.5f) + .setSize(0.2f, 0.2f)); + AppUtil.engine.addEntity(fx); + } } @Override public void damageTaken(Entity source, Entity target, int damageTaken) { + CPhysics cp = target.getComponent(CPhysics.class); + for (int i = 0; i < FX_HIT_AMT; i++) { + Entity fx = new Entity(); + fx.add(new CParticle().setColor(1, 0, 0, 1).setDecayTime(2).setGravity(0, FX_GRAV) + .setVelocity((float) Math.cos(Math.toRadians(Math.random() * 360)) * FX_FORCE, + (float) Math.sin(Math.toRadians(Math.random() * 360)) * FX_FORCE) + .setPosition(cp.getPosition().x + (float) Math.random() - 0.5f, + cp.getPosition().y + (float) Math.random() - 0.5f) + .setSize(0.2f, 0.2f)); + AppUtil.engine.addEntity(fx); + } } } diff --git a/core/src/com/saltosion/gladiator/listeners/SwingHitboxListener.java b/core/src/com/saltosion/gladiator/listeners/SwingHitboxListener.java index 693fb51..d9dcabd 100644 --- a/core/src/com/saltosion/gladiator/listeners/SwingHitboxListener.java +++ b/core/src/com/saltosion/gladiator/listeners/SwingHitboxListener.java @@ -38,16 +38,14 @@ public class SwingHitboxListener implements CollisionListener { CPhysics otherPhysics = pm.get(other); if (otherPhysics != null && otherPhysics.getCollisionListener() != null && otherPhysics.getCollisionListener() instanceof SwingHitboxListener) { - float x = 0, y = 0; + float x = 0; if (direction == Direction.LEFT) { x = 1; } else if (direction == Direction.RIGHT) { x = -1; - } else if (direction == Direction.DOWN) { - y = 1; } float force = cm.get(source).getSwingForce(); - pm.get(source).setSimVelocity(x * force, y * force / 8f); + pm.get(source).setSimVelocity(x * force, 0); } } diff --git a/core/src/com/saltosion/gladiator/state/InGameState.java b/core/src/com/saltosion/gladiator/state/InGameState.java index 3b54ae1..f00f77c 100644 --- a/core/src/com/saltosion/gladiator/state/InGameState.java +++ b/core/src/com/saltosion/gladiator/state/InGameState.java @@ -55,7 +55,7 @@ public class InGameState extends BaseState { } if (level.levelFailed()) { - setState(new GameOverState()); + //setState(new GameOverState()); } } diff --git a/core/src/com/saltosion/gladiator/systems/ParticleSystem.java b/core/src/com/saltosion/gladiator/systems/ParticleSystem.java new file mode 100644 index 0000000..3be7561 --- /dev/null +++ b/core/src/com/saltosion/gladiator/systems/ParticleSystem.java @@ -0,0 +1,38 @@ +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.CParticle; +import com.saltosion.gladiator.util.AppUtil; + +public class ParticleSystem extends EntitySystem { + + private static final ComponentMapper pm = ComponentMapper.getFor(CParticle.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++) { + CParticle particle = pm.get(entities.get(i)); + particle.getPosition().add(particle.getVelocity().cpy().scl(deltaTime)); + particle.getVelocity().add(particle.getGravity().cpy().scl(deltaTime)); + if (System.currentTimeMillis() - particle.getCreationTime() > particle.getDecayTime()) { + AppUtil.engine.removeEntity(entities.get(i)); + } + } + } + + public void updateEntities(Engine engine) { + entities = engine.getEntitiesFor(Family.getFor(CParticle.class)); + } + +} diff --git a/core/src/com/saltosion/gladiator/systems/RenderingSystem.java b/core/src/com/saltosion/gladiator/systems/RenderingSystem.java index aeca46c..1f1378d 100644 --- a/core/src/com/saltosion/gladiator/systems/RenderingSystem.java +++ b/core/src/com/saltosion/gladiator/systems/RenderingSystem.java @@ -1,6 +1,7 @@ package com.saltosion.gladiator.systems; import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.ComponentType; import com.badlogic.ashley.core.Engine; import com.badlogic.ashley.core.Entity; import com.badlogic.ashley.core.EntitySystem; @@ -18,6 +19,7 @@ import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType; import com.badlogic.gdx.math.Vector2; import com.saltosion.gladiator.components.CCombat; +import com.saltosion.gladiator.components.CParticle; import com.saltosion.gladiator.components.CPhysics; import com.saltosion.gladiator.components.CRenderedObject; import com.saltosion.gladiator.gui.nodes.GUINode; @@ -26,6 +28,7 @@ import com.saltosion.gladiator.gui.nodes.TextNode; import com.saltosion.gladiator.gui.properties.TextProperty; import com.saltosion.gladiator.util.AppUtil; import com.saltosion.gladiator.util.Global; +import com.saltosion.gladiator.util.Log; import com.saltosion.gladiator.util.SpriteLoader; import com.saltosion.gladiator.util.SpriteSequence; import java.util.ArrayList; @@ -36,11 +39,12 @@ public class RenderingSystem extends EntitySystem { private final ComponentMapper rom = ComponentMapper.getFor(CRenderedObject.class); private final ComponentMapper pm = ComponentMapper.getFor(CPhysics.class); private final ComponentMapper cm = ComponentMapper.getFor(CCombat.class); + private final ComponentMapper pam = ComponentMapper.getFor(CParticle.class); private ImmutableArray entities; private SpriteBatch batch; private BitmapFont font; - private ShapeRenderer debugRenderer; + private ShapeRenderer debugRenderer, particleRenderer; private OrthographicCamera camera, fontCamera; public float aspectratio; @@ -69,6 +73,7 @@ public class RenderingSystem extends EntitySystem { font.setUseIntegerPositions(false); debugRenderer = new ShapeRenderer(); + particleRenderer = new ShapeRenderer(); camera = new OrthographicCamera(); camera.setToOrtho(false, 1, 1); @@ -99,8 +104,9 @@ public class RenderingSystem extends EntitySystem { updateEntityAnimations(); renderEntities(deltaTime); + renderParticles(); + renderDebug(); renderGUI(new Vector2(0, 0)); - renderDebug(camera); if (debug) { drawString("FPS: " + Gdx.graphics.getFramesPerSecond(), new Vector2(camera.position.x - 12, camera.position.y + 8)); @@ -254,7 +260,28 @@ public class RenderingSystem extends EntitySystem { } } - private void renderDebug(Camera camera) { + private void renderParticles() { + if (AppUtil.player == null) { + return; + } + CPhysics playerPhys = pm.get(AppUtil.player); + particleRenderer.setProjectionMatrix(camera.combined); + particleRenderer.begin(ShapeType.Filled); + for (int i = 0; i < entities.size(); i++) { + CParticle particle = pam.get(entities.get(i)); + if (particle == null) { + continue; + } + + particleRenderer.setColor(particle.getColor()); + particleRenderer.rect(particle.getPosition().x - particle.getSize().x / 2 + getCameraOffset(playerPhys).x, + particle.getPosition().y - particle.getSize().y / 2 + getCameraOffset(playerPhys).y, + particle.getSize().x, particle.getSize().y); + } + particleRenderer.end(); + } + + private void renderDebug() { if (debug) { if (AppUtil.player == null) { return; @@ -264,6 +291,10 @@ public class RenderingSystem extends EntitySystem { debugRenderer.begin(ShapeType.Line); for (int i = 0; i < entities.size(); i++) { CPhysics physics = pm.get(entities.get(i)); + if (physics == null) { + continue; + } + float x0 = physics.getPosition().x - physics.getSize().x / 2 + getCameraOffset(playerPhys, physics).x; float x1 = physics.getPosition().x + physics.getSize().x / 2 + getCameraOffset(playerPhys, physics).x; float y0 = physics.getPosition().y - physics.getSize().y / 2 + getCameraOffset(playerPhys, physics).y; @@ -301,7 +332,8 @@ public class RenderingSystem extends EntitySystem { } public void updateEntities(Engine engine) { - entities = engine.getEntitiesFor(Family.getFor(CPhysics.class)); + entities = engine.getEntitiesFor(Family.getFor(ComponentType.getBitsFor(), + ComponentType.getBitsFor(CPhysics.class, CParticle.class), ComponentType.getBitsFor())); } public boolean getDebug() { @@ -316,6 +348,13 @@ public class RenderingSystem extends EntitySystem { return new Vector2(this.camera.position.x, this.camera.position.y); } + private Vector2 getCameraOffset(CPhysics playerPhys) { + Vector2 offset = new Vector2(Math.max(xMin + camera.viewportWidth / 2, Math.min(xMax - camera.viewportWidth / 2, + -playerPhys.getPosition().x)) + camera.viewportWidth / 2, + -playerPhys.getPosition().y + camera.viewportHeight / 3); + return offset; + } + private Vector2 getCameraOffset(CPhysics playerPhys, CPhysics currPhys) { Vector2 offset = new Vector2(Math.max(xMin + camera.viewportWidth / 2, Math.min(xMax - camera.viewportWidth / 2, -playerPhys.getPosition().x)) / currPhys.getZParallax() + camera.viewportWidth / 2, @@ -344,6 +383,7 @@ public class RenderingSystem extends EntitySystem { public void dispose() { batch.dispose(); debugRenderer.dispose(); + particleRenderer.dispose(); font.dispose(); SpriteLoader.dispose(); }