package com.deftwun.zombiecopter.systems; import com.badlogic.ashley.core.Engine; import com.badlogic.ashley.core.EntitySystem; import com.badlogic.gdx.math.Intersector; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; import com.deftwun.zombiecopter.App; import com.deftwun.zombiecopter.SpawnZone; public class SpawnSystem extends EntitySystem { private Rectangle camRect, boundsRect = new Rectangle(App.engine.entityBounds), tmpRect = new Rectangle(); private Vector2 cameraCenter = new Vector2(), spawnPoint = new Vector2(); private Array<SpawnZone> points = new Array<SpawnZone>(); private Array<SpawnZone> deadPoints = new Array<SpawnZone>(); private final float units = App.engine.PIXELS_PER_METER; private final int maxEntities = 25; public void add(SpawnZone point){ points.add(point); } public SpawnSystem(){ this.setProcessing(true); } @Override public void removedFromEngine(Engine engine) { points.clear(); deadPoints.clear(); } @Override public void update(float deltaTime) { if (App.engine.getEntityCount() > maxEntities) return; camRect = App.engine.systems.camera.getCameraRect(1/units); boundsRect.setCenter(camRect.getCenter(cameraCenter)); for (SpawnZone z : points){ z.time += deltaTime; //Spawn new entity if (z.time > z.delay && z.count < z.maximum){ boolean withinBounds = Intersector.intersectRectangles(z.rectangle,boundsRect,tmpRect); boolean outsideCamera = !camRect.overlaps(z.rectangle); z.time = 0; if (withinBounds && outsideCamera){ z.count++; spawnPoint.x = MathUtils.random(tmpRect.x,tmpRect.x+tmpRect.width); spawnPoint.y = MathUtils.random(tmpRect.y,tmpRect.y+tmpRect.height); App.engine.factory.build(z.type,spawnPoint); } } //Retire spawn point if it has reached max spawn count if (z.maximum > 0 && z.count > z.maximum){ deadPoints.add(z); } } //Remove the retired spawn points for (SpawnZone p : deadPoints){ points.removeValue(p, true); } deadPoints.clear(); } public Array<SpawnZone> getZones() { return points; } }