JAVAプログラミング講座
宇宙のJAVAさん
にいさん・・・
にいさん・・・
にいさ〜ん
・・・
・・
・
- 10年前 -
なにやってるんだ、グレート! こっちだ!
|
まってよ〜 にいさん!
|
じゃ、今日は FileDialogクラスの勉強だ!
FileDialogを使うと、簡単に入出力ファイル名をJAVAプログラムに渡せるぞ。
はい!
い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い、い・・・
いんた、ぷりたぁ〜
JAVA Beans 全盛のこのご時世に、
FileDialogクラスか?
スーパー・くまよ!
お、おまえは、悪のJAVA大王!
スーパー・くまよ。 おまえの実力ならJAVAで天下を取れる。
私と組んで、軟弱なOSをリソース不足で固めないか?
断る! JAVAは正しく使ってこそ、優秀な言語だ!
ほほう。 この私に逆らうとはな・・・
ゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴ・・・
逃げろ、グレート!
でも、にいさん・・・
いいから行くんだ!
ふ、ふ、ふ。
SwingConstants
フラッシュ!
わぁ〜
グレート!
どぎゃ〜ん!
だ、大丈夫か? グレート?
にいさん! 血が!
大丈夫だ。 俺は奴と決着をつける。
今すぐ逃げろ、グレート!
でも・・・
いいから行くんだ!
・・・ わかったよ、にいさん。
最後に聞くが、私と手を組む気はないか?
くどい! OSは落としても、心まで売るつもりは無い!
そうか、残念だ・・・
synchronized
void mousePressed(MouseEvent event・・・
public void mouseClicked(MouseEvent event)・・・
public void mouseReleased(MouseEvent event) ・・・
public void mouseEntered(MouseEvent event)・・・
!? 新マウスイベントモデルか! しかも複数!
そうか、JARで固めて一気に来るきか!!
そのとおり! さらばだ、我が永遠のライバル!
JAR
-cvf hello.jar *.class アタック!
ち!
processRequest(HttpServletRequest request)
フラッシュ!
(はっ、はっ、はっ)
だいぶ離れたぞ。 しかし、大丈夫かな? にいさん・・・
とにかく今は急いで、このことを森のみんなに知らせなきゃ!
ギバーーーーーーーーーーーーーン!
うわーーーーーーーーーー
な、なんだ!
あ、さっきまでいた山がなくなっている!
そんな・・・
にいさ〜ん!
にいさ〜ん!
にいさ〜ん!
・・・
・・
・
こうして兄と生き別れになったグレート。
そしてこれより10年後、驚くべき再会をはたす。
JAVANなったグレート・クマ、そしてワルグマ将軍。
今再び、森に緊張が走る!
次回、宇宙刑事JAVAN 第4話 「刻(とき)の行方」。
君も JAVAを語るプログラマーとなれ!
− 続く −
くま先生の ノベルゲームをつくっちゃお(全6回)
第6回 見栄えを良くしよう
こんにちは、みなさん!
こんにちは、くま先生!
さていよいよ「ノベルゲームをつくっちゃお」の最終回です!
本来なら2000年中に最終回を迎える予定でしたが、馬鹿がいきがった挙句、間に合いませんでした!
さすがは、だめも〜爆裂健!
さて前回で一通りプログラムは最低限のプログラムは終わりましたが、見栄えがあまりにへっぽこです。
そうだみゃ〜
そんな訳で見栄えを良くして行きましょう。
まず最初は、IF分選択文を選ぶ時のマウスカーソルです。
選択文の上にマウスカーソルを持っていくと、カーソルが変わるようにしましょう!
それはいいかんがえだも〜
マウスボタンが押されたり、離されたりするのは、MouseListener
というリスナーの中にプログラムをします。
この講座で使っている JAVAアプレットの雛型 には、最初からMouseListener は書いてあります。
ソースプログラムの下のほうに、
| // マウス処理クラス(MouseAction Class) class MouseAction extends MouseAdapter{ |
と書いてある部分がそうです。
このリスナーの中に「マウスボタンが押された時のプログラム(マウスダウンイベント)」と「マウスボタンが離された時のプログラム(マウスアップイベント)」を書きます。
今回のノベルゲームでは、マウスダウンイベントの方しか使ってませんが・・・
さて、「マウスカーソルが動いて、選択文の上に来たらカーソルを変更」という場合は、
「マウスダウンイベント」でも「マウスアップイベント」でもありません!
どうするのかも?
「マウス移動イベント」になります。
マウス移動イベントには、 MouseMotionListener にプログラムをします。
あまりゲームで使わないと思って、雛型には MouseMotionListener を書き込んでません。
そんな訳で、マウスモーションリスナー(MouseMotionListener)を追加します。
マウスリスナー(MouseListener)の下にプログラムを追加します。
| public void mouseReleased(MouseEvent e) { // マウスアップイベント } // mouseReleased() } // MouseAction // ----------------------------------------------------------- // =============================================================== |
// マウス移動イベント
と書いてある文の下に「マウスが移動した時に実行されるプログラム」を書きます。
ちょっとでもマウスが動いたら実行されるので、かなりしょっちゅう実行される命令になります。
で、このリスナーを登録します。
init() の一番下にマウスリスナー(MouseListener)を登録している1行があります。
その下に マウスモーションリスナー(MouseMotionListener)を登録するプログラムを追加します。
| // マウス処理アクションリスナー定義と登録 addMouseListener(new MouseAction()); // マウス移動処理アクションリスナー定義と登録 addMouseMotionListener(new MouseMotionAction()); } // init() |
これで、マウスを動かした時にプログラムを実行させるのが可能となりました。
次に実際のプログラムです。
マウスカーソルの形を変えるのは、setCursor()
という命令です。
setCursor(new Cursor(Cursor.HAND_CURSOR))
この命令でマウスカーソルが手の形になります。
setCursor(new Cursor(Cursor.DEFAULT_CURSOR))
この命令でマウスカーソルが標準(矢印)の形に戻ります。
さて、問題です。
前回つくった選択文(IF文)と、普通の文章の違いは何ですか??
むずかしいみゃ〜
前回、選択文だけ水色にする時にやりましたよ。
そうだも。 jump[]
に次のシーンファイル名が入っているのが選択文だも!
普通の文章は、jump[] に null が入っているんだも!
そうです! そこで、マウスが動いたら、今のマウスカーソルの場所を計算します。
そして、マウスカーソルの場所の行が選択文だったら、マウスカーソルを手の形にします。
普通の文章上だったら、矢印にします。
では、やっていきましょう。
当然先ほどの マウスリスナー(MouseListener) にプログラミングします。
| // ----------------------------------------------------------- // マウス移動処理クラス(MouseMotionAction Class) class MouseMotionAction extends MouseMotionAdapter{ public void mouseMoved(MouseEvent e){ // マウス移動イベント int no = e.getY()/22; if (no>14) return; if ( jump[no] != null ) { } // mouseMoved() |
マウスを押した時と同様に、
e.getY() 命令で、今のマウスのY座標を取ります。
その値を 22 で割ると、マウスカーソルが文章の何行目の上にあるかわかります(文字の縦の間隔が22ドットだから)。
そして、その行の jump[] が null じゃない場合選択文なので、マウスカーソルを手の形にします。
jump[] が null の場合は、普通の矢印のマウスカーソルにします。
これで、おしまいです。
ついでにマウスカーソルが上に来た場合、選択文の色を変えましょう。
選択文は水色ですが、マウスカーソルが選択文の上に来たら赤にするようにしましょう。
先ほどのプログラムの下に追加します。
| // ----------------------------------------------------------- // マウス移動処理クラス(MouseMotionAction Class) class MouseMotionAction extends MouseMotionAdapter{ public void mouseMoved(MouseEvent e){ // マウス移動イベント int no = e.getY()/22; if (no>14) return; if ( jump[no] != null ) { setCursor(new Cursor(Cursor.HAND_CURSOR)); } else { setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); } Graphics g = getGraphics(); g.setFont(new Font( "Dialog", Font.BOLD, 17 )); for ( int i=0; i<15; i++ ) { if( jump[i]!=null ){ if( i==no ) g.setColor( Color.red ); else g.setColor( Color.cyan ); g.drawString( screen[i], 3, (i*22)+22); } } g.dispose(); } // mouseMoved() } // MouseMotionAction |
作画関数
paint() 以外の関数で作画するときは、getGraphics() という命令でグラフィックコンテクスト(GC)という、まぁキャンバスみたいなものを取得します。
paint() の中では、必ずキャンバス(GC)は渡させるのでこの命令は必要ないです。
大昔、「作画はすべて
paint() でやる」って言ってなかったかも〜?
そのとおりです。 paint()
以外の場所で描かれた画像は、再作画のときに消える可能性があるのです。 このことは、第一部 裏画面編
で説明しています。
ですから、ノベルゲーム画面はちゃんと paint() で作画しています。
WWWブラウザが最小化されたり、他の Window などに隠れてまた出てきても、ノベルゲーム画面が消えることはありません。
このマウス移動関数では、選択文を赤色で上から描きこんでいるだけです。
paint() の方にも選択文の作画プログラムが書いてあるので、問題ないのです。
なるほども。
今回のプログラムは
paint() の文章を描く処理(プログラム)とまったく同じです。
15行を上から描いていっているだけです。
だたし、paint() の時と違い、選択文のみ作画しています。
そして、マウスカーソルの場所と、選択文が一致した場合は、水色(cyan)ではなく赤色(red) で選択文を作画しています。
早速動かしてみましょう。
適当なシーンファイルを作ります。
| マウスカーソルが変更されるか実験しよう。
END |
ちなみに選択文をクリックしても次のシーンには行きません!
だって、「end.txt」を用意してなんですから(笑)
ほんとだ! マウスカーソルが上に来ると、カーソルの形がかわるも!
選択文の色も変わるみゃ!
成功です!
あとは、タグを少し増やすことにします。
まずは、すべてのフラグを倒す「FRESET
タグ」!
Flag RESET です。
ゲームオーバーの再ゲーム時に、最初のシーンにもどる直前に使ってください。
タグのプログラムは当然、SetText( ) の中に書きます。
前回作った「NIFタグ」プログラムの下に書きます。
| // 「NIF」タグ処理 if( st1.equals("NIF")) { int no = Integer.parseInt( st2 ); if( ! flag[no] ){ screen[crt_line] = st3; jump[crt_line] = st4; crt_line++; } continue; } // 「FRESET」タグ処理 if( st1.equals("FRESET")) { for (int m=0; m<30; m++) flag[m] = false; flag[0] = true; System.out.println("フラグリセット\n"); continue; } |
ただ30個すべてのフラグを倒す(false)だけです。
ただし、初期状態でフラグ0は立っているというこのプログラムのルールがありますので、フラグ0は立たせます(true)。
つぎに強制的にページを切り替える「PAGEタグ」をつくります。
いまの FRESETタグのしたにプログラムを書いていいます。
| // 「PAGE」タグ処理 if ( st1.equals("PAGE")) { return line+i+1; } |
なんとこれだけです。
SetText( ) の戻り値は次の文章の行番号になっているので、「PAGE」という行が出てきたら今の行に1を足して return
します。
これで、これ以降の文章は、15行の表示を待たず、次のページに持ちこします。
つぎに一時的に文章を止める「WAITタグ」をつくります。
これも簡単です。
| // 「WAIT」タグ処理 if( st1.equals("WAIT")) { scene[line+i]="#"; return line; } |
「WAIT」という1行が
scene[] で出てきたら、その行を「#」に変えてコメント行とします。
これで次はこの WAIT行には引っかかりません。
そして、行番号を増やさずに return します。
これだけでOKです。
だいぶタグが増えました。
さしあたりこの講座でのプログラムはこれでおしまいです。
あとはあなたが自由にタグを増やしてください。
さて、私のミスについてお話しましょう。
SetText() では、「タグ処理」「通常文章処理」「行数オーバーかどうか?」の順番で処理をしています。
タグ処理の IF文では「continue」しているので、まず無いとは思いますが、もし数行のIF文がページをまたぐようなことがあると、行数が15行をオーバーしてエラーになります。
これは IF文の中に15行チェックを入れれば解決します。
IFタグを作るときに、入れるべきでした・・・(~_~;)
それと、NIFタグにも同様に追加します。
| // 「IF」タグ処理 if( st1.equals("IF")) { int no = Integer.parseInt( st2 ); if( flag[no] ){ screen[crt_line] = st3; jump[crt_line] = st4; crt_line++; if (crt_line == 15) return line+i+1; } continue; } |
ついに完成です!!!
では、動かしてみましょう!
新感覚長編ミステリー 「孤動」 - BakuretuKen -
やっと講座がおわったも!
あまりの面倒さに、この講座を始めたことに途中で後悔している爆裂健が目に浮かぶようだったにゃ。
ではみなさん! また次の講座でお会いしましょう!
ばいばいにゃ!
も〜!
|
テキストファイルのフォーマット(タグ一覧)
|
|
IF (番号) (表示文章) (シーンファイル名) ・・・ (番号)のフラグがONだったら、(表示文章)を表示する。(表示文章)がクリックされたら(シーンファイル名)のシーンへ移動。 NIF (番号) (表示文章) (シーンファイル名) ・・・ (番号)のフラグがOFFだったら、(表示文章)を表示する。(表示文章)がクリックされたら(シーンファイル名)のシーンへ移動。
|
|
仕 様
|
|
フラグは 0〜29 まで、 シーンファイルは最大1000行。 |
- ノベルゲームをつくっちゃお END -
|
宇宙のJAVAさん (C) BakuretuKen 2000 |