6章 アニメーション
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Calendar
public class clock extends Applet implements Runnable, MouseListener, MouseMotionListener {
int k=0;
int dt=200;
double da=3.1416/30.0;
Thread th;
int Mxx=(-10), Myy=(-10);
public void init()
{
addMouseListener(this);
addMouseMotionListener(this);
}
public void start() {
th=new Thread(this);
th.start();
}
public void mousePressed(MouseEvent e)
{
Mxx=e.getX();
Myy=e.getY();
repaint();
}
public void mouseClicked(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseMoved(MouseEvent e){}
public void mouseDragged(MouseEvent e)
{
Mxx=e.getX();
Myy=e.getY();
repaint();
}
public void paint(Graphics g){
double h, m, ss, cc;
double t, r=75.0, rr=20.0;
double u, rrr=70.0;
double v, rrrr=60.0;
int x, y, xx, yy;
g.setColor(Color.white);
g.fillOval(20, 20, 160, 160);
g.setColor(Color.black);
g.drawOval(19, 19, 162, 162);
g.drawOval(20, 20, 160, 160);
g.drawOval(21, 21, 158, 158);
g.drawOval(97, 97, 6, 6);
Calendar jikoku=Calendar.getInstance();
t=da*(double)jikoku.get(Calendar.SECOND);
ss=Math.sin(t);
cc=Math.cos(t);
x=100+(int)(r*ss);
y=100-(int)(r*cc);
xx=100-(int)(rr*ss);
yy=100+(int)(rr*cc);
g.drawLine(xx, yy, x, y);
g.setColor(Color.blue);
m=(double)jikoku.get(Calendar.MINUTE);
u=da*m;
ss=Math.sin(u);
cc=Math.cos(u);
x=100+(int)(rrr*ss);
y=100-(int)(rrr*cc);
g.drawLine(100, 100, x, y);
g.setColor(Color.red);
h=(double)jikoku.get(Calendar.HOUR_OF_DAY);
v=da*(5.0*(h+m/60.0));
ss=Math.sin(v);
cc=Math.cos(v);
x=100+(int)(rrrr*ss);
y=100-(int)(rrrr*cc);
g.drawLine(100,100,x,y);
g.drawOval(Mxx-5, Myy-5, 20, 20);
}
public void run()
{
for (int i=0; i<1000000; ++i)
{
repaint();
++k;
try {
Thread.sleep(dt);
}
catch (InterruptedException e) {
}
}
}
}
キーフレーム(ここでは円,楕円)を決める。
キーフレーム A(xa[i], ya[i]) とキーフレー ム B(xb[i], yb[i]) の間の中間画面(中割図)を内挿的に作成する。
x[i]=xa[i] + t(xb[i]-xa[i])
y[i]=ya[i] + t(yb[i]-ya[i])
(0<=t<=1)
参考HP
/* http://www.h5.dion.ne.jp/~hearty1/JavaApp/ButterflyT.htmlをmodifyさせていただきました。
ありがとうございました */
import java.awt.*;
import java.applet.*;
public class anime extends Applet implements Runnable{
int w,h,px,py,flag;
double n=-2.0;
double ts=48.0; // 時間分割数
int x [] = new int[121];
int y [] = new int[121];
double x1[] = new double[121];
double y1[] = new double[121];
double x2[] = new double[121];
double y2[] = new double[121];
double pai=Math.PI;
Thread th; // スレッド
Image fb; // 裏画面
Graphics gg; // 裏画面のグラフィックス
public void init() {
Dimension d=getSize(); // アプレットのサイズ
w=d.width; // 画面の横幅
h=d.height; // 画面の縦幅
flag=1; // Butterfly→Clover(Circle)
setBackground(Color.gray); // 背景色の設定
th=null; // スレッド
fb = createImage( w, h ); // 裏画面の作成
gg = fb.getGraphics(); // 裏画面のグラフィックス
Fig1(); // Ellipse
Fig2(); // Circle
}
public void start(){ // Start
if(th==null){
th=new Thread(this);
th.start();
}
}
public void stop(){ // Stop
if(th!=null){
th=null;
}
}
public void run(){ // Run
while(true){
try{Thread.sleep(200);}
catch(InterruptedException e){ }
repaint();
}
}
public void paint(Graphics g) { // Paint
gg.setColor(Color.gray);
gg.fillRect(0,0,w,h);
px=w/2;
py=h/2;
if(flag==1)n=n+2;
if(flag==2)n=n-2;
if(n>ts)flag=2;n=n-2;
if(n<-2)flag=1;n=n+2;
gg.setColor(Color.getHSBColor((float)(n/ts), 0.6f, 1.0f));
// HSB 色相・彩度・明度
// Circle へ変形
for ( int i=0; i<=120; i+=1){
x[i]=(int)((x2[i]-x1[i])/ts*n+x1[i]);
y[i]=(int)((y2[i]-y1[i])/ts*n+y1[i]);
x[i]=x[i]+px; y[i]=y[i]+py;
}
gg.fillPolygon(x, y, 121);
g.drawImage(fb,0,0,this); // 裏画面を描画
}
public void update(Graphics g){ // Update
paint(g);
}
// Ellipse
public void Fig1() {
double a, p=200.0, q=20.0;
int i;
for ( i=0, a=0.0; a<2.0*pai; a+=pai/60.0){
x1[i]=p*Math.cos(a);
y1[i]=q*Math.sin(a);
i=i+1;
}
x1[120]=x1[0]; y1[120]=y1[0];
return;
}
// Circle
public void Fig2() {
double a, r=100;
int i;
for ( i=0, a=0.0; a<2.0*pai; a+=pai/60.0){
x2[i]=r*Math.cos(a);
y2[i]=r*Math.sin(a);
i=i+1;
}
x2[120]=x2[0]; y2[120]=y2[0];
return;
}
}
メッセージボード http://village.infoweb.ne.jp/~fwbc6098/java/java.htm
クリスマスリンク http://www.atsumi.net/homepage/xmasclub/index3.html