diff --git a/core/src/main/java/org/lumijiez/bugger/entities/weapons/Projectile.java b/core/src/main/java/org/lumijiez/bugger/entities/weapons/Projectile.java index 6a21039..7e44210 100644 --- a/core/src/main/java/org/lumijiez/bugger/entities/weapons/Projectile.java +++ b/core/src/main/java/org/lumijiez/bugger/entities/weapons/Projectile.java @@ -6,7 +6,7 @@ import org.lumijiez.bugger.entities.Entity; public abstract class Projectile extends Entity { - private float timeAlive = 0f; + protected float timeAlive = 0f; public Projectile(World world, String texturePath, float size) { super(world, texturePath, size); @@ -61,4 +61,9 @@ public abstract class Projectile extends Entity { public void render() { super.render(); } + + @Override + public void destroy() { + markedToDestroy = true; + } } diff --git a/core/src/main/java/org/lumijiez/bugger/entities/weapons/Ray.java b/core/src/main/java/org/lumijiez/bugger/entities/weapons/Ray.java index d0d6a1a..8d61f38 100644 --- a/core/src/main/java/org/lumijiez/bugger/entities/weapons/Ray.java +++ b/core/src/main/java/org/lumijiez/bugger/entities/weapons/Ray.java @@ -5,19 +5,36 @@ import com.badlogic.gdx.physics.box2d.*; import org.lumijiez.bugger.Bugger; public class Ray extends Projectile { + float speed = 5000f; + + public Ray(World world) { + super(world,"images/blaze.png", 5f); + this.body.setUserData(this); + } public Ray(World world, Vector2 position, Vector2 direction) { super(world, position, direction, "images/blaze.png", 5f); - this.body.setUserData(this); } public Ray(World world, Vector2 position, Vector2 direction, float speed) { super(world, position, direction, "images/blaze.png", 5f, speed); - + this.speed = speed; this.body.setUserData(this); } + public void init(Vector2 position, Vector2 direction) { + this.body.setTransform(position, (float) (direction.angleRad() + Math.toRadians(270f))); + this.body.setLinearVelocity(direction.nor().scl(speed)); + } + + public void reset() { + timeAlive = 0f; + markedToDestroy = false; + this.body.setLinearVelocity(Vector2.Zero); + this.body.setTransform(Vector2.Zero, 0f); + } + @Override public void render() { sprite.setOrigin(size / 2, size / 2); diff --git a/core/src/main/java/org/lumijiez/bugger/handlers/CleanupHandler.java b/core/src/main/java/org/lumijiez/bugger/handlers/CleanupHandler.java index ba1aee6..ceaf035 100644 --- a/core/src/main/java/org/lumijiez/bugger/handlers/CleanupHandler.java +++ b/core/src/main/java/org/lumijiez/bugger/handlers/CleanupHandler.java @@ -25,16 +25,16 @@ public class CleanupHandler { public void tryClean() { Array entities = entitiesToDestroy; - Array projectiles = ProjectileHandler.getInstance().getProjectiles(); + //Array projectiles = ProjectileHandler.getInstance().getDeployedProjectiles(); List enemies = EnemyHandler.getInstance().getEnemies(); World world = Bugger.getInstance().getWorld(); for (Entity entity : entities) { world.destroyBody(entity.getBody()); - if (entity instanceof Projectile) { - projectiles.removeValue((Projectile) entity, true); - } +// if (entity instanceof Projectile) { +// projectiles.removeValue((Projectile) entity, true); +// } if (entity instanceof EnemyEntity) { ParticleHandler.getInstance().playEffect(entity.getBody().getPosition().x, entity.getBody().getPosition().y); diff --git a/core/src/main/java/org/lumijiez/bugger/handlers/InputHandler.java b/core/src/main/java/org/lumijiez/bugger/handlers/InputHandler.java index 4032a31..8a08448 100644 --- a/core/src/main/java/org/lumijiez/bugger/handlers/InputHandler.java +++ b/core/src/main/java/org/lumijiez/bugger/handlers/InputHandler.java @@ -18,7 +18,7 @@ public class InputHandler { } public void handleInput() { - if (Gdx.input.isButtonPressed(Input.Buttons.LEFT)) { + if (Gdx.input.isButtonJustPressed(Input.Buttons.LEFT)) { ProjectileHandler.getInstance().shootRay(); } diff --git a/core/src/main/java/org/lumijiez/bugger/handlers/InterfaceHandler.java b/core/src/main/java/org/lumijiez/bugger/handlers/InterfaceHandler.java index 372fcf1..afc5fa3 100644 --- a/core/src/main/java/org/lumijiez/bugger/handlers/InterfaceHandler.java +++ b/core/src/main/java/org/lumijiez/bugger/handlers/InterfaceHandler.java @@ -27,7 +27,7 @@ public class InterfaceHandler { OrthographicCamera uiCam = CameraHandler.getInstance().getUICamera(); int kills = Bugger.kills; int enemies = EnemyHandler.getInstance().getEnemies().size(); - int projectiles = ProjectileHandler.getInstance().getProjectiles().size; + int projectiles = ProjectileHandler.getInstance().getDeployedProjectiles().size; int bodies = Bugger.getInstance().getWorld().getBodyCount(); uiBatch.begin(); diff --git a/core/src/main/java/org/lumijiez/bugger/handlers/ProjectileHandler.java b/core/src/main/java/org/lumijiez/bugger/handlers/ProjectileHandler.java index 1239325..65fa1e3 100644 --- a/core/src/main/java/org/lumijiez/bugger/handlers/ProjectileHandler.java +++ b/core/src/main/java/org/lumijiez/bugger/handlers/ProjectileHandler.java @@ -6,14 +6,20 @@ import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.utils.Array; import org.lumijiez.bugger.Bugger; import org.lumijiez.bugger.entities.Player; -import org.lumijiez.bugger.entities.weapons.Projectile; import org.lumijiez.bugger.entities.weapons.Ray; public class ProjectileHandler { - private final Array projectiles = new Array<>(); + private final Array deployedProjectiles = new Array<>(); + private final Array freeProjectiles = new Array<>(); private static ProjectileHandler instance; - private ProjectileHandler() {} + private static final int INITIAL_PROJECTILES = 50; + + private ProjectileHandler() { + for (int i = 0; i < INITIAL_PROJECTILES; i++) { + freeProjectiles.add(new Ray(Bugger.getInstance().getWorld())); + } + } public static ProjectileHandler getInstance() { if (instance == null) { @@ -23,12 +29,16 @@ public class ProjectileHandler { } public void cycle(float delta) { - for (Projectile arrow : projectiles) { - if (!arrow.isMarkedToDestroy()) { - arrow.update(delta); - arrow.render(); + for (int i = 0; i < deployedProjectiles.size; i++) { + Ray ray = deployedProjectiles.get(i); + if (!ray.isMarkedToDestroy()) { + ray.update(delta); + ray.render(); } else { - CleanupHandler.getInstance().getEntitiesToDestroy().add(arrow); + ray.reset(); + freeProjectiles.add(ray); + deployedProjectiles.removeIndex(i); + i--; } } } @@ -44,15 +54,26 @@ public class ProjectileHandler { Vector2 playerPos = Player.getInstance().getPosition(); direction.set(mousePosition.x, mousePosition.y).sub(playerPos).nor(); - projectiles.add(new Ray(Bugger.getInstance().getWorld(), playerPos, direction)); + shootRay(playerPos, direction, 20f); } public void shootRay(Vector2 position, Vector2 direction, float speed) { - projectiles.add(new Ray(Bugger.getInstance().getWorld(), position, direction, speed)); + Ray projectile; + + if (freeProjectiles.size > 0) { + projectile = freeProjectiles.pop(); + } else if (deployedProjectiles.size > 0) { + projectile = deployedProjectiles.first(); + deployedProjectiles.removeIndex(0); + } else { + return; + } + + projectile.init(position, direction.nor().scl(speed)); + deployedProjectiles.add(projectile); } - - public Array getProjectiles() { - return projectiles; + public Array getDeployedProjectiles() { + return deployedProjectiles; } }