package audioProject.entities; import java.awt.Color; import java.awt.Graphics2D; import java.awt.event.KeyEvent; import toritools.additionaltypes.HealthBar; import toritools.additionaltypes.HistoryQueue; import toritools.controls.KeyHolder; import toritools.entity.Entity; import toritools.entity.Level; import toritools.entity.physics.PhysicsModule; import toritools.entity.sprite.AbstractSprite.AbstractSpriteAdapter; import toritools.math.Vector2; import toritools.scripting.EntityScript.EntityScriptAdapter; import toritools.scripting.ScriptUtils; import audioProject.AudioProject; public class PlayerShip extends Entity { protected boolean vincible = true; public boolean isVincible() { return vincible; } public void setVincible(boolean vincible) { this.vincible = vincible; } public PlayerShip() { layer = 3; variables.setVar("id", "player"); pos = new Vector2(100, 10); dim = new Vector2(2, 2); final Vector2 offsetSize = new Vector2(7, 7), offsetSize2 = offsetSize.scale(2); final HistoryQueue<Vector2> pastPos = new HistoryQueue<Vector2>(5); final HealthBar healthBar = new HealthBar(100, Color.RED, Color.GREEN); addScript(new EntityScriptAdapter() { final char UP = KeyEvent.VK_W, DOWN = KeyEvent.VK_S, RIGHT = KeyEvent.VK_D, LEFT = KeyEvent.VK_A, SHOOT = KeyEvent.VK_SPACE, SPREAD_UP = KeyEvent.VK_PERIOD, SPREAD_DOWN = KeyEvent.VK_COMMA; float speed = .002f; int canShoot = 0; KeyHolder keys; PhysicsModule physics; float spread = .1f, spreadFactor = .02f; @Override public void onSpawn(Entity self, Level level) { self.setPos(level.getDim().scale(.25f, .5f)); keys = ScriptUtils.getKeyHolder(); physics = new PhysicsModule(Vector2.ZERO, new Vector2(.9f), self); healthBar.setHealth(100); } @Override public void onUpdate(Entity self, float time, Level level) { float speed = this.speed * time; if (keys.isPressed(UP)) { physics.addAcceleration(new Vector2(0, -speed)); } if (keys.isPressed(DOWN)) { physics.addAcceleration(new Vector2(0, speed)); } if (keys.isPressed(LEFT)) { physics.addAcceleration(new Vector2(-speed, 0)); } if (keys.isPressed(RIGHT)) { physics.addAcceleration(new Vector2(speed, 0)); } if (keys.isPressed(SPREAD_DOWN)) { spread = Math.max(spread - spreadFactor, 0); } if (keys.isPressed(SPREAD_UP)) { spread = Math.min(spread + spreadFactor, 4); } if (keys.isPressedThenRelease(KeyEvent.VK_P)) { setVincible(!isVincible()); } if (!isVincible()) { healthBar.setHealth(100); } if (canShoot-- < 0 && keys.isPressed(SHOOT)) { canShoot = 10; level.spawnEntity(new GoodBullet(self.getPos(), new Vector2(1, -spread).unit())); level.spawnEntity(new GoodBullet(self.getPos(), Vector2.RIGHT)); Entity boolet = new GoodBullet(Vector2.ZERO, new Vector2(1, spread).unit()); boolet.setPos(self.getPos().add(0, self.getDim().y - boolet.getDim().y)); level.spawnEntity(boolet); } Vector2 delta = physics.onUpdate(time); self.setPos(self.getPos().add(delta)); ScriptUtils.moveOut(self, false, level.getSolids()); pastPos.push(self.getPos()); for (Entity badBullet : level.getEntitiesWithType("BadBullet")) { if (ScriptUtils.isCollidingRad(self, badBullet)) { level.despawnEntity(badBullet); healthBar.setHealth(healthBar.getHealth() - badBullet.getVariableCase().getFloat("damage")); } } for (Entity health : level.getEntitiesWithType("health")) { if (ScriptUtils.isCollidingRad(self, health)) { level.despawnEntity(health); healthBar.setHealth(100); } } if(healthBar.getHealth() <= 0) { AudioProject.seek(0, level); } } }); setSprite(new AbstractSpriteAdapter() { @Override public void draw(Graphics2D g, Entity self) { //g.fillOval((int) position.x, (int) position.y, (int) dimension.x, (int) dimension.y); healthBar.draw(g, new Vector2(10, 50), new Vector2(200, 30)); Color c = isVincible() ? AudioProject.shipColor : Color.GREEN; //ColorUtils.blend(Color.BLACK, Color.BLUE, Math.abs(AudioProject.controller.getFeel())); int alpha = 255; for(Vector2 hPos: pastPos) { g.setColor(new Color(c.getRed(), c.getGreen(), c.getBlue(), alpha)); g.drawOval((int) (hPos.x - offsetSize.x), (int) (hPos.y - offsetSize.y), (int) (offsetSize2.x + self.getDim().x), (int) (offsetSize2.y + self.getDim().y)); alpha = alpha / 2; } g.setColor(Color.DARK_GRAY); g.fillOval((int) self.getPos().x, (int) (self.getPos().y), (int) self.getDim().x, (int) self.getDim().y); } }); } }