Javaのアプレットでゲームを作ろうとしているのですが、フリー音楽制作ソフトの「Domino」を起動したままアプレットを使うと処理速度が速くなってしまう原因を教えてください。
- Javaのアプレットでゲームを作る際に、フリー音楽制作ソフトの「Domino」を起動しているとアプレットの処理速度が速くなる現象が発生しています。原因を知りたいです。
- Javaのアプレットでゲームを作ろうとしていますが、起動中のフリー音楽制作ソフト「Domino」が処理速度に影響を与えているのか疑問です。
- Javaのアプレットでゲームを作っているのですが、フリー音楽制作ソフトの「Domino」を起動していると処理速度が速くなる現象が発生しています。原因や対処法について教えてください。
- ベストアンサー
Javaのアプレットについて
Javaのアプレットでゲームを作ろうとしているのですが、フリー音楽制作ソフトの「Domino」を起動したままアプレットを使うと処理速度が速くなってしまうことがわかりました。 一応自分なりに原因を考えたのですが確証がないので、原因をご存知の方がいらっしゃれば教えていただきたいです。また、そうでなくても、何か参考になることや、皆さんなりの考え、どのようなパソコン・ソフトで同じ症状が出るのか、など、些細なことでもいいので教えていただきたいです。 わからないなりに僕が考えたのは、Dominoが使っているシステム時間とアプレットのシステム時間にはつながりがあって、Domino側がそこをいじってしまうせいでアプレットがおかしくなっているのではないか、というものです。そもそもアプレットの書き方がおかしいのかもしれませんが・・・(「考えた」ってほどよく考えてない・・・) 一応確認している範囲では、「Domino」、「Music Studio Producer」、「RPGツクールXP」などのDirectX使用ソフト、「YouTube」などの動画サイト、などなどを同時に起動していると処理が速くなることを確認しています。 問題が解決できないものであったとしても、説明書に対処法を書きたいので、よろしくお願いします。 一応、適当に作った実験用のプログラムを書いておきます。 ---------------------------------------------------- import java.applet.Applet; import java.awt.*; public class Test extends Applet implements Runnable{ Thread thread; Image bufferImage; Graphics bufG; int to_x,to_y,to_x2,to_y2,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; requestFocus(); thread = new Thread(this); thread.start(); } public void run(){ while(true){ 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; while(nowTime-preTime < frameTime){ nowTime = System.currentTimeMillis(); } preTime = nowTime; repaint(); } } public void paint(Graphics g){ bufferImage = createImage(640,480); 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); g.drawImage(bufferImage, 0, 0, this); } public void update(Graphics g){ paint(g); } }
- leaf-tsyk
- お礼率55% (5/9)
- Java
- 回答数6
- ありがとう数4
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 ちょっと、気づいたことだけですが。 nowTime = System.currentTimeMillis(); times++; sleepTime = firstTime + (frameTime * times) - nowTime; ここら辺の処理は、TimerクラスのscheduleAtFixedRateメソッドと同じような処理ですね。 もし、何らかの原因で処理が遅れた場合は、sleepをキャンセルして、早送りで追いつかせるという形ですね。 時計アプリのようなものは、針が正しい時間経過を指していないといけないので、早送りでも何でもして、追いつかなければなりません。 ただ、シューティングゲームの場合は、これが適切な挙動とはいえないように思います。 仮に何らかの理由で、1秒間、ゲームがフリーズしたとします。 そうすると、フリーズから復帰した後、少なくとも1秒間は sleepTimeは負の値をとるようになり、sleepメソッドは、キャンセルされて、ゲームが早送りのような状態となり、遅れを取り戻そうとします。 その間、ユーザーは自機のコントロールができず、運が悪ければ、敵にやられてしまいます。 これでは、ユーザーにストレスがかかってしまうでしょう。 フリーズから復帰後は、早送りで遅れを取り戻そうとはせず、そのまま、遅れたまま、普通の速度で、ゲームが進行した方がいいと思います。 早い話が、普通に、 Thread.sleep(frameTime); という、単純な形にするか、 工夫するにしても、ハードウェアの性能に影響されにくいように、1フレームの処理にかかる時間を計測して、それを frameTime から引いた時間でsleepするなどした方がいいのでは、ないでしょうか。
その他の回答 (5)
- PecoPlus
- ベストアンサー率76% (144/188)
こんにちは、またまた#1です。 確かに今回のサンプルでもscheduleメソッドが明らかに遅れているのを確認しました。 java.util.Timer のもっと単純なサンプルを作って、いろいろ調べてみたのですが、Timerの内部の処理に 10ms~15ms もかかっているようなのです。 scheduleAtFixedRateメソッドでは、遅れた分を帳尻あわせしてくれるので何とか普通に動いて見えますが、フレーム間が 16ms のゲームを作ろうとするなら、適切とは言い難い時間です。 Timerに頼らず、自前でスレッドを作り、Thread.sleep メソッドなどでタイミングを計るなどした方がよいかもしれません。
お礼
重ね重ねありがとうございます。 指摘をもとに、sleepを使った処理を自分なりに作ってみました。 しかし僕はThreadに対する知識が浅いので、プログラムに不備がある気がビンビンしています。ですから変な部分が多数あるかもしれません。今のところは正常に動いていますし、別のソフトからの影響もうけていませんが・・・ 一応書き直してみたものを貼っておきます。(long型のtimesっていう変数は「処理回数」です。適切な単語が思いつきませんでした・・・) -------------------------------------------------- import java.applet.Applet; import java.awt.*; public class Test extends Applet implements Runnable{ Thread thread; Image bufferImage; Graphics bufG; int to_x,to_y,to_x2,to_y2,count,time; long firstTime, nowTime, sleepTime; final int fps = 60; final long frameTime = 1000 / fps; long times; public void init(){ to_x=to_y=to_x2=to_y2=0; count=0; time=0; firstTime = System.currentTimeMillis(); nowTime = 0; sleepTime = 0; times = 0; requestFocus(); thread = new Thread(this); thread.start(); } public void run(){ while(true){ 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; nowTime = System.currentTimeMillis(); times++; sleepTime = firstTime + (frameTime * times) - nowTime; if(sleepTime>0){ try{ thread.sleep(sleepTime); }catch (InterruptedException e){ } } repaint(); } } public void paint(Graphics g){ bufferImage = createImage(640,480); 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); g.drawImage(bufferImage, 0, 0, this); } public void update(Graphics g){ paint(g); } }
- mpro-gram
- ベストアンサー率74% (170/228)
ご呈示のプログラムは検証してないけど、threadでよくあるのが、知らないうちに2重3重にthreadが起動して同じカウンターを回して、2倍速、3倍速になるというやつ。 こ提示ソースだとwindow 行ったり来たりで、init() が再実行されるのかな??はて? 経過時間表示なら、preTimeにスタート時刻を保持し、これは変更せず, nowTimeとの時刻の差分から表示用の分針、秒針位置(time と count)を割り出せば、2倍速になっても、同じところに描くだけなので、針の回りが速くはならないはず。
お礼
回答ありがとうございます。 原因を考える参考にさせていただきます。 しかし実は何度か検証していて気がついたのですが、どうやら処理が速くなっているのではなく、むしろ正常になっているようです。もともとは処理落ちしているところに、別のソフトを開いた影響で処理速度が正常に修正されて、結果的には速く動いているように見えていたのだと思います。 質問文に不備があり、すいませんでした。
- PecoPlus
- ベストアンサー率76% (144/188)
すいません、#1です。 質問を読み返してみたら、「速くなる」と書いてありますね。 てっきり「遅くなる」かと思いこんで読んでました。 摩訶不思議ですね。 なんでなんでしょう? できるなら、改良版で、その現象がどうなるか、ご報告をお願いします。
お礼
いただいた改良版で問題が解決しました!ありがとうございます! ただ、ちょっと不思議な解決をしていましたので、報告をしておきます。 とりあえずいただいたままで実行してみると、以前「速くなった」と言っていた速度で処理が行われるようになりました。この状態だと、別のソフトを起動しても処理速度はそのままでした。おそらくもともと、「速くなった」のではなく、普段が処理遅れしていて、別ソフト起動時が正常な処理速度だったのだと思います。 で、しかしそのあと、おっしゃっていた通りにscheduleAtFixedRateをscheduleに変えて実行してみたのですが、なぜか症状が再発しました。相変わらず別ソフトを使用すると処理速度が変化します。 原因ははっきりわかりませんが、どうやら別ソフトの影響で「前回処理からの経過時間」の計算が正常になるみたいです。 なにはともあれ、作っていたゲームもscheduleAtFixedRateを利用して処理速度を一定に保てるようになりました。ありがとうございました。 (症状の謎については、もうちょっと調べてみようかと思います。)
- PecoPlus
- ベストアンサー率76% (144/188)
#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(); } } }
- PecoPlus
- ベストアンサー率76% (144/188)
こんにちは。 ちょっと、補足をお願いしたいのですが、これは、 1.違う性能のハードウェアでも一定の動きをしてほしい、時計もしくはアニメのようなものを作っている 2.ハードウェアの性能に比例した動きをしてほしい、ベンチマークのようなものを作っている どちらなのでしょうか? たぶん、1.だと思うのですが、できているのは2.ですよね。 仮に1.を目指しているのだとして、この短い針は秒針なのでしょうか?(つまり一周回って1分) その割にぶんぶん回ってますが。 補足お願いします。
補足
回答ありがとうございます。 おっしゃる通り、1です。 実際に作っているゲームの方はシューティングゲームで、キー入力があったり敵との撃ち合いがあったりするので、環境によって性能差が出てしまうと(特に今回の問題は敵の動きが速くなってしまうので)ゲームの難易度が安定しないという事態に陥ると思い、原因を探っていました。 あと、小さい方の針はミリ秒に対応して回っています。約1秒で1回転です(厳密には1秒×1/50くらい遅いのかな?)。 プログラミングが分かる方であったら僕みたいな初心者が説明するのは失礼なのかもしれませんが、一応貼っておいたプログラムについて説明しておきます。 まず、1秒間に60回画面を更新したかったので(作っているゲームがそうだからです)、1秒÷60を計算しました。実際のパソコンの処理では、時間は最小値がミリ秒で扱われているので、1000/60(プログラム文内では1000/fpsの事)を計算しています。で、パソコンのシステムで動いてる時計から、「前回の処理から何ミリ秒かかったか」を調べ出し、これが先ほどの1000/60を超えたところで1回、処理をしています。処理内容は「システム時間とは別個の独自のタイマーを進め、針をそれに合わせる」だけです。 あくまで「どんな状況において処理が速くなるのか」を調べるためのプログラムだったので、細かいことは考えていませんでした。(1000/60って16.6666・・・だから、実際には毎処理17-16.6666・・・ずつ遅れてる気がする・・・) ともかく、どんな環境でも一定の動作をするのを目指して作っています。
関連するQ&A
- javaアプレットでのy=x^2のグラフ
javaアプレットでy=x^2のグラフを描写したいのですが、現在の状態ではグラフの右側しか画面に現れません。軸の移動をすればよいと思うのですが、どのように修正すればよいのでしょうか? import java.applet.Applet; import java.awt.Graphics; import java.awt.Color; public class test1 extends Applet{ public void paint(Graphics g){ g.setColor(Color.red); int x,yp=100,xp=0; for(x=0;x<200;x++){ int y=(int)(x*x)*(-1)+100; g.drawLine(xp,yp,x,y); xp = x; yp = y; } } }
- ベストアンサー
- その他(ソフトウェア)
- アナログ時計のつくりかた
お世話になります。 現在アナログ時計を作成しているのですが、 時間を指す針がうまく動いてくれません。 今は、5時代なら5のところを指すだけで、 6時までの中間地点を全く指してくれない状態です。 import java.awt.*; import java.applet.*; import java.util.*; public class tokei extends Applet{ public void paint(Graphics g){ g.drawOval(0,0,150,150); Calendar cal=Calendar.getInstance(); int hr = cal.get(Calendar.HOUR); int min = cal.get(Calendar.MINUTE); int x0, x1, y0, y1, x2, y2, r1=30, r2=45; x0=75; y0=75; x1=75+(int)Math.rint(r1*Math.sin(hr/12.0*2*Math.PI)); y1=75-(int)Math.rint(r1*Math.cos(hr/12.0*2*Math.PI)); g.drawLine(x0, y0, x1, y1); x2=75+(int)Math.rint(r2*Math.sin(min/60.0*2*Math.PI)); y2=75-(int)Math.rint(r2*Math.cos(min/60.0*2*Math.PI)); g.drawLine(x0, y0, x2, y2); } } x1=75+(int)Math.rint(r1*Math.sin(hr/12.0*2*Math.PI)); y1=75-(int)Math.rint(r1*Math.cos(hr/12.0*2*Math.PI)); の部分が間違っているのだろうなと思うのですが、 どのように直せばよいのかわかりません。 恐れ入りますが、どなかた教えて頂けないでしょうか? どうぞよろしくお願いいたします。
- 締切済み
- Java
- Javaアプレットについてですが
Javaアプレットでボタンを押したら数字が増えるものを作っているのですがどうもうまく動きません。 ソースは下の通りです。 変更しなければいけないところがあるならお願いします。 import java.applet.Applet; import java.awt.Graphics; import java.awt.Button; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class Sample7 extends Applet implements Runnable, ActionListener { Button bt; int num; public void init() { bt = new Button("開始"); add(bt); bt.addActionListener(this); Thread th; th = new Thread(this); th.start(); } public void actionPerformed(ActionEvent ae) { public void run() { try{ for(int i=0; i<11; i++){ num = i; repaint(); Thread.sleep(1000); } } catch(InterruptedException e){} } } public void paint(Graphics g) { String str = num + "です。"; g.drawString(str, 50, 50); } }
- ベストアンサー
- Java
- Javaアプレットとマルチスレッドの組み合わせ
Javaアプレットとマルチスレッドを組み合わせてパラパラ漫画のようなものを作りたいのですがうまくいきません。 import java.awt.Graphics; import java.awt.Image; public class kadai4 extends java.applet.Applet implements Runnable{ Image logoImage[]; Thread runner; int current; int last=6; public void init(){ logoImage=new Image[last]; for(int i=0;i<last;i++){ logoImage[i] = getImage(getCodeBase(),"image/logo" + (i+1) + ".gif"); } } public void start(){ if(runner == null){ runner = new Thread(this); runner.start(); } } public void stop(){ if(runner != null){ runner.stop(); runner=null; } } public void run(){ while(true){ for(int i=0;i<last;i++){ current=i; repaint(); pause(400); } } } public void paint(Graphics g){ g.drawImage(logoImage[current],50,25,50,50,this); } void pause(int time){ try { Thread.sleep(time);} catch (InterruptedException e) {} } } これを実行すると推奨されない API を使用またはオーバーライドしています。というエラーが発生するのですがどうすれば良いでしょうか?他の方法でも構いません
- ベストアンサー
- Java
- javaアプレットの課題について
大学の授業の課題についてなんですが、 javaアプレットを使って 「徐々に大きな四角形を表示させ、ある程度の大きさの四角形になったらまた最初に戻り、さらにボタンを表示させ、ボタンを押す度に四角形の拡大をストップ、スタートさせるプログラムを作れ。また、マウスでクリックした部分を中心に、徐々に大きな四角形を表示させるようにもするように。」 という、自分でも書いていて分からなくなりそうな内容の課題が出されまして、先生などのアドバイスを頼りに import java.applet; import java.awt.Graphics; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.Color; import java.awt.Button; public class Report1 extends Applet implements ActionListener,Runnable { int x = 10; int y = 10; Button bt; public void init() { addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { x = e.getX(); y = e.getY(); repaint(); } }); { bt.setLabel("pause"); } while{ } if() repaint(); public void paint(Graphics g) { g.setColor(Color, white); g.fillRect(0, 0, 400, 400); } public void update(Graphics g){ paint(); 何とか上のような感じにまではこぎつけたのですが、 ここからは正直どうすればいいのか検討がつかず お手上げ状態なんです... どなたか解答又は参考になるサイトがあれば 教えていただけないでしょうか? よろしくお願いします。
- ベストアンサー
- Java
- javaアプレット
javaアプレットの勉強をしているのですが、教えてください。 マウスを押すと位置を取得して、線を描くアプレットをつくってみたいと思っています。 一回目に押した位置を始点として、二回目の位置まで線を引きます。このとき、二回目にマウスを押したときにはじめて線を描画するとします。その後、三回目、四回目とマウスを押していくと、前に押した位置を始点として線を引くようなアプレットです。 そこで以下のようにコードを書いて実行してみました。(部分) public void mousePressed(MouseEvent e) { n=n+1; if(n==1){ x1=e.getX(); y1=e.getY();} else{ x2=e.getX(); y2=e.getY(); repaint(); x1=x2; y1=y2; } } public void paint(Graphics g) { g.drawLine(x1,y1,x2,y2); } ところが、実行してみると、マウスを押す位置に点が移動するだけでした。おそらく、コード中のx1=x2;y1=y2;がrepaint();より前に実行されてしまうのではないかと思います。どう書き直せばいいのでしょうか?また、どうしてrepaint();より前に実行されてしまうのでしょうか?
- ベストアンサー
- Java
- JAVAのアプレットのアニメーションの質問
javaのアプレットに関する質問なんですが、今次の条件でアニメーションを作っているんですが、どうしても解決できない問題があります。 赤い長方形が左から右に動いていくプログラムを作成する。 ・ 長方形が描画領域 の右端に消えると左端から再 度出現するようにせよ。 ・ Reverseと書かれたボタンを押すと長方形の進行方 向が左右反対になる。 ・ このとき、左右どちらの端に長方形が消えた場合も 反対端から長方形は出現する。 ・ 長方形をクリック(ボタン押下)すると長方形の色が 変化する。 ・ 赤い長方形であれば青に、青い長方形であれば赤 に変化する。 この条件でつくろうと思っているのですが、長方形をクリックしたときに、色の変化がどうしてもできません。どこに問題があるか分かりません。御教授お願いします。 import java.applet.Applet; import java.awt.Graphics; import java.awt.Color; import java.awt.Font; import java.awt.Button; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.MouseListener; public class Report2 extends Applet implements Runnable,ActionListener,MouseListener{ int x=100; int y=50; int width=80; int height=120; int dir=-2; int w; int z; Button bt; boolean direction; boolean colorRed; public void actionPerformed(ActionEvent ae){ if(direction==true){ direction=false; } else{ direction=true; } } public void init(){ bt=new Button("Reverse"); add(bt); bt.addActionListener(this); Thread th; th =new Thread(this); th.start(); addMouseListener(this); } public void mouseClicked(MouseEvent e){ w=e.getX(); z=e.getY(); repaint(); if(e.getX()>=x && e.getX()<=x+width && e.getY()>=y && e.getY()<=y+height){ colorRed=!colorRed; } } public void mouseEntered(MouseEvent e){ } public void mouseExited(MouseEvent e){ } public void mouseReleased(MouseEvent e){ } public void mousePressed(MouseEvent e){ w=e.getX(); z=e.getY(); repaint(); if(e.getX()>=x && e.getX()<=x+width && e.getY()>=y && e.getY()<=y+height){ colorRed=!colorRed; } } public void run() { while(true){ x++; if(x==400){ x=-80; } if(direction==true){ x=x+dir; } else{ } repaint(); try{ Thread.sleep(30); } catch(InterruptedException e){} } } public void paint(Graphics g){ g.setColor(Color.white); g.fillRect(0,0,400,200); g.setColor(Color.red); g.fillRect(x,y,80,120); if(colorRed=true){ g.setColor(Color.red); } if(colorRed=false){ g.setColor(Color.blue); } g.fillRect(x,y,width,height); g.setColor(Color.black); g.fillRect(x,y,10,10); } }
- ベストアンサー
- Java
- javaでアプレットの描画が出来ない
ものすごく初心者な質問で申し訳ありません。 jdk-1.6.0をVine linux 3.2にインストールして使用しています。 javaのソースを書いてコンパイルするなどには問題は無いのですが (今のところ) 以下のようなアプレットを試してみたところアプレットの窓は起動しますが 描画がされません。 import java.applet.Applet; import java.awt.Graphics; /* <applet code="test" width=200 height=200> </applet> */ public class test extends Applet { public void paint(Graphics g) { g.drawLine(10,10,180,110); } } 以上のコードを %javac test.java %appletviewer test.java としました。窓は起動し、アプレットが開始された、と表示されるのですが 線が見当たりません。 (ちなみに教科書にあるサンプルなので間違いがあったとしたら写し間違いです) 線が表示されるはずなんですが、表示されないのです。 まども起動するので何かJAVAを使う環境として何か細かい設定を間違って いるのかと思い質問しました。 分かる方がいらっしゃったら教えてください。
- 締切済み
- Java
- アプレットでマウスイベントが出ない
クリックしても反応しません。 また、マウスイベントが発生したときに飛ぶメソッドにSystem.out.printlnを入れるとException in thread "AWT-EventQueue-0" java.lang.NullPointerException: component argument pDataが出ることがあります。 import java.applet.Applet; import java.awt.Graphics; import java.awt.event.MouseListener; import java.awt.event.MouseEvent; public class NewJApplet extends javax.swing.JApplet implements MouseListener{ int x = 10; int y = 10; public void init() { x = 50; y = 50; } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed( MouseEvent e ){ x = e.getX(); // マウスがクリックされた位置のx座標を取得する y = e.getY(); // マウスがクリックされた位置のy座標を取得する repaint(); // アプレットの再描画を指示する } public void mouseReleased(MouseEvent e) { } public void paint(Graphics g) { g.fillOval(x,y,10,10); } } 使ってるのは jre1.6.0_01 NetBeans 5.5です
- ベストアンサー
- Java
- javaアプレット repaintのタイミング
勉強を始めたばかりなので稚拙な質問ですがお許しください。 ユーザーからの入力→repaint→画面に反映→プログラムが処理→repaint→画面に反映 というターン制のような動かし方をしたいのですが、実際にはユーザーの入力の後、プログラムの処理を待ってからまとめてrepaintしてしまいます。 repaint()は再描画を要求しているだけに過ぎず、repaint()と書いた場所で即時に再描画されるわけではないそうですが、では具体的にすぐ再描画してほしい場合はどうすればいいのでしょうか? 例えばですが、「ボタンを押すとcountの値が+1され、四角がcount個描画される。その一秒後に、こちらが何もしなくてもcountが+2されてもう一度四角がcount個(つまりこの時点で合計三個)描画される」というのを作ってみました。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class question extends Applet implements ActionListener{ Button bt1; int count = 0; public void init(){ bt1 = new Button("start"); add(bt1); bt1.addActionListener(this); } public void actionPerformed(ActionEvent e) { if (e.getSource() == bt1) { bt1.setEnabled(false); count += 1; repaint(); try { Thread.sleep(1000); } catch (InterruptedException e1) { } count += 2; repaint(); bt1.setEnabled(true); } } public void paint(Graphics g){ for(int i = 0; i < count; i++){ g.drawRect(10, 10, 10 + i * 5, 10 + i * 5); } } } これではボタンを押すたびに3つずつ四角が増えているように外見上見えてしまいます。 ボタンを押すとしっかり1つ四角を表示してから一秒待って、2つ四角を増やす。という風にするためにはどうすればよいのでしょうか? どなたかご教示ください。 ちなみにpaintImmediatelyというものを見つけましたが、何故か使えず……(メソッドpaintImmediatelyは未定義ですと言われてしまう)
- ベストアンサー
- Java
お礼
おおお、盲点でした。確かにこのままの形式だと処理遅れ時にゲームが成り立ちませんね。 プレイヤーが不利にならないように作りなおしてみます。よく考えてみると、処理落ち時にプレイヤーが有利になるのはやむを得ないのかもしれないですね。