From 7a94db13839b69bf76f881471a1bf32ae32b8b0f Mon Sep 17 00:00:00 2001 From: Matt Low Date: Thu, 30 Jan 2020 22:58:29 +0400 Subject: [PATCH] Add sharing asteroids methods --- core/src/com/me/asteroids/EntityFactory.java | 86 ++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/core/src/com/me/asteroids/EntityFactory.java b/core/src/com/me/asteroids/EntityFactory.java index b81441d..f7ac934 100644 --- a/core/src/com/me/asteroids/EntityFactory.java +++ b/core/src/com/me/asteroids/EntityFactory.java @@ -251,4 +251,90 @@ public class EntityFactory { return entities; } + public static PolygonModel[] getPolygonShards(PolygonModel model, int shardCount) { + PolygonModel[] shards = new PolygonModel[shardCount]; + Vector2 position = tmp.set(model.getPosition()); + float[] vertices = model.getVertices(); + + int verticesPerShard = vertices.length / (shardCount * 2); + int remaining = vertices.length % (shardCount * 2); + + int vertice = 0; + for (int i = 0; i < shardCount; i++) { + if (i + 1 == shardCount && remaining > 0) { + // Put the remaining vertices onto the last shard + verticesPerShard += remaining / 2; + } + + float[] shardVertices = new float[(verticesPerShard + 1) * 2]; + shardVertices[0] = 0; + shardVertices[1] = 0; + float minX = shardVertices[0], maxX = shardVertices[0]; + float minY = shardVertices[1], maxY = shardVertices[1]; + for (int j = 2, n = shardVertices.length; j < n; j += 2) { + float x = shardVertices[j] = vertices[vertice++] - position.x; + float y = shardVertices[j + 1] = vertices[vertice++] - position.y; + minX = x < minX ? x : minX; + maxX = x > maxX ? x : maxX; + minY = y < minY ? y : minY; + maxY = y > maxY ? y : maxY; + } + + float centerX = minX + ((maxX - minX) / 2); + float centerY = minY + ((maxY - minY) / 2); + + for (int j = 0, n = shardVertices.length; j < n; j += 2) { + shardVertices[j] -= centerX; + shardVertices[j + 1] -= centerY; + } + + PolygonModel shard = new PolygonModel(model.getColor()); + shard.setVertices(shardVertices); + shard.setPosition(tmp2.set(position).add(centerX, centerY)); + shards[i] = shard; + } + + return shards; + } + + public static Entity[] splitAsteroidIntoShards(Engine engine, Entity asteroid, int shardCount) { + Entity[] entities = new Entity[shardCount]; + PolygonModel asteroidModel = (PolygonModel) asteroid.getComponent(ModelComponent.class).model; + PolygonModel[] shards = getPolygonShards(asteroidModel, shardCount); + Vector2 asteroidPosition = asteroidModel.getPosition(); + Vector2 asteroidVelocity = asteroid.getComponent(VelocityComponent.class).velocity; + int generation = asteroid.getComponent(AsteroidComponent.class).generation; + + for (int i = 0; i < entities.length; i++) { + ModelComponent model = new ModelComponent(); + model.model = shards[i]; + + PositionComponent position = new PositionComponent(); + position.position = new Vector2(model.model.getPosition()); + position.rotation = 90; + + VelocityComponent velocity = new VelocityComponent(); + velocity.velocity = new Vector2(shards[i].getPosition()) + .sub(asteroidPosition) + .nor() + .rotate(rand.nextFloat(-15, 15)) // Slightly alter the direction each piece flies off in + .scl(asteroidVelocity.len() * 1f) // Set speed to asteroid's original velocity + .add(tmp2.set(asteroidVelocity).scl(0.25f)); + velocity.angularVelocity = rand.nextFloat(-30, 30); + + AsteroidComponent asteroidComponent = new AsteroidComponent(); + asteroidComponent.generation = generation + 1; + + Entity entity = createEntity(engine); + entity.addComponent(model); + entity.addComponent(position); + entity.addComponent(velocity); + entity.addComponent(asteroidComponent); + entity.addComponent(COLLIDER); + entities[i] = entity; + } + + return entities; + } + }