2016-05-27 79 views
2

我正在使用處理爲學校項目編寫遊戲。我目前正在處理一名球員的視野。玩家的視野基本上是一個圓圈,但是如果前方存在障礙物,我希望視野被阻擋,這意味着您看不到障礙物後面的東西。下面的圖片是我目前的結果。在處理遊戲中創建帶陰影的視圖

The link to the image

我的代碼:http://pastie.org/10854654

我使用的方法是要經過的觀點從中心開始球員場上的每個像素,選擇對周圍的路徑。當我向外搜索時,如果在路徑上發現障礙物,我會在路徑的其餘部分畫一條黑線。逐漸改變路徑的方向,最終覆蓋整個圓。

//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是一個二維數組,其中0和1代表「1」,表示障礙物存在於該位置。

但是,我發現這種方法效率低下,因此造成滯後。有一個更好的方法嗎?或者,也許有已經寫好的工具可以使用?

+0

第一個問題是:你測量了哪個位正在減慢它?有很多方法可以改進,但要知道選擇哪一種方法,首先需要找出當前解決方案中速度緩慢的方法。 – biziclop

回答

0

你在說什麼叫做2d陰影映射。這不是一個小問題,但谷歌有大量資源。我強烈建議你閱讀它們,因爲它們會比我更好地解釋它。

但我確實發現this sketch on OpenProcessing這是你所描述的。完整的代碼可以在該鏈接,但相關的位似乎是這樣的功能:

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

但說實話,你能做的最好的事情是谷歌「處理陰影映射」,花一些時間通過閱讀結果。這是一個巨大的話題,對於單個堆棧溢出問題來說太廣泛了。

+0

感謝您的指導,現在我知道要搜索什麼,它真的幫了很大忙! –