import java.awt.*;
/**
* このスレッドは, ロゴを表示します.
*
* -
* 初期画面モードでは, 画面全体にロゴを浮遊させます.
*
-
* サイト表示画面モードでは, 画面下部にロゴを移動します.
* この時, 本来ならロゴを ticker 部分の上に表示させないといけないのですが,
* 手抜きとなっています.
*
*
* @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;
}
}
}