package com.shade.entities.mushroom; import org.newdawn.slick.Graphics; import org.newdawn.slick.geom.Vector2f; import org.newdawn.slick.state.StateBasedGame; import com.shade.base.Entity; import com.shade.base.util.State; import com.shade.crash.Repelable; import com.shade.entities.Roles; import com.shade.util.Geom; public class CollectedShroom implements State { private Mushroom shroom; private boolean killed; private boolean blocked; public CollectedShroom(Mushroom mushroom) { shroom = mushroom; } public void enter() { // don't need to do anything } public int getRole() { return Roles.PICKED_MUSHROOM.ordinal(); } public boolean isNamed(Object o) { return o == Mushroom.States.COLLECTED; } public void onCollision(Entity obstacle) { if (obstacle.getRole() == Roles.BASKET.ordinal()) { Mushroom.collected.play(); killed = true; } if (obstacle.getRole() == Roles.OBSTACLE.ordinal()) { Repelable b = (Repelable) obstacle; b.repel(shroom); // blocked or way too far away, break off if (blocked || WrappingUtils.overThreshold(shroom, shroom.prev, 120000)) { shroom.detach(); shroom.manager.enter(Mushroom.States.NORMAL); return; } blocked = true; } } public void render(StateBasedGame game, Graphics g) { shroom.draw(); } public void update(StateBasedGame game, int delta) { if (killed && shroom.prev == null) { shroom.kill(); shroom.detach(); return; } if (shroom.tooSmall()) { shroom.kill(); return; } // sunny shrink if (!shroom.inShadows()) { shroom.shrink(); } followLeader(); } private void followLeader() { float angle = WrappingUtils.calculateAngle(shroom, shroom.prev); Vector2f v = Geom.calculateVector(Mushroom.SPEED, angle); shroom.nudge(v.x, v.y); } }