0

以下のコードは、シェイプを2回フラッシュする必要があります。ルートからメソッドをトリプルチェックし、それらのメソッドが正しいことを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;
4

2 に答える 2

2

描画を実行できるスレッドは 1 つだけです。そのスレッドをsleep他のもので詰まらせると、コードから抜け出して JRE 内のコードのレンダリングに戻る機会が得られるまで「ハング」します。それについてのチュートリアルはたくさんあります。Google はあなたの友達です!

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

ページに絵を描いていると考えてください。時々、ページがノートブックから引き出されて表示されます。円を描くのに 10 秒かかってもかまいません。重要なのは、ページが表示されたときの内容だけです。

于 2013-02-27T02:19:44.423 に答える
1

問題が発生したかどうかはわかりません。コードは実行できませんが、もっと簡単なアプローチが必要なのではないでしょうか。自分で作った小さなタイマー?重要なのは、draw()がdraw()の最後にフレームをレンダリングする前に、すべての命令を実行することです。したがって、draw()を停止すると、描画を行わずに一時停止し、最後にすべての変更と描画を続行します。私がそうするなら、私は意味します:

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

レンダリングが行われる前に黄色の楕円で覆われているため、黒い楕円は表示されません...描画の最後に。しかし、プログラムはフレームごとに1秒間ハングします...

だから多分簡単なタイマーがあなたのためにそれをすることができます。ここに、ニーズに合わせて調整できるタイマーの一般的なサンプルを示します。

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);
}
于 2013-03-01T05:14:46.337 に答える