import java.awt.*; /** * このスレッドは, ロゴを表示します. * * * @author Kawaguchi Koji * @version 1.0 */ class LogoThread extends Thread { /** * 浮遊モードの定数 */ static final int STATUS_FLY = 1; /** * 移動モードの定数 */ static final int STATUS_SWIM = 2; /** * ロゴの表示モード */ int status = STATUS_FLY; /** * ロゴの現在位置 */ int x, y; /** * ロゴの1移動ごとのドット数 */ int dx, dy; /** * Fnaviクラス */ Fnavi fnavi; /** * ロゴ表示エリアの大きさ */ Dimension scrsize; /** * ロゴのサイズ */ Dimension logosize; /** * エゴ表示エリアのグラフィックコンテキスト */ Graphics scrgraphics; /** * ロゴのイメージ */ Image logoimage; /** * サイト表示で使用するフォント */ Font logofont; /** * コンストラクタは, ロゴイメージの初期設定を行います. * * @param fnavi Fnaviクラスのインスタンス * @param scrsize ロゴ表示領域のサイズ * @param scrgraphics ロゴ表示領域のグラフィック・コンテキスト * @param logoimage ロゴのイメージ * @param logofont サイト表示用のフォント */ LogoThread(Fnavi fnavi, Dimension scrsize, Graphics scrgraphics, Image logoimage, Font logofont) { this.fnavi = fnavi; this.scrsize = scrsize; this.scrgraphics = scrgraphics; this.logoimage = logoimage; this.logofont = logofont; // fnavi.o(scrsize.width + "," + scrsize.height); logosize = new Dimension(logoimage.getWidth(null), logoimage.getHeight(null)); // fnavi.o(logosize.width + "," + logosize.height); // 座標等の初期化 x = intRnd(scrsize.width - logosize.width); y = intRnd(scrsize.height - logosize.height); dx = (intRnd(2) == 0) ? -2 : 2; dy = (intRnd(2) == 0) ? -2 : 2; } /** * ロゴイメージの移動, 表示を行います. * ロゴ表示モードが切り替わったら, サイト画面の表示も行います. */ public void run() { for (;;) { // 前回のロゴを消す clear(scrgraphics); // ロゴの移動 switch (status) { case STATUS_FLY: flyMove(); break; case STATUS_SWIM: swimMove(); break; } // ロゴを描く draw(scrgraphics); // スクリーンに表示リクエスト fnavi.redraw(); try { sleep(100); } catch (InterruptedException e) {} // 初期画面 → サイト表示画面切り替わり時の処理 if (fnavi.getLogoFlying() == false && status == STATUS_FLY) { clear(scrgraphics); status = STATUS_SWIM; dx = (intRnd(2) == 0) ? -1 : 1; y = scrsize.height - logosize.height / 2; // サイト表示 drawPage(scrgraphics, logofont); } } } /** * 浮遊モード用のロゴ移動処理です. */ private void flyMove() { x += dx; y += dy; if (x < 0 || x >= (scrsize.width - logosize.width)) { dx = -dx; x += dx; } if (y < 0 || y >= (scrsize.height - logosize.height)) { dy = -dy; y += dy; } } /** * 画面下部での移動モード用のロゴ移動処理です. */ private void swimMove() { x += dx; if (x < 0 || x >= (scrsize.width - logosize.width / 2)) { dx = -dx; x += dx; } } /** * 整数乱数発生処理です. * 0 から max-1 までの乱数を発生します. *
* BASICの INT(RND(1)*n) のイメージです. * * @param max 乱数の幅を指定します. * 0 から max-1 までの乱数を発生します. */ private int intRnd(int max) { return (int)(Math.random() * max); } /** * 画面上のロゴ・イメージをクリアします. * * @param g グラフィック・コンテキスト */ void clear(Graphics g) { g.setColor(Color.black); switch (status) { case STATUS_FLY: g.fillRect(x, y, logosize.width, logosize.height); break; case STATUS_SWIM: g.fillRect(x, y, logosize.width / 2, logosize.height / 2); break; } } /** * 画面上にサイト風のテキストを表示します. 手抜きです. * * @param g グラフィック・コンテキスト * @param font フォント */ void drawPage(Graphics g, Font font) { FontMetrics fm = g.getFontMetrics(font); int x, y; g.setColor(Color.yellow); g.setFont(font); String s = "Flashnaviのようなアプレット"; x = scrsize.width / 3 - fm.stringWidth(s) / 2; y = scrsize.height / 4 - fm.getHeight() / 2; g.drawString(s, x, y); s = "これは、一見FlashnaviのJavaアプレットに"; g.drawString(s, x, y + fm.getHeight() * 2); s = "見えますが、本物ではありません。"; g.drawString(s, x, y + fm.getHeight() * 4); s = "ご注意ください。"; g.drawString(s, x, y + fm.getHeight() * 6); } /** * 画面上にロゴ・イメージを描画します. * * @param g グラフィック・コンテキスト */ void draw(Graphics g) { switch (status) { case STATUS_FLY: g.drawImage(logoimage, x, y, null); break; case STATUS_SWIM: g.drawImage(logoimage, x, y, logosize.width / 2, logosize.height / 2, null); break; } } }