Hitboxes mit if statements

Monokuma

Aktives Mitglied
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.

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;
            }

        }
    }
}
 

MoxxiManagarm

Top Contributor
jedoch ist das noch nicht ganz korrekt, da der Ball auch unterhalb des Schlägers bewegt wird, obwohl das nicht so sein sollte.
Du berechnest ja auch, ob der Ball den Schläger bereits schneidet. Das wird bei Breakout aber nie der Fall sein, da er ja abprallt. Du darfst den Ball also noch nicht in die Richtung bewegen. Du brauchst 2 verschiedene Bewegungen: 1. Eine Bewegung an einen freien Platz in die angegebene Richtung 2. Eine Abprallbewegung. D.h. Falls die theoretische neue Position (genau genommen auch der Weg dorthin) frei ist, dann verwende Bewegung 1. Falls nicht verwende Bewegung 2.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D SQL Statements mit Java Swing benutzen AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben