質問: " + 1000*count/60,20,60); g.drawimage(bufferimage, 0, 0, this); } public void update(graphics g){ paint(g); } }
回答: #1です。 ああ、なるほど、それで60という数字が出てきたのですね。 そういうことなら、私なら java.util.timer クラスを使って↓みたいにします。 最初プログラムを動かすときにタスクマネージャーか何かで、cpuの使用率を見てください。 1コア分がフル回転していると思います。 フル回転しているので、ハードウェアの性能や同時に動いている他のプログラムの影響で、速度が変わってしまいます。 そもそもスレッドをフル回転させて、countを1ずつ足していっていますが、これが1msとは全く限りません。 改良版を動かしてみて、cpu使用率を見てください。 ほとんどcpuに負担をかけていないことがわかると思います。 負担がかかっておらず余裕があるので、少しばかり他のプログラムの影響があったり、低性能ハードウェアでも、問題はありません。 もちろん、高性能ハードウェアでも、速度が上がることもありません。 java.util.timer は、フレーム間の1000/60ms をsleepメソッドで時間をつぶしています。 その間は、スレッドは休止状態なので、cpuに負担もかからず、フレームの速度も一定に保つことができるのです。 あと、今回は、時計だと思ったので、timerクラスのscheduleatfixedrateメソッドを使いましたが、ゲームならscheduleメソッドを使うのが適切かと思います。 (コンパイルするときは全角スペースを半角スペースに変換してからにしてください) import java.applet.applet; import java.awt.*; import java.util.timer; import java.util.timertask; public class test extends applet { timer timer; image bufferimage; int to_x, to_y, to_x2, to_y2; int count, time; long pretime, nowtime; final int fps = 60; final double frametime = 1000 / fps; public void init() { to_x = to_y = to_x2 = to_y2 = 0; count = 0; time = 0; pretime = 0; nowtime = 0; bufferimage = createimage(640, 480); requestfocus(); timer = new timer(); updatetask ut = new updatetask(1000l / 60l); timer.scheduleatfixedrate(ut, ut.period, ut.period); } public void paint(graphics g) { graphics bufg = bufferimage.getgraphics(); bufg.setcolor(color.black); bufg.fillrect(0, 0, 640, 480); bufg.setcolor(color.white); bufg.drawline(400,240,to_x,to_y); bufg.drawline(130,350,to_x2,to_y2); bufg.setfont(new font("serif", font.bold + font.italic, 14)); bufg.drawstring("time = " + time, 20, 30); bufg.drawstring("milli_second = " + 1000 * count / 60, 20, 60); bufg.dispose(); g.drawimage(bufferimage, 0, 0, this); } public void update(graphics g) { paint(g); } private class updatetask extends timertask { long period; updatetask(long period) { this.period = period; } @override public void run() { count++; if (count >= 60) { count = 0; time++; if (time >= 60) { time = 0; } } to_x = (int)(200 * math.cos(math.pi * (time - 15) / 60 * 2)) + 400; to_y = (int)(200 * math.sin(math.pi * (time - 15) / 60 * 2)) + 240; to_x2 = (int)(100 * math.cos(math.pi * (count - 15) / 60 * 2)) + 130; to_y2 = (int)(100 * math.sin(math.pi * (count - 15) / 60 * 2)) + 350; repaint(); } } }