とんねる
// ===================================================================
// import
// ===================================================================
import java.applet.*;
import java.awt.*;
//import java.util.*;
import java.awt.image.*;
// ===================================================================
// draw
// ===================================================================
class KcTunnel {
Image w_img;
MemoryImageSource w_mi;
int w_width;
int w_hight;
int w_pixels[];
int w_org_pixels[];
int w_pic_width;
int w_pic_hight;
int w_tunnel_u[][];
int w_tunnel_v[][];
int w_tunnel_rot_spd;
int w_tunnel_go_spd;
// --------------------------------- tunnel table
void makeTunnelTbl()
{
w_tunnel_u = new int[w_width][w_hight];
w_tunnel_v = new int[w_width][w_hight];
int u, v;
int depth = 255*4;
int dist = 20;
double len;
for( int y = -w_hight/2; y < w_hight/2; y ++ ) {
for( int x = -w_width/2; x < w_width/2; x ++ ) {
// ------ u:x,yの角度
w_tunnel_u[x+w_width/2][y+w_hight/2] = (int) Math.round( ((Math.atan2(y,x)+Math.PI) * (w_pic_width-1))/(2*Math.PI) ) ;
// ------ v:zの値
len = Math.sqrt(x*x + y*y);
w_tunnel_v[x+w_width/2][y+w_hight/2] = ((int) ( (depth*dist*(w_width - len)) / (depth*len + dist*w_width) ))%w_pic_hight;
/*
if( len == 0 ) {
w_tunnel_v[x+w_width/2][y+w_hight/2] = 0;
}else {
w_tunnel_v[x+w_width/2][y+w_hight/2] = (int) ((16*w_width)/len);
}
*/
}
}
}
// --------------------------------- コンストラクタ
public KcTunnel(Applet oya, int width, int height, String s) {
// --------- get pixels
Image image = oya.getImage(oya.getDocumentBase() , s);
PixelGrabber pg = new PixelGrabber(image , 0 , 0 , -1 , -1 , true);
try {
pg.grabPixels();
}
catch (InterruptedException e) {
}
w_org_pixels = (int[])pg.getPixels();
w_pic_width = pg.getWidth();
w_pic_hight = pg.getHeight();
// --------- buffer
w_width = width;
w_hight = height;
w_pixels = new int[w_width*w_hight];
// ---- これやんないと、WinMeで、ちらつく、、、不思議だのう。(mac,xpはしなくともOK)
for( int y = 0; y < w_hight; y++ ) {
for( int x = 0; x < w_width; x ++ ) {
w_pixels[x + (y * w_width)] = w_org_pixels[x + (y * w_pic_width)];
}
}
// --------- offscreen
w_mi = new MemoryImageSource(w_width , w_hight , w_pixels , 0 , w_width);
w_mi.setAnimated( true );
w_img = oya.createImage(w_mi);
// --------- make tunnel table
makeTunnelTbl();
w_tunnel_rot_spd = 0;
w_tunnel_go_spd =0;
}
// --------------------------------- 計算
void calcTunnel() {
w_tunnel_rot_spd++;
if( w_tunnel_rot_spd >= w_pic_width ) {
w_tunnel_rot_spd = 0;
}
w_tunnel_go_spd+=4;
if( w_tunnel_go_spd >= w_pic_hight ) {
w_tunnel_go_spd = 0;
}
}
// --------------------------------- バッファ描画
void drawTunnel() {
int u, v;
for( int y = 0; y < w_hight; y++ ) {
for( int x = 0; x < w_width; x ++ ) {
u = (w_tunnel_u[x][y]+w_tunnel_rot_spd)%w_pic_width;
v = (w_tunnel_v[x][y]+w_tunnel_go_spd)%w_pic_hight;
w_pixels[x + (y * w_width)] = w_org_pixels[u + v * w_pic_width];
}
}
}
// --------------------------------- ペイント
public void paint() {
calcTunnel();
drawTunnel();
// --------- ピクセルが変更されたでよ
w_mi.newPixels();
}
// --------------------------------- イメージ取得
public Image getImage() {
return w_img;
}
}
// ===================================================================
// main
// ===================================================================
public class KcApp extends Applet implements Runnable {
Thread w_thread = null;
KcTunnel w_draw;
int w_wave_height;
// --------------------------------- アプレット起動時に実行
public void init() {
}
// --------------------------------- アプレットがあるHTMLページに入ったときに実行
public void start() {
if (w_thread == null)
{
// スレッドの起動
w_thread = new Thread(this);
w_thread.start();
String s = getParameter("file");
Dimension dim = getSize();
int width = dim.width; //getWidth();
int height = dim.height; //getHeight();
w_draw = new KcTunnel( this, width, height, s );
}
}
// --------------------------------- アプレットがあるHTMLページから出たときに実行
public void stop() {
if (w_thread != null)
{
// スレッドの停止
w_thread = null;
}
}
// --------------------------------- アプレット終了時に実行
public void destroy() {
}
// --------------------------------- 描画
public void paint(Graphics g) {
if( w_draw == null ) return;
g.drawImage(w_draw.getImage() ,0,0,this);
}
// --------------------------------- 再描画
public void update(Graphics g) {
paint(g);
}
// --------------------------------- スレッドの実行
public void run() {
Thread thisThread = Thread.currentThread();
while (w_thread == thisThread) {
// 処理
if( w_draw != null ) {
w_draw.paint();
}
// 再描画
repaint();
try
{
// 0.01秒間の停止
thisThread.sleep(10);
}
catch(Exception e) {
}
}
}
}