如何只更新像素一次

时间:2014-12-25 14:04:01

标签: processing pixels

我的像素正在更新每一帧,导致效果重新应用到前一帧。我怎样才能使这种效果只发生一次而不使用noLoop()。我只想在三角形周围有一个大圆圈。请帮忙。感谢。

这是整个计划。我将frameRate设置为1,这样您就可以更轻松地看到问题:

boolean up;
int x =-300;
int y =-300;

void setup()
{
  size(600, 600);
  frameRate(1);
}

void draw()
{
  pushMatrix();
  translate(300, 300);
  float a = atan2(mouseY-300, mouseX-300);
  rotate(a);

  for (int i = x; i < x+width; i+=40)
    for (int j = y; j < y+height; j+=40)
      rect(i, j, 40, 40);

  loadPixels();
  for (int i = 0; i < pixels.length; i++)
  {
    x = i%width;
    y = i/width;
    color c = pixels[x+y*width];
    float d = dist(x, y, width/2, height/2);
    pixels[x+y*width] = color(brightness(c) - d);
  }
  updatePixels();

  popMatrix();

  fill(255, 0, 0);
  triangle(280, 300, 300, 200, 320, 300);

  if (up) 
  {
    x += sin(a)*5; 
    y += cos(a)*5;
  }
}

void keyPressed()
{
  if (key=='w')up=true;
}

void keyReleased()
{
  if (key=='w')up=false;
}

2 个答案:

答案 0 :(得分:2)

在一个框架中重新绘制所有内容。

请记住,在使用过滤器之前,必须撤消上次过滤效果。 draw()函数的通常顺序如下:

  1. 添加背景/清除您在最后一帧中添加的所有对象&amp;清除最后一帧的过滤器。
  2. 添加您的对象。
  3. 将过滤器放在最上面。
  4. 尽量避免在设置中做任何图形相关的东西,因此它会被这个draw()函数 - 范例破坏。

    这应该已经足够你的答案了。快速说明: 当你为...工作时3D - 阴影滤镜,应用滤镜可能需要很长时间。相反,我们尝试存储我们在前一帧中所做的尽可能多的计算,因此我们不需要再次计算所有内容。对象层也是如此。你不想每帧计算一个小兵的最短路径,而是你计算一次最短路径,只有当事情发生变化时才重新计算:盒子位置,玩家位置等。

答案 1 :(得分:1)

如果您只想使用过滤器并流畅地移动,请更新您的效果:

  for (int y = 0; y < height; y++)
  {
    for (int x = 0; x < width; x++)
    {
      color c = pixels[x+y*width];
      float d = dist(x, y, width/2, height/2);
      pixels[x+y*width] = color(brightness(c) - d);
    }
  }

您有不必要的计算消耗大量CPU资源。重绘背景也有助于制作更清晰的动画。

如果只想生成此效果一次,然后应用它。 PGraphics可以实现类似的目标。