Hallo,
ich habe Probleme mit meinem Abpraller. Ich habe ein if Statement genutzt um, den Ball abprallen zu lassen, jedoch ist das noch nicht ganz korrekt, da der Ball auch unterhalb des Schlägers bewegt wird, obwohl das nicht so sein sollte. Zusätzlich bräuchte ich noch Hilfe bezüglich dem Treffen und Löschen meiner Formen.
ich habe Probleme mit meinem Abpraller. Ich habe ein if Statement genutzt um, den Ball abprallen zu lassen, jedoch ist das noch nicht ganz korrekt, da der Ball auch unterhalb des Schlägers bewegt wird, obwohl das nicht so sein sollte. Zusätzlich bräuchte ich noch Hilfe bezüglich dem Treffen und Löschen meiner Formen.
Java:
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Duration;
public class Breakout extends Application {
public static void main(String[] args) {
launch(args);
}
private static final int width = 700;
private static final int height = 900;
private boolean gameStarted;
private int rad = 10;
private int paddleW = 50;
private int paddleH = 10;
private int ballYPos = width / 2;
private int ballXPos = height / 2;
private int paddleXpos = width / 2;
private int paddleYpos = height - 100;
private int ballXSpeed = 2;
private int ballYSpeed = 2;
private int paddleDeltaX = 0;
private int score = 0;
private int brickH = 15;
private int brickW = 80;
private int startX = 50;
private int startY = 20;
private int gapX = 130;
private int gapY = 20;
private int countRow = 0;
private int countCol = 0;
@Override
public void start(Stage primaryStage) throws Exception {
Canvas canvas = new Canvas(width, height);
GraphicsContext gc = canvas.getGraphicsContext2D();
Timeline t = new Timeline(new KeyFrame(Duration.millis(10), e -> run(gc)));
t.setCycleCount(Timeline.INDEFINITE);
canvas.setOnMouseClicked(e -> gameStarted = true);
Scene scene = new Scene(new StackPane(canvas));
scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
switch (event.getCode()) {
case A:
case LEFT:
paddleDeltaX = -4;
break;
case D:
case RIGHT:
paddleDeltaX = 4;
break;
}
}
});
scene.setOnKeyReleased(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
paddleDeltaX = 0;
}
});
primaryStage.setTitle("Breakout");
primaryStage.setScene(scene);
primaryStage.show();
t.play();
}
public void run(GraphicsContext gc) {
gc.setFill(Color.GRAY);
gc.fillRect(0, 0, width, height);
gc.setFill(Color.GREEN);
gc.fillOval(ballXPos, ballYPos, rad, rad);
gc.setFill(Color.BLUE);
gc.fillRect(paddleXpos, paddleYpos, paddleW, paddleH);
gc.setFill(Color.RED);
for (countCol = 0; countCol < 10; countCol++) {
for (countRow = 0; countRow < 5; countRow++) {
gc.fillRect(countRow * gapX + startX, countCol * gapY + startY, brickW, brickH);
}
}
if (gameStarted) {
paddleXpos += paddleDeltaX;
if (paddleXpos < 0) {
paddleXpos = 0;
} else if (paddleXpos > width - paddleW) {
paddleXpos = width - paddleW;
}
ballYPos += ballYSpeed;
ballXPos += ballXSpeed;
if (ballXPos == width - rad || ballXPos == 0) {
ballXSpeed *= -1;
}
if (ballYPos == height - rad || ballYPos == 0) {
ballYSpeed *= -1;
}
//ball gets hit by paddle, little error on that
if ((ballXPos >= paddleXpos && ballXPos <= paddleXpos + paddleW) && ballYPos >= paddleYpos - paddleH) {
ballYSpeed *= -1;
}
}
}
}