2016-05-27 4 views
2

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

The link to the image

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?

+0

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

Antwort

0

Wovon du sprichst, heißt 2d shadow mapping. Es ist kein triviales Thema, aber es gibt eine Menge Ressourcen bei Google. Ich empfehle dringend, sie zu lesen, weil sie es viel besser erklären werden als ich es kann.

Aber ich habe this sketch on OpenProcessing gefunden, die das tut, was Sie beschreiben. Der vollständige Code ist zu diesem Link zur Verfügung, aber das betreffende Bit scheint diese Funktion zu sein:

void drawShadow() { 
    PVector tmp; 
    PVector m = new PVector(mouseX, mouseY); //mouse vector 

    fill(0); 
    stroke(0); 
    for (int i=0; i < vertCnt; i++) { 
     beginShape(); 

     PVector v1 = p[i]; //current vertex 
     PVector v2 = p[i==vertCnt-1?0:i+1]; //"next" vertex 
     vertex(v2.x, v2.y); 
     vertex(v1.x, v1.y); 

     //current shadow vertex 
     tmp = PVector.sub(v1, m); 
     tmp.normalize(); 
     tmp.mult(5000); //extend well off screen 
     tmp.add(v1); //true up position 
     vertex(tmp.x, tmp.y); 

     //"next" shadow vertex 
     tmp = PVector.sub(v2, m); 
     tmp.normalize(); 
     tmp.mult(5000); //extend well off screen 
     tmp.add(v2); //true up position 
     vertex(tmp.x, tmp.y); 

     endShape(CLOSE); 
    } 
    } 

Aber ehrlich das Beste, was Sie tun können, ist Google „Verarbeitung Shadow Mapping“ und verbringen einige Zeit das Lesen durch Ergebnisse. Dies ist ein großes Thema, das für eine einzelne Stack Overflow-Frage ein wenig zu weit gefasst ist.

+0

Danke für Ihre Anleitung, jetzt weiß ich, wonach ich suchen muss, es hat mir sehr geholfen! –

Verwandte Themen