我正在使用處理爲學校項目編寫遊戲。我目前正在處理一名球員的視野。玩家的視野基本上是一個圓圈,但是如果前方存在障礙物,我希望視野被阻擋,這意味着您看不到障礙物後面的東西。下面的圖片是我目前的結果。在處理遊戲中創建帶陰影的視圖
我的代碼: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」,表示障礙物存在於該位置。
但是,我發現這種方法效率低下,因此造成滯後。有一個更好的方法嗎?或者,也許有已經寫好的工具可以使用?
第一個問題是:你測量了哪個位正在減慢它?有很多方法可以改進,但要知道選擇哪一種方法,首先需要找出當前解決方案中速度緩慢的方法。 – biziclop