package lab; import java.util.Random; import javafx.geometry.Point2D; import javafx.geometry.Rectangle2D; import javafx.scene.canvas.GraphicsContext; import javafx.scene.paint.Color; import javafx.scene.transform.Affine; import javafx.scene.transform.Rotate; public class Player extends WorldEntity implements Collisionable { private static final Random RANDOM = new Random(); private Point2D speed; public Player(Level level, Point2D position, Point2D speed) { super(level, position); this.speed = speed; } public void drawInternal(GraphicsContext gc) { Point2D center = position.add(10, 25); double angle = speed.angle(1, 0); if (speed.getY() < 0) { angle = -angle; } Rotate rotateMatrix = Affine.rotate(angle, center.getX(), center.getY()); gc.setTransform(new Affine(rotateMatrix)); gc.setFill(Color.AQUA); gc.setStroke(Color.GREEN); gc.setLineWidth(5); gc.fillRect(center.getX(), center.getY(), 50, 1); gc.fillRoundRect(position.getX(), position.getY(), 20, 50, 20, 20); gc.strokeRoundRect(position.getX(), position.getY(), 20, 50, 20, 20); } public void simulate(double delay) { position = position.add(speed.multiply(delay / 1_000_000_000)); // speed = speed.multiply(0.9994); } @Override public Rectangle2D getBoundingBox() { return new Rectangle2D(position.getX(), position.getY(), 20, 50); } @Override public boolean intersect(Rectangle2D another) { return getBoundingBox().intersects(another); } @Override public void hitBy(Collisionable another) { if (another instanceof Monster) { position = new Point2D(RANDOM.nextDouble(0, level.getWidth() * 0.4), RANDOM.nextDouble(level.getHeight() * 0.5, level.getHeight())); } } }