Hallo Leute.
Ich arbeite an einem Spiel und verzweifle grad and der collisionDetection.
Ich hab zwar eine Idee wie ich es machen will, aber die Implementierung funktioniert nicht.
Ich berechne die Hitbox des Players im nächsten frame, indem ich die bewegungsvariablen zu den koordinaten addiere, und überprüfe, ob sie sich mit einem anderen Entity oder einer Wand überschneidet. In der update Methode wird der Player dann nur bewegt, wenn die collisionDetection() false liefert.
Hier der entsprechende Code:
Außerdem will ich, dass die Entities sich passend überschneiden (Also wenn ich hinter einem gegner stehe, dass sein Oberkörper meine Beine verdeckt und umgekehrt). Ich sortier dazu die Entities nach y-Koordinate und zeichne sie dementsprechend. Das klappt auch soweit, nur wenn ich unter einem Gegner stehe und mich gerade nach oben bewege, wird der Gegner trotzdem über mir gemalt.
Hier der Code dazu:
Findet ihr logische Fehler oder habt sonstige Verbesserungsvorschläge? Ein Problem, das ich bei diesem Code habe, ist dass ich so die Kollision der Entities nicht prüfe. Ich wollte den Code abwandeln und in die Entity Klasse einfügen.
Ich bin offen für alle Ideen, Ratschläge o.ä.. Ich sitze da jetzt schon so lang dran, dass ich den Überblick langsam verliere. Ich hab auch kein Problem damit, ein ganz neues Konzept zu übernehmen.
Vielen Dank im Vorraus!!
Ich arbeite an einem Spiel und verzweifle grad and der collisionDetection.
Ich hab zwar eine Idee wie ich es machen will, aber die Implementierung funktioniert nicht.
Ich berechne die Hitbox des Players im nächsten frame, indem ich die bewegungsvariablen zu den koordinaten addiere, und überprüfe, ob sie sich mit einem anderen Entity oder einer Wand überschneidet. In der update Methode wird der Player dann nur bewegt, wenn die collisionDetection() false liefert.
Hier der entsprechende Code:
Java:
public boolean checkCollision(){
Rectangle r1,r2;
int xx = (int) x - Screen.offsetx;
int yy = (int) y - Screen.offsety;
int dyy = (int) dy;
int dxx = (int) dx;
r1 = new Rectangle(xx + dxx, yy+ dyy, 32 ,32+speed);
r2 = new Rectangle(xx +dxx , yy + dyy+32 ,32, 32 + speed );
//r1 upper half
//r2 lower half
for (int x = 0; x < 25; x++) {
for (int y = 0; y < 18; y++) {
// visibleScreen beinhaltet alle Tiles, die sich auf dem Bildschirm befinden
if ((World.visibleScreen[x][y].getBounds().intersects(r1) ||
World.visibleScreen[x][y].getBounds().intersects(r2))
&& World.visibleScreen[x][y].isSolid()) {
return true;
}
}
}
for(Entity e: World.entities){
if(r1.intersects(e.getUpperBounds())){
//up up
return true;
}
if(r2.intersects(e.getLowerBounds())){
// low low
return true;
}
if(r1.intersects(e.getLowerBounds())){
// up low
if(yy <= e.getY())
// return false;
return true;
}
if(r2.intersects(e.getUpperBounds())){
//low up
if(yy + 64 >= e.getY())
// return false;
return true;
}
}
return false;
}
Außerdem will ich, dass die Entities sich passend überschneiden (Also wenn ich hinter einem gegner stehe, dass sein Oberkörper meine Beine verdeckt und umgekehrt). Ich sortier dazu die Entities nach y-Koordinate und zeichne sie dementsprechend. Das klappt auch soweit, nur wenn ich unter einem Gegner stehe und mich gerade nach oben bewege, wird der Gegner trotzdem über mir gemalt.
Hier der Code dazu:
Java:
public void drawEntities(Graphics g){
// draw ist eine ArrayList vom Typ Entity
draw.addAll(entities);
draw.add(player);
sort(draw);
for(Entity e : draw){
e.draw(g);
}
draw.clear();
}
private ArrayList<Entity> sort(ArrayList<Entity> entities){
Collections.sort(entities, new Comparator<Entity>(){
@Override
public int compare(Entity e0, Entity e1) {
if (e1.y < e0.y) return +1;
if (e1.y >= e0.y) return -1;
return 0;
}
});
return entities;
}
Findet ihr logische Fehler oder habt sonstige Verbesserungsvorschläge? Ein Problem, das ich bei diesem Code habe, ist dass ich so die Kollision der Entities nicht prüfe. Ich wollte den Code abwandeln und in die Entity Klasse einfügen.
Ich bin offen für alle Ideen, Ratschläge o.ä.. Ich sitze da jetzt schon so lang dran, dass ich den Überblick langsam verliere. Ich hab auch kein Problem damit, ein ganz neues Konzept zu übernehmen.
Vielen Dank im Vorraus!!
Zuletzt bearbeitet von einem Moderator: