在处理游戏

时间:2016-05-27 09:27:54

标签: processing

我正在使用Processing为学校项目编写游戏。我目前正在处理玩家的视野。玩家的视野基本上是一个圆圈,但如果前方有障碍物,我希望视线被阻挡,这意味着你无法看到障碍物背后的东西。下图是我目前的结果。

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的二维数组,&#34; 1&#34;表示该位置存在障碍物。

但是,我觉得这种方法效率低下,造成滞后。有一个更好的方法吗?或者也许已经有我可以使用的书面工具了?

1 个答案:

答案 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问题,这个问题有点过于宽泛。