more effects, pretty logic, optimization
This commit is contained in:
159
assets/particles/hit.p
Normal file
159
assets/particles/hit.p
Normal file
@@ -0,0 +1,159 @@
|
||||
Glitch
|
||||
- Delay -
|
||||
active: false
|
||||
- Duration -
|
||||
lowMin: 2.0
|
||||
lowMax: 2.0
|
||||
- Count -
|
||||
min: 0
|
||||
max: 200
|
||||
- Emission -
|
||||
lowMin: 0.0
|
||||
lowMax: 0.0
|
||||
highMin: 14.0
|
||||
highMax: 14.0
|
||||
relative: false
|
||||
scalingCount: 1
|
||||
scaling0: 1.0
|
||||
timelineCount: 1
|
||||
timeline0: 0.0
|
||||
- Life -
|
||||
lowMin: 0.0
|
||||
lowMax: 0.0
|
||||
highMin: 500.0
|
||||
highMax: 500.0
|
||||
relative: false
|
||||
scalingCount: 1
|
||||
scaling0: 1.0
|
||||
timelineCount: 1
|
||||
timeline0: 0.0
|
||||
independent: false
|
||||
- Life Offset -
|
||||
active: false
|
||||
independent: false
|
||||
- X Offset -
|
||||
active: true
|
||||
lowMin: -3.0
|
||||
lowMax: 3.0
|
||||
highMin: 0.0
|
||||
highMax: 0.0
|
||||
relative: false
|
||||
scalingCount: 1
|
||||
scaling0: 1.0
|
||||
timelineCount: 1
|
||||
timeline0: 0.0
|
||||
- Y Offset -
|
||||
active: true
|
||||
lowMin: -3.0
|
||||
lowMax: 3.0
|
||||
highMin: 0.0
|
||||
highMax: 0.0
|
||||
relative: false
|
||||
scalingCount: 1
|
||||
scaling0: 1.0
|
||||
timelineCount: 1
|
||||
timeline0: 0.0
|
||||
- Spawn Shape -
|
||||
shape: point
|
||||
- Spawn Width -
|
||||
lowMin: 0.0
|
||||
lowMax: 0.0
|
||||
highMin: 0.0
|
||||
highMax: 0.0
|
||||
relative: false
|
||||
scalingCount: 1
|
||||
scaling0: 1.0
|
||||
timelineCount: 1
|
||||
timeline0: 0.0
|
||||
- Spawn Height -
|
||||
lowMin: 0.0
|
||||
lowMax: 0.0
|
||||
highMin: 0.0
|
||||
highMax: 0.0
|
||||
relative: false
|
||||
scalingCount: 1
|
||||
scaling0: 1.0
|
||||
timelineCount: 1
|
||||
timeline0: 0.0
|
||||
- X Scale -
|
||||
lowMin: 0.0
|
||||
lowMax: 0.0
|
||||
highMin: 200.0
|
||||
highMax: 200.0
|
||||
relative: false
|
||||
scalingCount: 1
|
||||
scaling0: 1.0
|
||||
timelineCount: 1
|
||||
timeline0: 0.0
|
||||
- Y Scale -
|
||||
active: false
|
||||
- Velocity -
|
||||
active: false
|
||||
- Angle -
|
||||
active: false
|
||||
- Rotation -
|
||||
active: false
|
||||
- Wind -
|
||||
active: false
|
||||
- Gravity -
|
||||
active: false
|
||||
- Tint -
|
||||
colorsCount: 27
|
||||
colors0: 1.0
|
||||
colors1: 0.047058824
|
||||
colors2: 0.047058824
|
||||
colors3: 1.0
|
||||
colors4: 0.69411767
|
||||
colors5: 0.047058824
|
||||
colors6: 0.95686275
|
||||
colors7: 1.0
|
||||
colors8: 0.047058824
|
||||
colors9: 0.047058824
|
||||
colors10: 1.0
|
||||
colors11: 0.09019608
|
||||
colors12: 0.047058824
|
||||
colors13: 0.9254902
|
||||
colors14: 1.0
|
||||
colors15: 0.047058824
|
||||
colors16: 0.11764706
|
||||
colors17: 1.0
|
||||
colors18: 0.4509804
|
||||
colors19: 0.047058824
|
||||
colors20: 1.0
|
||||
colors21: 1.0
|
||||
colors22: 0.047058824
|
||||
colors23: 0.972549
|
||||
colors24: 1.0
|
||||
colors25: 0.047058824
|
||||
colors26: 0.047058824
|
||||
timelineCount: 9
|
||||
timeline0: 0.0
|
||||
timeline1: 0.16351119
|
||||
timeline2: 0.2616179
|
||||
timeline3: 0.38554215
|
||||
timeline4: 0.51979345
|
||||
timeline5: 0.6506024
|
||||
timeline6: 0.7555938
|
||||
timeline7: 0.8915663
|
||||
timeline8: 1.0
|
||||
- Transparency -
|
||||
lowMin: 0.0
|
||||
lowMax: 0.0
|
||||
highMin: 1.0
|
||||
highMax: 1.0
|
||||
relative: false
|
||||
scalingCount: 1
|
||||
scaling0: 1.0
|
||||
timelineCount: 1
|
||||
timeline0: 0.0
|
||||
- Options -
|
||||
attached: true
|
||||
continuous: false
|
||||
aligned: false
|
||||
additive: true
|
||||
behind: false
|
||||
premultipliedAlpha: false
|
||||
spriteMode: single
|
||||
- Image Paths -
|
||||
hit.png
|
||||
|
||||
BIN
assets/particles/hit.png
Normal file
BIN
assets/particles/hit.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.8 KiB |
159
assets/particles/logo.p
Normal file
159
assets/particles/logo.p
Normal file
@@ -0,0 +1,159 @@
|
||||
Glitch
|
||||
- Delay -
|
||||
active: false
|
||||
- Duration -
|
||||
lowMin: 50.0
|
||||
lowMax: 50.0
|
||||
- Count -
|
||||
min: 0
|
||||
max: 200
|
||||
- Emission -
|
||||
lowMin: 20.0
|
||||
lowMax: 20.0
|
||||
highMin: 50.0
|
||||
highMax: 50.0
|
||||
relative: false
|
||||
scalingCount: 1
|
||||
scaling0: 1.0
|
||||
timelineCount: 1
|
||||
timeline0: 0.0
|
||||
- Life -
|
||||
lowMin: 50.0
|
||||
lowMax: 50.0
|
||||
highMin: 500.0
|
||||
highMax: 500.0
|
||||
relative: false
|
||||
scalingCount: 1
|
||||
scaling0: 1.0
|
||||
timelineCount: 1
|
||||
timeline0: 0.0
|
||||
independent: false
|
||||
- Life Offset -
|
||||
active: false
|
||||
independent: false
|
||||
- X Offset -
|
||||
active: true
|
||||
lowMin: -3.0
|
||||
lowMax: 3.0
|
||||
highMin: 0.0
|
||||
highMax: 0.0
|
||||
relative: false
|
||||
scalingCount: 1
|
||||
scaling0: 1.0
|
||||
timelineCount: 1
|
||||
timeline0: 0.0
|
||||
- Y Offset -
|
||||
active: true
|
||||
lowMin: -3.0
|
||||
lowMax: 3.0
|
||||
highMin: 0.0
|
||||
highMax: 0.0
|
||||
relative: false
|
||||
scalingCount: 1
|
||||
scaling0: 1.0
|
||||
timelineCount: 1
|
||||
timeline0: 0.0
|
||||
- Spawn Shape -
|
||||
shape: point
|
||||
- Spawn Width -
|
||||
lowMin: 0.0
|
||||
lowMax: 0.0
|
||||
highMin: 0.0
|
||||
highMax: 0.0
|
||||
relative: false
|
||||
scalingCount: 1
|
||||
scaling0: 1.0
|
||||
timelineCount: 1
|
||||
timeline0: 0.0
|
||||
- Spawn Height -
|
||||
lowMin: 0.0
|
||||
lowMax: 0.0
|
||||
highMin: 0.0
|
||||
highMax: 0.0
|
||||
relative: false
|
||||
scalingCount: 1
|
||||
scaling0: 1.0
|
||||
timelineCount: 1
|
||||
timeline0: 0.0
|
||||
- X Scale -
|
||||
lowMin: 0.0
|
||||
lowMax: 0.0
|
||||
highMin: 200.0
|
||||
highMax: 200.0
|
||||
relative: false
|
||||
scalingCount: 1
|
||||
scaling0: 1.0
|
||||
timelineCount: 1
|
||||
timeline0: 0.0
|
||||
- Y Scale -
|
||||
active: false
|
||||
- Velocity -
|
||||
active: false
|
||||
- Angle -
|
||||
active: false
|
||||
- Rotation -
|
||||
active: false
|
||||
- Wind -
|
||||
active: false
|
||||
- Gravity -
|
||||
active: false
|
||||
- Tint -
|
||||
colorsCount: 27
|
||||
colors0: 1.0
|
||||
colors1: 0.047058824
|
||||
colors2: 0.047058824
|
||||
colors3: 1.0
|
||||
colors4: 0.69411767
|
||||
colors5: 0.047058824
|
||||
colors6: 0.95686275
|
||||
colors7: 1.0
|
||||
colors8: 0.047058824
|
||||
colors9: 0.047058824
|
||||
colors10: 1.0
|
||||
colors11: 0.09019608
|
||||
colors12: 0.047058824
|
||||
colors13: 0.9254902
|
||||
colors14: 1.0
|
||||
colors15: 0.047058824
|
||||
colors16: 0.11764706
|
||||
colors17: 1.0
|
||||
colors18: 0.4509804
|
||||
colors19: 0.047058824
|
||||
colors20: 1.0
|
||||
colors21: 1.0
|
||||
colors22: 0.047058824
|
||||
colors23: 0.972549
|
||||
colors24: 1.0
|
||||
colors25: 0.047058824
|
||||
colors26: 0.047058824
|
||||
timelineCount: 9
|
||||
timeline0: 0.0
|
||||
timeline1: 0.16351119
|
||||
timeline2: 0.2616179
|
||||
timeline3: 0.38554215
|
||||
timeline4: 0.51979345
|
||||
timeline5: 0.6506024
|
||||
timeline6: 0.7555938
|
||||
timeline7: 0.8915663
|
||||
timeline8: 1.0
|
||||
- Transparency -
|
||||
lowMin: 0.0
|
||||
lowMax: 0.0
|
||||
highMin: 1.0
|
||||
highMax: 1.0
|
||||
relative: false
|
||||
scalingCount: 1
|
||||
scaling0: 1.0
|
||||
timelineCount: 1
|
||||
timeline0: 0.0
|
||||
- Options -
|
||||
attached: true
|
||||
continuous: false
|
||||
aligned: false
|
||||
additive: true
|
||||
behind: false
|
||||
premultipliedAlpha: false
|
||||
spriteMode: single
|
||||
- Image Paths -
|
||||
logo.png
|
||||
|
||||
BIN
assets/particles/logo.png
Normal file
BIN
assets/particles/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.8 KiB |
@@ -3,19 +3,25 @@ package org.lumijiez.bugger;
|
||||
import com.badlogic.gdx.Gdx;
|
||||
import com.badlogic.gdx.graphics.GL20;
|
||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
||||
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
|
||||
import com.badlogic.gdx.math.Vector2;
|
||||
import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer;
|
||||
import com.badlogic.gdx.physics.box2d.World;
|
||||
import com.badlogic.gdx.scenes.scene2d.Action;
|
||||
import com.badlogic.gdx.scenes.scene2d.actions.Actions;
|
||||
import org.lumijiez.bugger.entities.Player;
|
||||
import org.lumijiez.bugger.handlers.*;
|
||||
|
||||
public class Bugger {
|
||||
public static float deltaTime = 0f;
|
||||
private static Bugger instance;
|
||||
private final World world = new World(new Vector2(0, 0), true);
|
||||
private final Box2DDebugRenderer debugRenderer = new Box2DDebugRenderer();
|
||||
public static ShapeRenderer shapeRenderer = new ShapeRenderer();
|
||||
public static SpriteBatch spriteBatch = new SpriteBatch();
|
||||
public static SpriteBatch uiBatch = new SpriteBatch();
|
||||
public static int kills = 0;
|
||||
private boolean logoPlayed = false;
|
||||
|
||||
private Bugger() {
|
||||
Player.getInstance().setPlayer(world, 100, 100);
|
||||
@@ -30,12 +36,14 @@ public class Bugger {
|
||||
}
|
||||
|
||||
public void cycle(float delta) {
|
||||
deltaTime = delta;
|
||||
renderClear();
|
||||
SpaceVFXHandler.getInstance().render();
|
||||
|
||||
step();
|
||||
|
||||
ProjectileHandler.getInstance().cycle(delta);
|
||||
EnemyProjectileHandler.getInstance().cycle(delta);
|
||||
EnemyHandler.getInstance().cycle();
|
||||
ParticleHandler.getInstance().cycle(delta);
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package org.lumijiez.bugger.entities;
|
||||
|
||||
import com.badlogic.gdx.Gdx;
|
||||
import com.badlogic.gdx.Input;
|
||||
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
|
||||
import com.badlogic.gdx.math.Vector3;
|
||||
import com.badlogic.gdx.physics.box2d.*;
|
||||
import com.badlogic.gdx.math.Vector2;
|
||||
@@ -9,9 +10,13 @@ import org.lumijiez.bugger.Bugger;
|
||||
import org.lumijiez.bugger.entities.weapons.Ray;
|
||||
import org.lumijiez.bugger.handlers.CameraHandler;
|
||||
|
||||
import static org.lumijiez.bugger.Bugger.shapeRenderer;
|
||||
|
||||
public class Player extends Entity {
|
||||
private static Player instance;
|
||||
|
||||
private int health = 1000;
|
||||
|
||||
private Player() {
|
||||
super(null, "images/wasp.png", 10f);
|
||||
}
|
||||
@@ -49,6 +54,7 @@ public class Player extends Entity {
|
||||
public void setPlayer(World world, float x, float y) {
|
||||
this.world = world;
|
||||
this.body = createBody(x, y);
|
||||
this.body.setUserData(this);
|
||||
}
|
||||
|
||||
public void move(float deltaX, float deltaY) {
|
||||
@@ -61,6 +67,7 @@ public class Player extends Entity {
|
||||
handleInput();
|
||||
updateSpriteRotation();
|
||||
super.render();
|
||||
renderHealthBar();
|
||||
}
|
||||
|
||||
public void handleInput() {
|
||||
@@ -87,4 +94,29 @@ public class Player extends Entity {
|
||||
body.setTransform(body.getPosition(), angle * (float) Math.PI / 180f);
|
||||
sprite.setRotation(body.getAngle() * (180f / (float) Math.PI));
|
||||
}
|
||||
|
||||
public void damage(int damage) {
|
||||
health -= damage;
|
||||
}
|
||||
|
||||
public int getHealth() {
|
||||
return health;
|
||||
}
|
||||
|
||||
private void renderHealthBar() {
|
||||
float maxHealth = 1000f;
|
||||
float healthPercentage = Math.max(health / maxHealth, 0);
|
||||
float healthBarWidth = 8f;
|
||||
float healthBarHeight = 1f;
|
||||
float healthBarX = body.getPosition().x - healthBarWidth / 2;
|
||||
float healthBarY = body.getPosition().y + size - 17;
|
||||
|
||||
shapeRenderer.setProjectionMatrix(CameraHandler.getInstance().getCamera().combined);
|
||||
shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
|
||||
|
||||
shapeRenderer.setColor(1, 0, 0, 1);
|
||||
shapeRenderer.rect(healthBarX, healthBarY, healthBarWidth * healthPercentage, healthBarHeight);
|
||||
|
||||
shapeRenderer.end();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,8 +5,12 @@ import com.badlogic.gdx.physics.box2d.World;
|
||||
import org.lumijiez.bugger.Bugger;
|
||||
import org.lumijiez.bugger.entities.Entity;
|
||||
import org.lumijiez.bugger.entities.Player;
|
||||
import org.lumijiez.bugger.handlers.EnemyProjectileHandler;
|
||||
import org.lumijiez.bugger.handlers.ProjectileHandler;
|
||||
|
||||
public class EnemyEntity extends Entity {
|
||||
private float shootTimer = 0.0f;
|
||||
|
||||
public EnemyEntity(World world, String texturePath, float size) {
|
||||
super(world, texturePath, size);
|
||||
}
|
||||
@@ -27,6 +31,14 @@ public class EnemyEntity extends Entity {
|
||||
|
||||
float angle = direction.angleDeg() + 270f;
|
||||
body.setTransform(body.getPosition(), angle * (float) Math.PI / 180f);
|
||||
|
||||
shootTimer += Bugger.deltaTime;
|
||||
|
||||
float shootCooldown = 2.0f;
|
||||
if (shootTimer >= shootCooldown) {
|
||||
EnemyProjectileHandler.getInstance().shootEnemyProjectile(this.body.getPosition(), playerPos, 50f);
|
||||
shootTimer = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
public void cycle(Vector2 target) {
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
package org.lumijiez.bugger.entities.weapons;
|
||||
|
||||
import com.badlogic.gdx.math.Vector2;
|
||||
import com.badlogic.gdx.physics.box2d.*;
|
||||
import org.lumijiez.bugger.entities.Entity;
|
||||
|
||||
public abstract class EnemyProjectile extends Entity {
|
||||
|
||||
protected float timeAlive = 0f;
|
||||
protected boolean isEnemy = false;
|
||||
|
||||
public EnemyProjectile(World world, String texturePath, float size, boolean isEnemy) {
|
||||
super(world, texturePath, size);
|
||||
this.isEnemy = isEnemy;
|
||||
this.body = createBody(0, 0);
|
||||
}
|
||||
|
||||
public EnemyProjectile(World world, Vector2 position, Vector2 direction, String texturePath, float size) {
|
||||
super(world, texturePath, size);
|
||||
Vector2 offsetPosition = position.cpy().add(direction.nor().scl(size + 1f));
|
||||
this.body = createBody(offsetPosition.x, offsetPosition.y);
|
||||
this.body.setTransform(offsetPosition, (float) (direction.angleRad() + Math.toRadians(270f)));
|
||||
this.body.setLinearVelocity(direction.nor().scl(5000f));
|
||||
}
|
||||
|
||||
public EnemyProjectile(World world, Vector2 position, Vector2 direction, String texturePath, float size, float speed) {
|
||||
super(world, texturePath, size);
|
||||
Vector2 offsetPosition = position.cpy().add(direction.nor().scl(size + 1f));
|
||||
this.body = createBody(offsetPosition.x, offsetPosition.y);
|
||||
this.body.setTransform(offsetPosition, (float) (direction.angleRad() + Math.toRadians(270f)));
|
||||
this.body.setLinearVelocity(direction.nor().scl(speed));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected Body createBody(float x, float y) {
|
||||
BodyDef bodyDef = new BodyDef();
|
||||
bodyDef.position.set(x, y);
|
||||
bodyDef.type = BodyDef.BodyType.DynamicBody;
|
||||
bodyDef.gravityScale = 0;
|
||||
|
||||
Body body = world.createBody(bodyDef);
|
||||
PolygonShape shape = new PolygonShape();
|
||||
shape.setAsBox(size / 3, size + 2);
|
||||
|
||||
FixtureDef fixtureDef = new FixtureDef();
|
||||
fixtureDef.shape = shape;
|
||||
fixtureDef.isSensor = true;
|
||||
body.createFixture(fixtureDef);
|
||||
|
||||
shape.dispose();
|
||||
return body;
|
||||
}
|
||||
|
||||
public void update(float delta) {
|
||||
timeAlive += delta;
|
||||
float lifetime = 3f;
|
||||
if (timeAlive >= lifetime) {
|
||||
markedToDestroy = true;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isEnemy() {
|
||||
return isEnemy;
|
||||
}
|
||||
|
||||
public void render() {
|
||||
super.render();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroy() {
|
||||
markedToDestroy = true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
package org.lumijiez.bugger.entities.weapons;
|
||||
|
||||
import com.badlogic.gdx.math.Vector2;
|
||||
import com.badlogic.gdx.physics.box2d.World;
|
||||
import org.lumijiez.bugger.Bugger;
|
||||
|
||||
public class EnemyRay extends EnemyProjectile {
|
||||
float speed = 5000f;
|
||||
|
||||
public EnemyRay(World world, boolean isEnemy) {
|
||||
super(world,"images/enemyblaze.png", 5f, isEnemy);
|
||||
}
|
||||
|
||||
public EnemyRay(World world, Vector2 position, Vector2 direction) {
|
||||
super(world, position, direction, "images/enemyblaze.png", 5f);
|
||||
this.body.setUserData(this);
|
||||
}
|
||||
|
||||
public EnemyRay(World world, Vector2 position, Vector2 direction, float speed) {
|
||||
super(world, position, direction, "images/enemyblaze.png", 5f, speed);
|
||||
this.speed = speed;
|
||||
this.body.setUserData(this);
|
||||
}
|
||||
|
||||
public void init(Vector2 position, Vector2 direction, boolean isEnemy) {
|
||||
this.isEnemy = isEnemy;
|
||||
this.body.setTransform(position, (float) (direction.angleRad() + Math.toRadians(270f)));
|
||||
this.body.setLinearVelocity(direction.nor().scl(speed));
|
||||
this.body.setUserData(this);
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
timeAlive = 0f;
|
||||
markedToDestroy = false;
|
||||
this.isEnemy = false;
|
||||
this.body.setLinearVelocity(Vector2.Zero);
|
||||
this.body.setTransform(Vector2.Zero, 0f);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render() {
|
||||
sprite.setOrigin(size / 2, size / 2);
|
||||
sprite.setSize(size, size + 5);
|
||||
sprite.setPosition(body.getPosition().x - size / 2, body.getPosition().y - size / 2);
|
||||
sprite.setRotation(body.getAngle() * (180f / (float) Math.PI));
|
||||
Bugger.spriteBatch.begin();
|
||||
sprite.draw(Bugger.spriteBatch);
|
||||
Bugger.spriteBatch.end();
|
||||
}
|
||||
}
|
||||
@@ -7,9 +7,11 @@ import org.lumijiez.bugger.entities.Entity;
|
||||
public abstract class Projectile extends Entity {
|
||||
|
||||
protected float timeAlive = 0f;
|
||||
protected boolean isEnemy = false;
|
||||
|
||||
public Projectile(World world, String texturePath, float size) {
|
||||
public Projectile(World world, String texturePath, float size, boolean isEnemy) {
|
||||
super(world, texturePath, size);
|
||||
this.isEnemy = isEnemy;
|
||||
this.body = createBody(0, 0);
|
||||
}
|
||||
|
||||
@@ -58,6 +60,10 @@ public abstract class Projectile extends Entity {
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isEnemy() {
|
||||
return isEnemy;
|
||||
}
|
||||
|
||||
public void render() {
|
||||
super.render();
|
||||
}
|
||||
|
||||
@@ -7,9 +7,8 @@ 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, boolean isEnemy) {
|
||||
super(world,"images/blaze.png", 5f, isEnemy);
|
||||
}
|
||||
|
||||
public Ray(World world, Vector2 position, Vector2 direction) {
|
||||
@@ -23,14 +22,17 @@ public class Ray extends Projectile {
|
||||
this.body.setUserData(this);
|
||||
}
|
||||
|
||||
public void init(Vector2 position, Vector2 direction) {
|
||||
public void init(Vector2 position, Vector2 direction, boolean isEnemy) {
|
||||
this.isEnemy = isEnemy;
|
||||
this.body.setTransform(position, (float) (direction.angleRad() + Math.toRadians(270f)));
|
||||
this.body.setLinearVelocity(direction.nor().scl(speed));
|
||||
this.body.setUserData(this);
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
timeAlive = 0f;
|
||||
markedToDestroy = false;
|
||||
this.isEnemy = false;
|
||||
this.body.setLinearVelocity(Vector2.Zero);
|
||||
this.body.setTransform(Vector2.Zero, 0f);
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@ import com.badlogic.gdx.utils.Array;
|
||||
import org.lumijiez.bugger.Bugger;
|
||||
import org.lumijiez.bugger.entities.Entity;
|
||||
import org.lumijiez.bugger.entities.enemies.EnemyEntity;
|
||||
import org.lumijiez.bugger.entities.weapons.Projectile;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -37,7 +36,7 @@ public class CleanupHandler {
|
||||
// }
|
||||
|
||||
if (entity instanceof EnemyEntity) {
|
||||
ParticleHandler.getInstance().playEffect(entity.getBody().getPosition().x, entity.getBody().getPosition().y);
|
||||
ParticleHandler.getInstance().playBigBoom(entity.getBody().getPosition().x, entity.getBody().getPosition().y);
|
||||
enemies.remove(entity);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
package org.lumijiez.bugger.handlers;
|
||||
|
||||
import com.badlogic.gdx.Gdx;
|
||||
import com.badlogic.gdx.physics.box2d.*;
|
||||
import org.lumijiez.bugger.Bugger;
|
||||
import org.lumijiez.bugger.entities.Player;
|
||||
import org.lumijiez.bugger.entities.enemies.EnemyEntity;
|
||||
import org.lumijiez.bugger.entities.weapons.EnemyProjectile;
|
||||
import org.lumijiez.bugger.entities.weapons.EnemyRay;
|
||||
import org.lumijiez.bugger.entities.weapons.Ray;
|
||||
|
||||
public class CollisionHandler implements ContactListener {
|
||||
@@ -11,14 +15,35 @@ public class CollisionHandler implements ContactListener {
|
||||
Fixture fixtureA = contact.getFixtureA();
|
||||
Fixture fixtureB = contact.getFixtureB();
|
||||
|
||||
if (isArrow(fixtureA) && isArrow(fixtureB)) {
|
||||
return;
|
||||
Object userDataA = fixtureA.getBody().getUserData();
|
||||
Object userDataB = fixtureB.getBody().getUserData();
|
||||
|
||||
if (isEnemy(fixtureA) && isPlayer(fixtureB)) {
|
||||
EnemyRay ray = (EnemyRay) userDataA;
|
||||
if (ray.isEnemy()) {
|
||||
ray.destroy();
|
||||
Player.getInstance().damage(50);
|
||||
ParticleHandler.getInstance().playSmallBoom(Player.getInstance().getPosition().x, Player.getInstance().getPosition().y);
|
||||
ParticleHandler.getInstance().playHit(Gdx.graphics.getWidth() - 100, Gdx.graphics.getHeight() - 60);
|
||||
}
|
||||
}
|
||||
|
||||
if (isEnemy(fixtureB) && isPlayer(fixtureA)) {
|
||||
EnemyRay ray = (EnemyRay) userDataB;
|
||||
if (ray.isEnemy()) {
|
||||
ray.destroy();
|
||||
Player.getInstance().damage(50);
|
||||
ParticleHandler.getInstance().playSmallBoom(Player.getInstance().getPosition().x, Player.getInstance().getPosition().y);
|
||||
ParticleHandler.getInstance().playHit(Gdx.graphics.getWidth() - 100, Gdx.graphics.getHeight() - 60);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (isArrow(fixtureA) && isEntity(fixtureB)) {
|
||||
Ray ray = (Ray) fixtureA.getBody().getUserData();
|
||||
EnemyEntity enemy = (EnemyEntity) fixtureB.getBody().getUserData();
|
||||
if (ray != null) {
|
||||
if (ray != null && !ray.isEnemy()) {
|
||||
Bugger.kills++;
|
||||
ray.destroy();
|
||||
enemy.destroy();
|
||||
@@ -28,7 +53,7 @@ public class CollisionHandler implements ContactListener {
|
||||
if (isArrow(fixtureB) && isEntity(fixtureA)) {
|
||||
Ray ray = (Ray) fixtureB.getBody().getUserData();
|
||||
EnemyEntity enemy = (EnemyEntity) fixtureA.getBody().getUserData();
|
||||
if (ray != null) {
|
||||
if (ray != null && !ray.isEnemy()) {
|
||||
Bugger.kills++;
|
||||
ray.destroy();
|
||||
enemy.destroy();
|
||||
@@ -53,6 +78,14 @@ public class CollisionHandler implements ContactListener {
|
||||
return fixture.getBody().getUserData() instanceof Ray;
|
||||
}
|
||||
|
||||
private boolean isEnemy(Fixture fixture) {
|
||||
return fixture.getBody().getUserData() instanceof EnemyProjectile;
|
||||
}
|
||||
|
||||
private boolean isPlayer(Fixture fixture) {
|
||||
return fixture.getBody().getUserData() instanceof Player;
|
||||
}
|
||||
|
||||
private boolean isEntity(Fixture fixture) {
|
||||
return fixture.getBody().getUserData() instanceof EnemyEntity;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
package org.lumijiez.bugger.handlers;
|
||||
|
||||
import com.badlogic.gdx.math.Vector2;
|
||||
import com.badlogic.gdx.utils.Array;
|
||||
import org.lumijiez.bugger.Bugger;
|
||||
import org.lumijiez.bugger.entities.Player;
|
||||
import org.lumijiez.bugger.entities.weapons.EnemyRay;
|
||||
|
||||
public class EnemyProjectileHandler {
|
||||
private final Array<EnemyRay> deployedEnemyProjectiles = new Array<>();
|
||||
private final Array<EnemyRay> freeEnemyProjectiles = new Array<>();
|
||||
private static EnemyProjectileHandler instance;
|
||||
private static final int INITIAL_PROJECTILES = 50;
|
||||
|
||||
private EnemyProjectileHandler() {
|
||||
for (int i = 0; i < INITIAL_PROJECTILES; i++) {
|
||||
freeEnemyProjectiles.add(new EnemyRay(Bugger.getInstance().getWorld(), true));
|
||||
}
|
||||
}
|
||||
|
||||
public static EnemyProjectileHandler getInstance() {
|
||||
if (instance == null) {
|
||||
instance = new EnemyProjectileHandler();
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
public void cycle(float delta) {
|
||||
for (int i = 0; i < deployedEnemyProjectiles.size; i++) {
|
||||
EnemyRay ray = deployedEnemyProjectiles.get(i);
|
||||
if (!ray.isMarkedToDestroy()) {
|
||||
ray.update(delta);
|
||||
ray.render();
|
||||
} else {
|
||||
ray.reset();
|
||||
freeEnemyProjectiles.add(ray);
|
||||
deployedEnemyProjectiles.removeIndex(i);
|
||||
i--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void shootEnemyProjectile(Vector2 position, Vector2 direction, float speed) {
|
||||
EnemyRay projectile;
|
||||
|
||||
Vector2 playerPos = Player.getInstance().getPosition();
|
||||
|
||||
Vector2 shootDirection = playerPos.cpy().sub(position).nor();
|
||||
|
||||
if (freeEnemyProjectiles.size > 0) {
|
||||
projectile = freeEnemyProjectiles.pop();
|
||||
} else if (deployedEnemyProjectiles.size > 0) {
|
||||
projectile = deployedEnemyProjectiles.first();
|
||||
deployedEnemyProjectiles.removeIndex(0);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
projectile.init(position, shootDirection.scl(speed), true);
|
||||
deployedEnemyProjectiles.add(projectile);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -5,19 +5,45 @@ import com.badlogic.gdx.graphics.g2d.ParticleEffect;
|
||||
import com.badlogic.gdx.graphics.g2d.ParticleEffectPool;
|
||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
||||
import com.badlogic.gdx.utils.Array;
|
||||
import com.badlogic.gdx.utils.ObjectMap;
|
||||
import org.lumijiez.bugger.Bugger;
|
||||
import org.lumijiez.bugger.entities.Player;
|
||||
|
||||
public class ParticleHandler {
|
||||
private static ParticleHandler instance;
|
||||
private final ParticleEffectPool particleEffectPool;
|
||||
private final ParticleEffectPool bigBoomPool;
|
||||
private final ParticleEffectPool smallBoomPool;
|
||||
private final ParticleEffectPool logoPool;
|
||||
private final ParticleEffectPool hitPool;
|
||||
private final Array<ParticleEffectPool.PooledEffect> activeEffects;
|
||||
private final Array<ParticleEffectPool.PooledEffect> uiEffects;
|
||||
private final ObjectMap<ParticleEffectPool.PooledEffect, String> effectTypes;
|
||||
|
||||
private ParticleHandler() {
|
||||
ParticleEffect effect = new ParticleEffect();
|
||||
effect.load(Gdx.files.internal("particles/boom.p"), Gdx.files.internal("particles"));
|
||||
effect.scaleEffect(0.3f);
|
||||
particleEffectPool = new ParticleEffectPool(effect, 1, 20);
|
||||
ParticleEffect bigBoomEffect = new ParticleEffect();
|
||||
bigBoomEffect.load(Gdx.files.internal("particles/boom.p"), Gdx.files.internal("particles"));
|
||||
bigBoomEffect.scaleEffect(0.3f);
|
||||
|
||||
ParticleEffect smallBoomEffect = new ParticleEffect();
|
||||
smallBoomEffect.load(Gdx.files.internal("particles/boom.p"), Gdx.files.internal("particles"));
|
||||
smallBoomEffect.scaleEffect(0.1f);
|
||||
|
||||
ParticleEffect logoEffect = new ParticleEffect();
|
||||
logoEffect.load(Gdx.files.internal("particles/logo.p"), Gdx.files.internal("particles"));
|
||||
logoEffect.scaleEffect(3f);
|
||||
|
||||
ParticleEffect hitEffect = new ParticleEffect();
|
||||
hitEffect.load(Gdx.files.internal("particles/hit.p"), Gdx.files.internal("particles"));
|
||||
hitEffect.scaleEffect(1.5f);
|
||||
hitEffect.setDuration(1000);
|
||||
|
||||
bigBoomPool = new ParticleEffectPool(bigBoomEffect, 1, 20);
|
||||
smallBoomPool = new ParticleEffectPool(smallBoomEffect, 1, 20);
|
||||
logoPool = new ParticleEffectPool(logoEffect, 1, 5);
|
||||
hitPool = new ParticleEffectPool(hitEffect, 1, 1);
|
||||
activeEffects = new Array<>();
|
||||
uiEffects = new Array<>();
|
||||
effectTypes = new ObjectMap<>();
|
||||
}
|
||||
|
||||
public static ParticleHandler getInstance() {
|
||||
@@ -27,22 +53,66 @@ public class ParticleHandler {
|
||||
return instance;
|
||||
}
|
||||
|
||||
public void playEffect(float x, float y) {
|
||||
ParticleEffectPool.PooledEffect newEffect = particleEffectPool.obtain();
|
||||
public void playBigBoom(float x, float y) {
|
||||
ParticleEffectPool.PooledEffect newEffect = bigBoomPool.obtain();
|
||||
newEffect.setPosition(x, y);
|
||||
newEffect.start();
|
||||
activeEffects.add(newEffect);
|
||||
effectTypes.put(newEffect, "bigBoom");
|
||||
}
|
||||
|
||||
public void playSmallBoom(float x, float y) {
|
||||
ParticleEffectPool.PooledEffect newEffect = smallBoomPool.obtain();
|
||||
newEffect.setPosition(x, y);
|
||||
newEffect.start();
|
||||
activeEffects.add(newEffect);
|
||||
effectTypes.put(newEffect, "smallBoom");
|
||||
}
|
||||
|
||||
public void playLogo(float x, float y) {
|
||||
ParticleEffectPool.PooledEffect newEffect = logoPool.obtain();
|
||||
newEffect.setPosition(x, y);
|
||||
newEffect.start();
|
||||
uiEffects.add(newEffect);
|
||||
effectTypes.put(newEffect, "logoEffect");
|
||||
}
|
||||
|
||||
public void playHit(float x, float y) {
|
||||
ParticleEffectPool.PooledEffect newEffect = hitPool.obtain();
|
||||
newEffect.setPosition(x, y);
|
||||
newEffect.start();
|
||||
uiEffects.add(newEffect);
|
||||
effectTypes.put(newEffect, "hitEffect");
|
||||
}
|
||||
|
||||
public void update(float delta) {
|
||||
for (int i = activeEffects.size - 1; i >= 0; i--) {
|
||||
ParticleEffectPool.PooledEffect effect = activeEffects.get(i);
|
||||
effect.update(delta);
|
||||
|
||||
String effectType = effectTypes.get(effect);
|
||||
if ("bigBoom".equals(effectType)) {
|
||||
// ToDo
|
||||
} else if ("smallBoom".equals(effectType)) {
|
||||
effect.setPosition(Player.getInstance().getPosition().x,
|
||||
Player.getInstance().getPosition().y);
|
||||
}
|
||||
|
||||
if (effect.isComplete()) {
|
||||
effect.free();
|
||||
activeEffects.removeIndex(i);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = uiEffects.size - 1; i >= 0; i--) {
|
||||
ParticleEffectPool.PooledEffect effect = uiEffects.get(i);
|
||||
effect.update(delta);
|
||||
|
||||
if (effect.isComplete()) {
|
||||
effect.free();
|
||||
uiEffects.removeIndex(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void render(SpriteBatch spriteBatch) {
|
||||
@@ -51,11 +121,18 @@ public class ParticleHandler {
|
||||
effect.draw(spriteBatch);
|
||||
Bugger.spriteBatch.end();
|
||||
}
|
||||
|
||||
for (ParticleEffectPool.PooledEffect effect : uiEffects) {
|
||||
Bugger.uiBatch.begin();
|
||||
effect.draw(Bugger.uiBatch);
|
||||
Bugger.uiBatch.end();
|
||||
}
|
||||
}
|
||||
|
||||
public void dispose() {
|
||||
for (ParticleEffectPool.PooledEffect effect : activeEffects) {
|
||||
effect.free();
|
||||
effectTypes.remove(effect);
|
||||
}
|
||||
activeEffects.clear();
|
||||
}
|
||||
|
||||
@@ -11,13 +11,14 @@ import org.lumijiez.bugger.entities.weapons.Ray;
|
||||
public class ProjectileHandler {
|
||||
private final Array<Ray> deployedProjectiles = new Array<>();
|
||||
private final Array<Ray> freeProjectiles = new Array<>();
|
||||
private final Array<Ray> deployedEnemyProjectiles = new Array<>();
|
||||
private final Array<Ray> freeEnemyProjectiles = new Array<>();
|
||||
private static ProjectileHandler instance;
|
||||
|
||||
private static final int INITIAL_PROJECTILES = 50;
|
||||
|
||||
private ProjectileHandler() {
|
||||
for (int i = 0; i < INITIAL_PROJECTILES; i++) {
|
||||
freeProjectiles.add(new Ray(Bugger.getInstance().getWorld()));
|
||||
freeProjectiles.add(new Ray(Bugger.getInstance().getWorld(), false));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,7 +51,6 @@ public class ProjectileHandler {
|
||||
float mouseY = Gdx.input.getY();
|
||||
|
||||
Vector3 mousePosition = CameraHandler.getInstance().getCamera().unproject(new Vector3(mouseX, mouseY, 0));
|
||||
|
||||
Vector2 playerPos = Player.getInstance().getPosition();
|
||||
direction.set(mousePosition.x, mousePosition.y).sub(playerPos).nor();
|
||||
|
||||
@@ -69,11 +69,15 @@ public class ProjectileHandler {
|
||||
return;
|
||||
}
|
||||
|
||||
projectile.init(position, direction.nor().scl(speed));
|
||||
projectile.init(position, direction.nor().scl(speed), false);
|
||||
deployedProjectiles.add(projectile);
|
||||
}
|
||||
|
||||
public Array<Ray> getDeployedProjectiles() {
|
||||
return deployedProjectiles;
|
||||
}
|
||||
|
||||
public Array<Ray> getDeployedEnemyProjectiles() {
|
||||
return deployedEnemyProjectiles;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user