Hey, ich arbeite gerade an meinem ersten Spiel in Java. Ich benutze dafür zu großen Teilen swing und awt. Mein Spiel besteht daraus, dass mehrere Gegner erstellt werden, die man besiegen muss. Diese Feinde kommen auf den Spieler zu, abhängig von seiner Position. Ich habe dann Kollision eingebaut, die über Rechtecke um den Spieler und den Feind funktioniert. Überschneiden sich diese Rechtecke, wird die Kollision erkannt (intersect Methode). Meine Gegner speichere ich in einer ArrayList, über die der Gegner entfernt werden kann, sollte er besiegt werden. Nun überschneiden sich die Gegner jedoch auch selbst, wenn sie auf den Spieler zukommen. Wie kann ich die Kollision zwischen Objekten in einer Liste implementieren? Mein Ansatz war erst über die Liste zu iterieren und mit jeder Iteration die Rechtecke zu vergleichen. Ich bin jetzt seit mehreren Stunden dabei, aber die Feinde überlappen sich trotzdem. Hat jemand eine Idee? Hier mal ein Beispiel Code, wie sich meine Gegner (Flammen) bewegen(sie überlappen sich trotzdem). Der Spieler ist hier ein Schneemann. Die Methode getBounds ist in meiner Flame Klasse als Rechteck definiert. Wichtig wäre noch, dass sowohl das überprüfen der Kollisionen und das erstellen von Gegnern teil des Game loops sind (update Methode).
Falls noch Fragen zu bestimmten Methoden bestehen dann lasst es mich wissen, danke im Voraus
Falls noch Fragen zu bestimmten Methoden bestehen dann lasst es mich wissen, danke im Voraus
Java:
private void moveFlames(int snowmanX, int snowmanY) {
for (Flame flame : flames) {
flame.move(snowmanX, snowmanY);
// Kollision mit anderen Flammen überprüfen
for (Flame otherFlame : flames) {
if (flame != otherFlame && flame.getBounds().intersects(otherFlame.getBounds())) {
flame.setSpeedX(-flame.getSpeedX());
flame.setSpeedY(-flame.getSpeedY());
}
}
}
}
Java:
private void update() {
int panelWidth = panel.getWidth();
int panelHeight = panel.getHeight();
if (upPressed && posY > 0) {
posY -= speed;
snowman.setDirection(1);
}
if (downPressed && posY < panelHeight - 135) {
posY += speed;
snowman.setDirection(0);
}
if (leftPressed && posX > 30) {
posX -= speed;
snowman.setDirection(2);
}
if (rightPressed && posX < panelWidth - 60) {
posX += speed;
snowman.setDirection(3);
}
if(!gameOver){
snowman.setPosition(posX, posY);
snowman.animate();
if (flames.size() < MAX_FLAMES) { //In der Liste gespeicherte Objekte werden abgeglichen
createFlame(); // Erzeugt neue Flammen, wenn die maximale Anzahl nicht erreicht ist
}
if(tokens.size() < MAX_TOKENS){
createToken();
}
moveSnowballs();
moveFlames(snowman.getX(), snowman.getY()); //Hier bewegen sich die Flammen
checkCollisionWithSnowman(snowman);
checkCollisionWithSnowballs();
checkCollisionWithToken();
}
else{
JFrame frame = new JFrame("Game Over"); //Neuer Game-Over Bildschirm
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
GameOverScreen gameOverScreen = new GameOverScreen(score); // Übergebe den Highscore oder die Punktzahl
frame.add(gameOverScreen);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
// Stoppe das Spiel
timer.stop();
this.dispose();
}
}