Ich schreibe ein Spiel für Schulprojekt mit Processing. Ich beschäftige mich derzeit mit dem Sichtfeld eines Spielers. Das Sichtfeld des Spielers ist im Grunde genommen ein Kreis, aber ich möchte, dass die Sicht blockiert wird, wenn sich vorne ein Hindernis befindet, was bedeutet, dass Sie die Dinge hinter dem Hindernis nicht sehen können. Das folgende Bild ist das aktuelle Ergebnis, das ich habe.Erstellen einer Ansicht mit Schatten in einem Processing-Spiel
Mein Code: http://pastie.org/10854654
Die Methode, die ich verwendet, ist in dem Spielersichtfeld von der Mitte ausgehend durch jedes Pixel zu gehen, einen Weg zu dem Umfang Kommissionierung. Wenn ich auf der Suche nach einem Hindernis auf dem Pfad suche, zeichne ich eine schwarze Linie auf den Rest des Pfades. Ändern Sie die Richtung des Pfades Grad für Grad und schließlich den gesamten Kreis.
//Draw a circle field of view.
int[][] collisionMap = map.getCollisionMap();
//Use a lot of small rectangle to cover the full map except of the circle field of view.
mainapplet.fill(0, 0, 0, 128);
for(int i = 0; i <= MyApplet.width; i++){
for(int j = 0; j <= MyApplet.height; j++){
if(mainapplet.dist(playerx, playery, i, j) > FieldOfView)
mainapplet.rect(i, j, 1, 1);
}
}
//Scan the circle field of view. If there is collision , draw a line to cover the area ,which means that the area is invisible.
mainapplet.stroke(0, 0, 0, 128);
mainapplet.strokeWeight(5);
for(float i = 0; i < 360; i+=1) {
for(float j = 0; j < FieldOfView ; j++){
float x = j * mainapplet.cos(mainapplet.radians(i));
float y = j * mainapplet.sin(mainapplet.radians(i));
if(collisionMap[player.getX() + (int)x ][player.getY() + (int)y ] == 1){
mainapplet.line(playerx + x, playery + y,
playerx + (FieldOfView-1)* mainapplet.cos(mainapplet.radians(i)),
playery + (FieldOfView-1)* mainapplet.sin(mainapplet.radians(i))
);
break;
}
}
}
collisionMap ist ein 2D-Array mit 0 und 1 „1“ angibt, dass ein Hindernis an der Stelle vorhanden ist.
Allerdings finde ich diese Methode ineffizient, daher Lag verursachen. Gibt es einen besseren Weg, dies zu tun? Oder vielleicht gibt es bereits geschriebene Tools, die ich verwenden kann?
Die erste Frage ist: Haben Sie gemessen, welches Bit es verlangsamt? Es gibt viele Möglichkeiten, wie diese Methode verbessert werden kann, aber um zu wissen, welcher zu wählen ist, müssen Sie zuerst herausfinden, was in der aktuellen Lösung langsam ist. – biziclop