ProcessingJS:Draw似乎没有循环?

时间:2014-04-06 16:14:11

标签: javascript processing

ProcessingJS:我的绘图似乎没有循环。我正在尝试制作一个简单的游戏,我在底部有一个盒子,块从顶部落下,你需要抓住它们。但是绘制似乎并不像它应该循环那样作为临时解决方案我正在使用重绘按键。 我已经在我的网络服务器上测试了其他人编写的其他程序,但它们都有效。 我的代码有问题吗?

编辑:更改代码以符合建议 - 仍然无法正常工作 例如:http://jordantheriault.com/processing/test.html

EDIT2:我把它缩小到了绘制中的嵌套for循环。

//Size of each cell box
int cellWidth = 25;

//Width and height of playable space in cells
int w = 8, h = 15;

//Player position
int playerX = 0, playerY = h-1;

//Score
int score = 0;
int lives = 10;

int[][] map = new int[w][h];
// 1 = player
// 2 = object to catch

void setup()
{
  size(cellWidth*w+1, cellWidth*h+1);
  background(51);
  fill(255);

  frameRate(30);

  //starting position for player
  map[playerX][playerY] = 1;

}

void draw(){  
    if(lives > 0)
    {
        background(51);

        //Draw objects onto map
        for(int i = 0; i < width-1; i++)
        {
            for(int j = 0; j < height-1; j++)
            {
                if(map[i][j] == 1)
                {
                    fill(255);
                    rect(i * cellWidth, j * cellWidth, cellWidth, cellWidth);
                }
                if(map[i][j] == 2)
                {
                    fill(200);
                    rect(i * cellWidth, j * cellWidth, cellWidth, cellWidth);
                }

            }
        }

        //Generate new object to catch
        if (frameCount%5==0) {
            //Move squares
            //TODO

            //Generate new
            newSquare = random(0,w-1);
            println(newSquare);
            map[newSquare][0] = 2;
        }
        text("Score: " + score, 5, 15); 
    }
    else
    {
        text("Game over! Press x to start again.", 10, (h*cellWidth)/2); 
        noLoop();
    }
}

void keyPressed() 

{
    //Todo: check for collisions

    if (key == 'a') {
            if(playerX != 0)
            {
                if(map[playerX-1][playerY] == 2 || map[playerX][playerY-1] == 2)
                    score++;
                map[playerX][playerY] = 0;
                playerX -= 1;
                map[playerX][playerY] = 1;
                println("Left Pressed");
                redraw();
             }
        }
     if (key == 'd') {
        if(playerX != w-1)
            {
                if(map[playerX+1][playerY] == 2 || map[playerX][playerY-1] == 2)
                    score++;
                map[playerX][playerY] = 0;
                playerX += 1;
                map[playerX][playerY] = 1;
                println("Right pressed");
                redraw();
             }
        }
        if(key == 'x' && lives < 1)
        {
            score = 0;
            lives = 10;
            //reset game
        }
}

1 个答案:

答案 0 :(得分:0)

如果您想要基于事件的更新,您需要在事件处理程序结束时调用redraw()(在它们返回之前,而不仅仅是在函数定义的末尾),以便调用draw函数。不要使用loop(),因为这只会重新启用自动下一帧调度代码(loop / noLoop函数仅控制草图是否应自动调度帧)。

另请注意,noLoop使用frameRate并不会做任何事情。第一个是第二个。

最后,请注意frameRate(300)是疯了;)您要求Processing在3毫秒内以分数运行所有绘制代码​​。那不会发生。