じゃんけんゲームを作ってみよう8
Javaのプログラムを配布する場合には、jar という形式をつかいます。
jarファイルは zip圧縮ファイルの親戚なので、zipで展開(解凍)することもできます。
毎度、ブログ管理人イガジーです。
コマンドでjarファイルを作るには→コマンドで jar を作る方法、あるいは
Eclipseでjarファイルを作るには→Eclipseでjarを作るを参照してください。
じゃんけんゲームで使用している画像(pngファイル)は、これまでのコードだと
jarファイルの外に置く形になってしまうので、jarファイルに取り込んでみましょう。
基本的には
imc = f.createImage((ImageProducer)url.getContent());
として、urlで指定するリソースファイルを取り込むのですが、
例外処理などが必要になるので次のような感じのコードになります。
Image imc=null; // ← BufferedImage imc=null;
//... (中略)
Janken(){ // constructor
String picname="/janken.png";
read_imc(picname);
wait_imc();
// ....(中略)
} // end of constructor
void sleep(long msec) {
try {
Thread.sleep(msec);
} catch (InterruptedException e) {}
}
void read_imc(String pname) {
URL url = f.getClass().getResource(pname);
try {
imc = f.createImage((ImageProducer)url.getContent());
} catch(Exception ex){
System.out.println("not found Imagefile!");
System.exit(1);
}
}
void wait_imc() {
int t;
for (t=0;!f.prepareImage(imc,f);++t){
sleep(10);
}
// System.out.printf("prepare %d0 ms\n", t);
}
何をしているかよくわからなくても、気にせず read_imc()や
wait_imc(), sleep() などを丸々コピペして使ってください。
jarにする時には、janken.png 自体も忘れずに jarに取り込んでください。
さて、次は勝敗の%表示ですが、少数点第1位まで出したいので
浮動小数点(float)を使ってみましょう。
書式指定は、”%3.1f”などとします。
ここの 3.1 というのは、整数部3桁で、小数点以下1桁 という意味です。
.2 とすると、整数部は適当(必要な桁)で、小数点以下2桁になります。
f は、float の fで、浮動小数点型という意味です。
実際のコードは次のような感じになります。
int round=ywin+pwin+draw;
resl.setText(String.format("%d戦 あなたの %d勝 %d敗 %d分け 勝率%.1f%%",
round,ywin,pwin,draw,(float)100*ywin/round));
“%%”は%自体の表示です。
最後に、窓の大きさの調整例です(なくても別にかまいません)。
FrameやJFrameは、窓の装飾を含むサイズを指定しなければなりません。
そして、困ったことに装飾のサイズはOSやOSの設定によって変わるので
いくつにすればよいかは実行してみないとわからないのです。
ここでは、Canvasの大きさを目的のサイズになるように、Frameの大きさを
補正するメソッド例を示します。
void adjsize(){
Dimension csz=cv.getSize();
if ((csz.width!=CVWIDTH)||(csz.height!=CVHEIGHT)) {
Dimension fsz=f.getSize();
f.setSize(CVWIDTH+fsz.width-csz.width,CVHEIGHT+fsz.height-csz.height);
}
}
ここでCVWIDTHは、キャンバスの幅、CVHEIGHTは高さです。
MyCanvas cv に対して getSize()で実際のサイズを得て、
期待しているサイズと異なっていれば、JFrame f のサイズを補正しています。
f のサイズから、cv のサイズを引くと、縁(窓装飾)の大きさが分かります。
cv として確保したいサイズに、その「縁(窓装飾)の大きさ」を加えた値を
f のサイズとしてセットすれば、最適なサイズにできる。というわけです。
このadjsize()メソッドは、MouseAdapterのmouseClicked()メソッドの
末尾あたりに置けばよいでしょう。
最初(コンストラクタ)の setVisible(ture);の後に置けばよさそうに思える
のですが、setVisible(ture)自体は(少々)時間がかかってしまいます。
従って、直後に書いた adjsize()実行時には、f や cv の正しいサイズが
得られないので書いても無駄になってしまいます。
f.setVisible(true);
sleep(100);
adjsize();
}// constructor
と待ちを入れると大丈夫ですが、100ms待ちで良いかどうかは
環境によって異なります。
いかがでしたでしょうか? 単純なゲームでも、色々と工夫が必要に
なるんだな、と感じて頂ければ幸いです。
ご意見、ご感想、リクエスト、などはお気軽に、コメント欄か
メールフォームをご利用ください。
この記事へのコメントはこちら