我正在使用Processing为学校项目编写游戏。我目前正在处理玩家的视野。玩家的视野基本上是一个圆圈,但如果前方有障碍物,我希望视线被阻挡,这意味着你无法看到障碍物背后的东西。下图是我目前的结果。
我的代码: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的二维数组,&#34; 1&#34;表示该位置存在障碍物。
但是,我觉得这种方法效率低下,造成滞后。有一个更好的方法吗?或者也许已经有我可以使用的书面工具了?
答案 0 :(得分: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);
}
}
但老实说,你可以做的最好的事情是谷歌“处理阴影映射”并花一些时间阅读结果。对于单个Stack Overflow问题,这个问题有点过于宽泛。