Add player debris
This commit is contained in:
parent
f083a40682
commit
0d323a69bc
@ -5,11 +5,14 @@ import com.badlogic.gdx.math.Vector2;
|
|||||||
import com.me.asteroids.components.AccelerationComponent;
|
import com.me.asteroids.components.AccelerationComponent;
|
||||||
import com.me.asteroids.components.AsteroidComponent;
|
import com.me.asteroids.components.AsteroidComponent;
|
||||||
import com.me.asteroids.components.BulletComponent;
|
import com.me.asteroids.components.BulletComponent;
|
||||||
|
import com.me.asteroids.components.DebrisComponent;
|
||||||
import com.me.asteroids.components.ModelComponent;
|
import com.me.asteroids.components.ModelComponent;
|
||||||
import com.me.asteroids.components.PlayerComponent;
|
import com.me.asteroids.components.PlayerComponent;
|
||||||
import com.me.asteroids.components.model.PolygonModel;
|
|
||||||
import com.me.asteroids.components.PositionComponent;
|
import com.me.asteroids.components.PositionComponent;
|
||||||
import com.me.asteroids.components.VelocityComponent;
|
import com.me.asteroids.components.VelocityComponent;
|
||||||
|
import com.me.asteroids.components.model.LineModel;
|
||||||
|
import com.me.asteroids.components.model.Model;
|
||||||
|
import com.me.asteroids.components.model.PolygonModel;
|
||||||
import com.me.common.ecs.Engine;
|
import com.me.common.ecs.Engine;
|
||||||
import com.me.common.ecs.Entity;
|
import com.me.common.ecs.Entity;
|
||||||
|
|
||||||
@ -18,6 +21,9 @@ import static com.me.asteroids.Constants.rand;
|
|||||||
public class EntityFactory {
|
public class EntityFactory {
|
||||||
|
|
||||||
private static final Vector2 tmp = new Vector2();
|
private static final Vector2 tmp = new Vector2();
|
||||||
|
private static final Vector2 tmp2 = new Vector2();
|
||||||
|
private static final Vector2 tmpA = new Vector2();
|
||||||
|
private static final Vector2 tmpB = new Vector2();
|
||||||
|
|
||||||
private static Entity createEntity(Engine engine) {
|
private static Entity createEntity(Engine engine) {
|
||||||
Entity entity = engine.createEntity();
|
Entity entity = engine.createEntity();
|
||||||
@ -59,6 +65,68 @@ public class EntityFactory {
|
|||||||
return player;
|
return player;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static LineModel[] getLineModels(Model playerModel) {
|
||||||
|
float[] vertices = playerModel.getVertices();
|
||||||
|
Vector2 position = playerModel.getPosition();
|
||||||
|
|
||||||
|
LineModel[] models = new LineModel[(vertices.length / 2)];
|
||||||
|
for (int i = 0, n = vertices.length; i < n; i += 2) {
|
||||||
|
int bIndex = i + 2 == n? 0 : i + 2;
|
||||||
|
|
||||||
|
// tmpA, tmpB = points relative to 0
|
||||||
|
tmpA.set(vertices[i] - position.x, vertices[i + 1] - position.y);
|
||||||
|
tmpB.set(vertices[bIndex] - position.x, vertices[bIndex + 1] - position.y);
|
||||||
|
|
||||||
|
tmp.set(tmpB).sub(tmpA).scl(0.5f); // Cut line segment in half
|
||||||
|
tmp2.set(tmpA).add(tmp); // Find center of line segment
|
||||||
|
|
||||||
|
tmpA.sub(tmp2); // make tmpA, tmpB relative to line center
|
||||||
|
tmpB.sub(tmp2);
|
||||||
|
|
||||||
|
LineModel model = new LineModel(Color.WHITE);
|
||||||
|
model.setVertices(new float[] {
|
||||||
|
tmpA.x, tmpA.y,
|
||||||
|
tmpB.x, tmpB.y,
|
||||||
|
});
|
||||||
|
model.setPosition(tmp2.add(position)); // Offset position to new line center
|
||||||
|
|
||||||
|
models[i / 2] = model;
|
||||||
|
}
|
||||||
|
return models;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Entity[] createPlayerDebris(Engine engine, Entity player) {
|
||||||
|
Vector2 playerVelocity = player.getComponent(VelocityComponent.class).velocity;
|
||||||
|
PositionComponent playerPosition = player.getComponent(PositionComponent.class);
|
||||||
|
LineModel[] models = getLineModels(player.getComponent(ModelComponent.class).model);
|
||||||
|
Vector2 explosionCenter = tmp.set(playerPosition.position).sub(Utils.setUnitVectorAngle(tmp2, playerPosition.rotation).scl(10));
|
||||||
|
|
||||||
|
Entity[] entities = new Entity[models.length];
|
||||||
|
for (int i = 0, n = models.length; i < n; i++) {
|
||||||
|
ModelComponent model = new ModelComponent();
|
||||||
|
model.model = models[i];
|
||||||
|
|
||||||
|
PositionComponent position = new PositionComponent();
|
||||||
|
position.position = model.model.getPosition();
|
||||||
|
position.rotation = 90;
|
||||||
|
|
||||||
|
VelocityComponent velocity = new VelocityComponent();
|
||||||
|
velocity.velocity = new Vector2(models[i].getPosition()).sub(explosionCenter).nor().rotate(rand.nextFloat(-45,45)).scl(rand.nextFloat(75,100));
|
||||||
|
velocity.velocity.add(tmp2.set(playerVelocity).scl(0.75f));
|
||||||
|
velocity.angularVelocity = rand.nextFloat(-360, 360);
|
||||||
|
|
||||||
|
Entity entity = createEntity(engine);
|
||||||
|
entity.addComponent(position);
|
||||||
|
entity.addComponent(velocity);
|
||||||
|
entity.addComponent(model);
|
||||||
|
entity.addComponent(new DebrisComponent());
|
||||||
|
entities[i] = entity;
|
||||||
|
}
|
||||||
|
return entities;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static Entity createBullet(Engine engine, Entity player) {
|
public static Entity createBullet(Engine engine, Entity player) {
|
||||||
float[] modelVertices = player.getComponent(ModelComponent.class).model.getVertices();
|
float[] modelVertices = player.getComponent(ModelComponent.class).model.getVertices();
|
||||||
float rotation = player.getComponent(PositionComponent.class).rotation;
|
float rotation = player.getComponent(PositionComponent.class).rotation;
|
||||||
|
@ -3,4 +3,5 @@ package com.me.asteroids.components;
|
|||||||
import com.me.common.ecs.Component;
|
import com.me.common.ecs.Component;
|
||||||
|
|
||||||
public class BulletComponent implements Component {
|
public class BulletComponent implements Component {
|
||||||
|
// TODO: See PlayerComponent's TODO
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.me.asteroids.components;
|
||||||
|
|
||||||
|
import com.me.common.ecs.Component;
|
||||||
|
|
||||||
|
public class DebrisComponent implements Component {
|
||||||
|
// TODO: See PlayerComponent's TODO
|
||||||
|
}
|
@ -92,7 +92,7 @@ public class LineModel implements Model {
|
|||||||
float maxX = vertices[0];
|
float maxX = vertices[0];
|
||||||
float maxY = vertices[1];
|
float maxY = vertices[1];
|
||||||
|
|
||||||
for (int i = 0, n = vertices.length; i < n; i += 2) {
|
for (int i = 2, n = vertices.length; i < n; i += 2) {
|
||||||
float x = vertices[i];
|
float x = vertices[i];
|
||||||
float y = vertices[i+1];
|
float y = vertices[i+1];
|
||||||
minX = x < minX ? x : minX;
|
minX = x < minX ? x : minX;
|
||||||
@ -107,4 +107,5 @@ public class LineModel implements Model {
|
|||||||
aabb.height = maxY - minY;
|
aabb.height = maxY - minY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -88,4 +88,17 @@ public class PolygonModel implements Model {
|
|||||||
return model.contains(point);
|
return model.contains(point);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean contains(float x, float y) {
|
||||||
|
return model.contains(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean contains(float[] vertices) {
|
||||||
|
for (int i = 0, n = vertices.length; i < n; i += 2) {
|
||||||
|
if (model.contains(vertices[i], vertices[i + 1])) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -11,12 +11,14 @@ import com.me.asteroids.Graphics;
|
|||||||
import com.me.asteroids.components.AccelerationComponent;
|
import com.me.asteroids.components.AccelerationComponent;
|
||||||
import com.me.asteroids.components.AsteroidComponent;
|
import com.me.asteroids.components.AsteroidComponent;
|
||||||
import com.me.asteroids.components.BulletComponent;
|
import com.me.asteroids.components.BulletComponent;
|
||||||
|
import com.me.asteroids.components.DebrisComponent;
|
||||||
import com.me.asteroids.components.ModelComponent;
|
import com.me.asteroids.components.ModelComponent;
|
||||||
import com.me.asteroids.components.PlayerComponent;
|
import com.me.asteroids.components.PlayerComponent;
|
||||||
import com.me.asteroids.components.model.PolygonModel;
|
|
||||||
import com.me.asteroids.components.PositionComponent;
|
import com.me.asteroids.components.PositionComponent;
|
||||||
import com.me.asteroids.components.VelocityComponent;
|
import com.me.asteroids.components.VelocityComponent;
|
||||||
|
import com.me.asteroids.components.model.PolygonModel;
|
||||||
import com.me.asteroids.events.BulletAsteroidCollisionEvent;
|
import com.me.asteroids.events.BulletAsteroidCollisionEvent;
|
||||||
|
import com.me.asteroids.events.PlayerASteroidCollisionEvent;
|
||||||
import com.me.asteroids.events.ScreenWrapEvent;
|
import com.me.asteroids.events.ScreenWrapEvent;
|
||||||
import com.me.asteroids.systems.AsteroidSpawningSystem;
|
import com.me.asteroids.systems.AsteroidSpawningSystem;
|
||||||
import com.me.asteroids.systems.CollisionSystem;
|
import com.me.asteroids.systems.CollisionSystem;
|
||||||
@ -55,6 +57,7 @@ public class GameScreen extends Screen implements Listener {
|
|||||||
engine.registerComponentClass(PlayerComponent.class);
|
engine.registerComponentClass(PlayerComponent.class);
|
||||||
engine.registerComponentClass(BulletComponent.class);
|
engine.registerComponentClass(BulletComponent.class);
|
||||||
engine.registerComponentClass(AsteroidComponent.class);
|
engine.registerComponentClass(AsteroidComponent.class);
|
||||||
|
engine.registerComponentClass(DebrisComponent.class);
|
||||||
engine.registerComponentClass(PositionComponent.class);
|
engine.registerComponentClass(PositionComponent.class);
|
||||||
engine.registerComponentClass(VelocityComponent.class);
|
engine.registerComponentClass(VelocityComponent.class);
|
||||||
engine.registerComponentClass(AccelerationComponent.class);
|
engine.registerComponentClass(AccelerationComponent.class);
|
||||||
@ -97,18 +100,20 @@ public class GameScreen extends Screen implements Listener {
|
|||||||
ComponentMapper<PositionComponent> positionMapper;
|
ComponentMapper<PositionComponent> positionMapper;
|
||||||
ComponentMapper<ModelComponent> modelMapper;
|
ComponentMapper<ModelComponent> modelMapper;
|
||||||
ComponentMapper<BulletComponent> bulletMapper;
|
ComponentMapper<BulletComponent> bulletMapper;
|
||||||
|
ComponentMapper<DebrisComponent> debrisMapper;
|
||||||
|
|
||||||
EventListener(Engine engine) {
|
EventListener(Engine engine) {
|
||||||
this.positionMapper = engine.getComponentMapper(PositionComponent.class);
|
this.positionMapper = engine.getComponentMapper(PositionComponent.class);
|
||||||
this.modelMapper = engine.getComponentMapper(ModelComponent.class);
|
this.modelMapper = engine.getComponentMapper(ModelComponent.class);
|
||||||
this.bulletMapper = engine.getComponentMapper(BulletComponent.class);
|
this.bulletMapper = engine.getComponentMapper(BulletComponent.class);
|
||||||
|
this.debrisMapper = engine.getComponentMapper(DebrisComponent.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onScreenWrap(ScreenWrapEvent event) {
|
public void onScreenWrap(ScreenWrapEvent event) {
|
||||||
if (bulletMapper.has(event.entity)) {
|
if (bulletMapper.has(event.entity) || debrisMapper.has(event.entity)) {
|
||||||
// Remove bullets when they leave the screen
|
// Remove bullets when they leave the screen
|
||||||
//event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
event.entity.remove();
|
event.entity.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -126,6 +131,19 @@ public class GameScreen extends Screen implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerAsteroidCollision(PlayerASteroidCollisionEvent event) {
|
||||||
|
PolygonModel asteroid = (PolygonModel) modelMapper.get(event.getAsteroid()).model;
|
||||||
|
PolygonModel player = (PolygonModel) modelMapper.get(event.getPlayer()).model;
|
||||||
|
|
||||||
|
if (asteroid.contains(player.getVertices()) || player.contains(asteroid.getVertices())) {
|
||||||
|
event.getPlayer().deactivate();
|
||||||
|
for (Entity debris : EntityFactory.createPlayerDebris(engine, event.getPlayer())) {
|
||||||
|
debris.activate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user