diff --git a/src/main/java/lab/DrawingThread.java b/src/main/java/lab/DrawingThread.java index 1243331c3822cf37a2932e9e8eeb8f336e3de58d..a53ad11bc787100d9ee9201b9edd4e831e80dd54 100644 --- a/src/main/java/lab/DrawingThread.java +++ b/src/main/java/lab/DrawingThread.java @@ -8,11 +8,14 @@ public class DrawingThread extends AnimationTimer { private final Canvas canvas; private final GraphicsContext gc; + private Level level; + private long lastTime; public DrawingThread(Canvas canvas) { this.canvas = canvas; this.gc = canvas.getGraphicsContext2D(); - + this.level = new Level(canvas.getWidth(), canvas.getHeight()); + lastTime = System.nanoTime(); } /** @@ -20,11 +23,9 @@ public class DrawingThread extends AnimationTimer { */ @Override public void handle(long now) { - // put your code here -// gc.setFill(Color.AQUA); -// gc.setStroke(Color.BLACK); -// gc.fillOval(10, 10, 20, 20); - + level.draw(gc); + level.simulate(now - lastTime); + lastTime = now; } } diff --git a/src/main/java/lab/Level.java b/src/main/java/lab/Level.java new file mode 100644 index 0000000000000000000000000000000000000000..819c89f6ca062846c412c1764d2dfbfa959db727 --- /dev/null +++ b/src/main/java/lab/Level.java @@ -0,0 +1,39 @@ +package lab; + +import javafx.geometry.Dimension2D; +import javafx.geometry.Point2D; +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.paint.Color; + +public class Level { + + private NicerObstacle nicerObstacle; + private Obstacle obstacle1; + private Obstacle obstacle2; + private Player player; + private double width; + private double height; + + public Level(double width, double height) { + this.width = width; + this.height = height; + nicerObstacle = new NicerObstacle(this, new Point2D(20, 150)); + obstacle1 = new Obstacle(this, new Point2D(300, 200), new Dimension2D(80, 40)); + obstacle2 = new Obstacle(this); + player = new Player(this, new Point2D(20, 250), new Point2D(0.5, -0.1)); + } + + public void draw(GraphicsContext gc) { + gc.setFill(Color.WHITE); + gc.clearRect(0, 0, width, height); + nicerObstacle.draw(gc); + obstacle1.draw(gc); + obstacle2.draw(gc); + player.draw(gc); + } + + public void simulate(double delay) { + player.simulate(0); + } + +} diff --git a/src/main/java/lab/NicerObstacle.java b/src/main/java/lab/NicerObstacle.java new file mode 100644 index 0000000000000000000000000000000000000000..fd3988696dd593f8f75148de0e3ee62687abd1a7 --- /dev/null +++ b/src/main/java/lab/NicerObstacle.java @@ -0,0 +1,27 @@ +package lab; + +import javafx.geometry.Point2D; +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.image.Image; + +public class NicerObstacle { + + private Level level; + private Image image; + private Point2D position; + + public NicerObstacle(Level level, Point2D position) { + this.level = level; + this.position = position; + image = new Image(getClass().getResourceAsStream("spike.gif")); + } + + public void draw(GraphicsContext gc) { + gc.drawImage(image, position.getX(), position.getY()); + } + + public void simulate(double delay) { + + } + +} diff --git a/src/main/java/lab/Obstacle.java b/src/main/java/lab/Obstacle.java new file mode 100644 index 0000000000000000000000000000000000000000..0c0fe1dec4cff3b459b58f263f9f42e729bec719 --- /dev/null +++ b/src/main/java/lab/Obstacle.java @@ -0,0 +1,38 @@ +package lab; + +import javafx.geometry.Dimension2D; +import javafx.geometry.Point2D; +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.paint.Color; + +public class Obstacle { + + private Level level; + private Point2D position; + private Dimension2D size; + + public Obstacle(Level level) { + this(level, new Point2D(200, 100), new Dimension2D(30, 20)); + } + + public Obstacle(Level level, Point2D position, Dimension2D size) { + this.level = level; + this.position = position; + this.size = size; + } + + public void draw(GraphicsContext gc) { + gc.save(); + gc.setFill(Color.BLUEVIOLET); + gc.setStroke(Color.RED); + gc.setLineWidth(3); + gc.fillRect(position.getX(), position.getY(), size.getWidth(), size.getHeight()); + gc.strokeRect(position.getX(), position.getY(), size.getWidth(), size.getHeight()); + gc.restore(); + } + + public void simulate(double delay) { + + } + +} diff --git a/src/main/java/lab/Player.java b/src/main/java/lab/Player.java new file mode 100644 index 0000000000000000000000000000000000000000..aa8e6203feefa4de5ce65e4a9935dc6b8d4c2f23 --- /dev/null +++ b/src/main/java/lab/Player.java @@ -0,0 +1,43 @@ +package lab; + +import javafx.geometry.Point2D; +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.paint.Color; +import javafx.scene.transform.Affine; +import javafx.scene.transform.Rotate; + +public class Player { + private Level level; + private Point2D position; + private Point2D speed; + + public Player(Level level, Point2D position, Point2D speed) { + this.level = level; + this.position = position; + this.speed = speed; + } + + public void draw(GraphicsContext gc) { + gc.save(); + 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); + gc.restore(); + } + + public void simulate(double delay) { + position = position.add(speed); + speed = speed.multiply(0.998); + } + +} diff --git a/src/main/resources/lab/spike.gif b/src/main/resources/lab/spike.gif new file mode 100644 index 0000000000000000000000000000000000000000..0d7d4186d65da5d8534d7ae3394b777edd5518b9 Binary files /dev/null and b/src/main/resources/lab/spike.gif differ