处理2中的干扰密钥

时间:2015-04-23 23:52:32

标签: processing draw

我正试图通过按不同的键来激活不同的视觉效果。例如,当我按下“z”或“Z”时,特定位置上的椭圆向下流动,留下痕迹。如果我等待它到达画布边框,没有问题但是当我按下“0”激活另一个位置上的另一个椭圆做同样的事情时,“z”/“Z”的椭圆停止流动。当椭圆到达画布边界之前我按相同的键时也会发生这种情况。我怎样才能解决这个问题?当我开始编写代码时,我不知道类和对象,然后我学习并试图通过使用创建对象来解决它,但它变得更糟,省略号根本不起作用。我希望第一个椭圆继续到边界,即使我在另一个按键的路上按下它。

另一件事是我希望它们在短时间后淡出,所以我在画布上绘制了半透明的矩形,这对我来说似乎非常原始。你会建议一个不同的方式吗?这不太重要,但最好让它们随着时间的推移而完全消失,而不是留下轻微的痕迹。

这是我的代码,我清理了不相关的部分,使其看起来更容易理解:

void setup() {
  size(640, 500);
  background(bgRenk);
  frameRate(60);
  colorMode(HSB);
  noStroke();
}

int bgRenk = #e7e7e7;
int C3Yer;
int C3Y;
int Fd6Yer;
int Fd6Y;

void draw() {

  // This part probably sucks because it's a primitive solution to make ellipses fade out by putting semi-transparent rectangles on the canvas.

  fill(bgRenk, 10);
  rect(0, 0, 640, 500);

  // I basically map x and y positions to hue and opacity.

  float C3Renk= map(C3Yer, 0, width, 0, 255);
  float C3Opak = map(C3Y, height, 0, 0, 200);

  // When z/Z is pressed, an ellipse appears and goes down, leaving trace behind.   
  if (key == 'z' || key == 'Z') {
    C3Yer = 10;
    fill(C3Renk, 255, 255, C3Opak);
    ellipse(C3Yer, C3Y, 20, 20);
    C3Y += 20;
  }


  if (key == '0') {

    // Same mapping and ellipse thing.

    float Fd6Renk= map(Fd6Yer, 0, width, 0, 255);
    float Fd6Opak = map(Fd6Y, height, 0, 0, 200);
    Fd6Yer = 630;
    fill(Fd6Renk, 255, 255, Fd6Opak);
    ellipse(Fd6Yer, Fd6Y, 20, 20);
    Fd6Y += 20;
  }
}

void keyPressed() {


  if (key == 'z' || key == 'Z') {

    // When z/Z is pressed, y position of those ellipses are reset.


    C3Y = 10;
  }


  if (key == '0') {

    // Same reset thing.      

    Fd6Y = 10;
  }
}

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

在其他仍在流动的情况下创建新椭圆的问题是变量key,它始终包含所使用的最新密钥的值(更多see)。因此,当您在“z”后按任意键时,您的椭圆将停止绘制。 您可以使用指示应绘制哪些省略号的全局变量来避免这种情况。

但我建议使用创建具有已定义状态(位置,颜色,不透明度)的对象,并将其存储在数组或列表中。它还可以帮助你减少褪色,所以找时间阅读更多关于课程和objects的内容。在处理网站上,您可以找到不错的tutorials,例如one

但是因为你很伤心你已经尝试过创建对象但是我没有用,我会给你一些提示和这类课程的基本例子:

class Ball {
  float x, y;       // position of ball
  color col = 10;   // color of ball
  int opac = 255;   // opacity of ball

  Ball(float _x, float _y) {
    x = _x;
    y = _y;
  }

  void move() {    
    y += 20;
    opac -= 10;
  }

  void display() {        
    fill(col, 255, 255, opac);
    ellipse(x, y, 20, 20);
  }
}

然后您可以创建新的ball个对象:

void mousePressed() {
  //this will create new ball on mouse position
  balls.add( new Ball(mouseX, mouseY) );
}

并将它们存储到ArrayList中,如下所示:

ArrayList<Ball> balls = new ArrayList();

您需要做的最后一件事是displaymove draw方法中的所有球。

for (Ball b : balls) // for each ball in list
{
  b.display(); // first display ball
  b.move();    // move and change opacity
}

这是一个非常基本的例子,应该加以改进,但我希望它能帮助你理解课程。