//
// CHAPTER 22
// Class Source Name [FontStringsArray.java]
// Package name [userClass.App]
// 1996.3
// Author [ Junzo hagimoto ]
package userClass.App;
import java.applet.*;
import java.awt.*;
public class FontStringsArray{
Applet a;
FontString fs[];
int maxIdx=0;
int curIdx=0;
int counter=-1;
Color color; // フオントの色
Font font; // フオント
int h = 0; // フォント高さ
public FontStringsArray(Applet a,int maxText){
this.a = a;
fs = new FontString[maxText];
maxIdx = maxText;
font = new Font("TimesRoman",Font.BOLD,20);
h =( a.getFontMetrics(font) ).getLeading() ;
h -=( a.getFontMetrics(font) ).getDescent() ;
h +=( a.getFontMetrics(font) ).getAscent() ;
}
public final void add(String s){
if( curIdx != maxIdx ){
fs[curIdx++] = new FontString(a,this,s);
}
}
public final FontString nextString() {
int red,blue,green;
int x,y;
int wx=0;
int wy=0;
Dimension d = a.size();
red = (int)(Math.random() * 256);
blue = (int)(Math.random() * 256);
green = (int)(Math.random() * 256);
color = new Color( red, green, blue);
if(counter >=0 ){
wx = fs[counter].x;
wy = fs[counter].y;
}
counter++;
if(counter >= curIdx){
counter=0;
}
do{
x = (int)( Math.random() * (d.width - fs[counter].w ) ) ;
y = Math.max( h ,(int)( Math.random() * (d.height- h ) ));
} while( Math.abs(wx-x) < 40 && Math.abs(wy-y) < 20 );
fs[counter].x = x;
fs[counter].y = y;
return fs[counter];
}
public final void drawString(Graphics g){
g.setFont( font );
g.setColor(color);
fs[counter].drawString(g);
}
public final void drawChars(Graphics g, Mover m,int maxtimer){
g.setFont( font );
g.setColor(color);
fs[counter].drawChars( g, m, maxtimer );
}
public final boolean hit(Mover mover){
return fs[counter].hit( mover );
}
}
//
// パッケージの外からはアクセスできないクラス
//
class FontString {
int w; // 文字列の長さ
String s; // 表示文字列
int x=0; // x表示位置
int y=0; // y表示位置
char separated[]; // キャラクタ配列
FontStringsArray owner;
FontString(Applet a,FontStringsArray fsa,String str){
x=0;
y=0;
owner = fsa;
s = str;
w = (a.getFontMetrics(owner.font)).stringWidth(s) ;
separated = new char [ s.length() ];
s.getChars(0,s.length(),separated,0);
}
void drawString(Graphics g){
g.drawString(s,x,y);
}
void drawChars(Graphics g, Mover m,int maxTimer){
for(int i=0;i < s.length();i++){
int y_coord = (int) (Math.random()*10);
int x_coord = (int) (Math.random()*10);
g.drawChars( separated, i,1,
x + 12*i + ((maxTimer - m.hitTimer)*2) * m.x_Plus,
y + y_coord + (maxTimer - m.hitTimer) * m.y_Plus);
}
}
//
// px,py px2(px+w),py
// *---------*
// | bit |
// *---------*
// px,py2(py+h) px2(px+w),py2(py+h)
//
// x,y - h x+w,y-h
// *------------------------*
// | Fonts |
// x,y *------------------------*
// x+w
boolean hit(Mover mover){
Image img = mover.getImage(0);
int px = mover.x;
int py = mover.y;
int px2 = mover.getImageWidth(0) + px;
int py2 = mover.getImageHeight(0)+ py;
if( px2 < x || px > x+w || py > y || py2 < y - owner.h ) return false;
return true;
}
}
//