在Processing中执行函数的顺序是什么?

时间:2014-06-16 15:06:21

标签: function processing

我的代码完全符合我的要求,但我不明白为什么。我得到草图开始时调用setup()一次,但我不确定draw()mouseMoved()。我认为在draw()之后立即调用setup()并一遍又一遍地执行,但如果是这种情况,那么mouseMoved()会在哪里进来?我从来没有打电话给它,但它仍然被执行。如果draw()正在连续执行,那么mouseMoved()怎么可能被执行?它们是否同时执行?

float radius = 50.0;
int x, y;
int mx, my;
int delay = 16;

void setup()
{
  size(200, 200);
  strokeWeight(10);
  frameRate(15);
  x = width / 2;
  y = height / 2;
}

void draw()
{
  radius += sin(frameCount / 4);

  x += (mx-x)/delay;
  y += (my-y)/delay;

  background(100);

  fill(0, 121, 184);

  stroke(255);

  ellipse(x, y, radius, radius);

}

void mouseMoved()
{
  mx = mouseX;
  my = mouseY;
}

1 个答案:

答案 0 :(得分:3)

就像你说的那样,程序启动后会调用setup()一次。它设置一切。然后默认情况下,draw()被调用60次。根据{{​​3}}:

  

在setup()之后直接调用,draw()函数连续执行   执行其块内包含的代码行,直到   程序停止或调用noLoop()。调用draw()   自动,绝不应该明确调用。

mousePressed()mouseMoved()等事件会在draw()函数中自动连续调用。

  

每个草图只能有一个draw()函数,而draw()必须   如果您希望代码连续运行或处理事件,则存在   例如mousePressed()。

现在,mouseMoved()执行以下操作(链接documentation):

  

每次鼠标移动时都会调用mouseMoved()函数   未按下鼠标按钮。 (如果按下按钮,   而是调用mouseDragged()。)

draw()是持续监听事件以查看鼠标是否移动的内容。如果鼠标移动,那么该事件将发送到mouseMoved()并执行其中定义的内容。

如果您想测试某些功能的调用方式,请在noLoop()中放置draw(),然后您就会看到mouseMoved()未被调用。您还可以使用draw()更改frameRate()在一秒钟内调用的次数(请参阅here)。