处理代码不起作用(Threads,draw(),noLoop()和loop())

时间:2013-02-27 02:16:26

标签: java processing

下面的代码应该使形状闪烁两次,我从根目录检查方法三倍,并且99%确定这些方法是正确的(如果需要,我会发布该代码)。什么是在屏幕上暂停根当前暂停状态几秒的最佳方法?

    noLoop();      
root.setVal(newVal);
root.highlight(0,255,0);
root.setopacity(200);
redraw();
try {Thread.sleep((long)1500);} 
catch (InterruptedException ex) {println("Error!");}
root.setopacity(0);
redraw();
try {Thread.sleep((long)1500);} 
catch (InterruptedException ex) {println("Error!");}
root.setopacity(200);
root.clearHL();//just to make sure I repeated these methods
root.highlight(0,255,0);
redraw();
try {Thread.sleep((long)1500);} 
catch (InterruptedException ex) {println("Error!");}
root.clearHL();
redraw();
loop();
return root;

2 个答案:

答案 0 :(得分:2)

你只能有一个线程正在进行绘图,如果你用sleep等来阻塞该线程,它将“挂起”,直到它有机会退出你的代码并返回到渲染代码里面JRE。 有很多关于它的教程,谷歌是你的朋友!

例如:http://www.java-tips.org/java-se-tips/java.awt/how-to-create-animation-paint-and-thread.html

当你在一个页面上绘图时想一想,然后不时地从你的笔记本中拉出页面进行显示。如果你用10秒画一个圆圈然后把它擦掉就没关系了。重要的是它显示在页面上的内容。

答案 1 :(得分:1)

我不确定我是否遇到了问题,而且代码不可运行,但是......也许你需要一个更简单的方法?你自己做的小计时器?问题是draw()在draw()结束时渲染帧之前执行所有指令。因此,如果你停止draw(),它将暂停,不进行任何绘制,然后继续进行所有更改并在结束时绘制。我的意思是,如果我这样做:

draw(){
fill(0);
ellipse(10,10,10,10);
delay(1000);
fill(255,255,0);
ellipse(10,10,10,10);
}

在渲染发生之前,我将永远不会看到黄色覆盖的黑色椭圆......在绘制结束时。但该节目每帧都要挂一秒......

所以也许一个简单的计时器可以为你做。这里有一个计时器的一般示例,您可以尝试根据自己的需要进行调整:

PFont font;
String time = "000";
int initialTime;
int interval = 1000;
int times;
color c = color(200);


void setup() {
  size(300, 300);
  font = createFont("Arial", 30);
  background(255);
  fill(0);
  smooth();

  //set the timer as setup is done
  initialTime = millis();
}

void draw()
{
  background(255);

  //compare elapsed time if bigger than interval...
  if (millis() - initialTime > interval)
  {
    //display the time
    time = nf(int(millis()/1000), 3);

    // reset timer
    initialTime = millis();

    //increment times
    times++;
  }

  // an arbitrary ammount
  if (times == 3) {

    //do somethng different
    c = color(random(255), random(255), random(255));

    // reset times
    times = 0;
  }

  //draw
  fill(0);
  text(time, width/2, height/2);
  fill(c);
  ellipse(75, 75, 30, 30);
}