package org.codecranachan.asteroidpush.base.scenario; import org.codecranachan.asteroidpush.base.Balancing; import org.codecranachan.asteroidpush.base.input.Controller; import org.codecranachan.asteroidpush.base.simulation.Actor; import org.codecranachan.asteroidpush.base.simulation.ActorFactory; import org.codecranachan.asteroidpush.base.simulation.Simulation; import org.codecranachan.asteroidpush.base.workshop.Blueprint; import org.codecranachan.asteroidpush.content.actors.SpaceshipFactory; import org.codecranachan.asteroidpush.utils.Angle; import org.codecranachan.asteroidpush.utils.Circle; import org.codecranachan.asteroidpush.utils.FieldOfView; import org.codecranachan.asteroidpush.utils.NewtonianState; import org.jbox2d.common.Vec2; public class ShipPrototypeRule implements Rule { private ActorFactory prototypeFactory; private Actor prototype; private Controller controller; public ShipPrototypeRule(Blueprint blueprint, Controller controller) { this.prototypeFactory = new SpaceshipFactory(blueprint.getPlan(), Balancing.getShipSizeFactor()); this.prototype = null; this.controller = controller; } public FieldOfView getFieldOfView() { if (prototype == null) { return new FieldOfView(new Circle(new Vec2(0f, 0f), 5f), Angle.HALF_PI); } else { return prototype.getFieldOfView(); } } public void update(Simulation simulation, int frame) { if (prototype == null) { prototypeFactory.setBodyFactory(simulation.getBodyFactory()); prototype = prototypeFactory.createActor(getSpawnState()); prototype.setController(controller); simulation.addActor(prototype); } } private NewtonianState getSpawnState() { NewtonianState initial = new NewtonianState(); initial.setState(new Vec2(0, 0), Angle.HALF_PI); initial.setVelocity(new Vec2(0, 0), new Angle()); return initial; } }