类方法在Processing中的draw()中无法正常工作

时间:2017-05-25 06:34:56

标签: java processing

我在Processing中编写了一些代码,基本上我正在尝试做的是获得一个蓝色方块来“点亮”(变为较浅的阴影),然后再返回。我编写了一个超类和一个子类,在子类中有一个方法,用于实现这一点。这是代码:

超类

abstract class Squares {
  color darkBlue = color(0, 0, 204);
  color brightBlue = color(0, 0, 255);

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

  float _x;
  float _y;
  color _c;

  abstract void drawSquare();

  abstract void brighten();

  abstract void darken();
}

子类

class blueSquare extends Squares {
  blueSquare(float x, float y) {
    super(x, y);
    _c = darkBlue;
  }

  void drawSquare() {
    fill(_c);
    rect(_x, _y, 240, 240);
  }

  void brighten() {
    _c = brightBlue;
    this.drawSquare();
  }

  void darken() {
    _c = darkBlue;
    this.drawSquare();
  }

  void onOff() {
    this.brighten();
    delay(500);
    this.darken();
  }

  String toString() {
    return ("Blue color is" + _c);
  }
}

主要方法

blueSquare blueSquare = new blueSquare(310, 310);

void setup() {
  background(50);
  size(600, 600);
  drawSquares();
}

void draw() {
  blueSquare.onOff();
  println(blueSquare);
}

void drawSquares() {
  strokeWeight(5);
  blueSquare.drawSquare();
}

onOff()方法仅适用于println中的setup()的{​​{1}}的实际变化颜色(仅在delay()的证据中),且仅在draw()在它之前。如何在print('Sentence {} has a sentiment score of {}'.format(index,sentence_sentiment) IndentationError:unexpected indent 中使其正常工作,以便在按下按钮,单击鼠标等时可以使其闪烁?感谢。

2 个答案:

答案 0 :(得分:0)

不要在绘制中使用延迟,它将无法工作,因为绘制将绘制最后的颜色(在所有内容结束之前不会被调用)。我将使用一个线程和一个标志。线程可以等待500ms,然后更改标志。每次绘制矩形时,都会检查该标志并更改颜色填充。 您可以在参考中检查线程。

进行此更改,它将起作用(保持Squares不变):

超类:

blueSquare blue = new blueSquare(310, 310);

void setup() {
  background(50);
  size(600, 600);
}

void draw() 
{
  strokeWeight(5);
  blue.drawSquare();
}

void mousePressed()
{
  thread("onOff");    
}

void onOff()
{
  blue.flashing();
  delay(500);
  blue.noFlashing();
}

blueSquare

class blueSquare extends Squares 
{
  boolean _flashing;
  blueSquare(float x, float y) 
  {
    super(x, y);
    this._c = darkBlue;
    this._flashing=false;
  }

  void drawSquare() 
  {
    if (this._flashing)
    {
      this._c=brightBlue;
    }
    else
    {
      this._c=darkBlue;
    }
    fill(_c);
    rect(_x, _y, 240, 240);
  }

  void brighten() 
  {
    this._c = brightBlue;
    this.drawSquare();
  }

  void darken() {
    _c = darkBlue;
    this.drawSquare();
  }

  String toString() 
  {
    return ("Blue color is" + _c);
  }

  void flashing()
  {
    this._flashing=true;
  }

  void noFlashing()
  {
    this._flashing=false;
  }

}

答案 1 :(得分:0)

您不应在动画草图中使用delay()功能。你也不应该使用单独的线程。

相反,请使用millis()函数或frameCount变量为动画添加时间。

这是一个简单的示例,显示了一个方块,您可以一次变为绿色1秒:

int startFrame;
int duration = 60;
boolean on = false;

void draw() {
  if (on) {
    background(0, 255, 0);
  } else {
    background(0, 0, 255);
  }

  if (startFrame + duration < frameCount) {
    on = false;
  }
}

void mousePressed() {
  startFrame = frameCount;
  on = true;
}

请注意,这只是一个示例,但您可以使用这些概念在动画中设置时间。