NumMC seconds1; NumMC seconds2; NumMC minutes1; NumMC minutes2; NumMC hours1; NumMC hours2; PointMC[] ps; int lastSecond; BFont f; int cmx, cmy; void setup(){ background( 102 ); size( 550, 400 ); framerate( 30 ); noStroke(); smooth(); //数(NumMC)インスタンスの生成 seconds1 = new NumMC( 400 , 175 ); seconds2 = new NumMC( 350, 175 ); minutes1 = new NumMC( 280, 175 ); minutes2 = new NumMC( 230, 175 ); hours1 = new NumMC( 160, 175 ); hours2 = new NumMC( 110, 175 ); //点(PointMC)インスタンスの生成 ps = new PointMC[4]; ps[0] = new PointMC( 90, 196, 0x000000, 10 ); ps[1] = new PointMC( 210, 196, 0x000000, 10 ); ps[2] = new PointMC( 330, 196, 0x000000, 10 ); ps[3] = new PointMC( 450, 196, 0x000000, 10 ); lastSecond = -1; //フォントの読み込み f = loadFont( "Futura-Bold.vlw.gz" ); cmx = width / 2; cmy = height / 2; } void loop(){ //スクリーンの初期化 background( 102 ); if( !( mouseX == 0 && mouseY == 0 ) ){ cmx += ( mouseX - cmx ) * 0.2; cmy += ( mouseY - cmy ) * 0.2; } float xr = ( (float)cmx - (float)width / 2.0f ) / ( (float)width / 2.0f ); float yr = ( (float)cmy - (float)height / 2.0f ) / ( (float)height / 2.0f ); xr *= PI / 3.0f; yr *= PI / 3.0f; translate( width / 2, height / 2 ); rotateX( yr ); rotateY( xr ); translate( -width / 2, -height / 2 ); //時間の取得 Date d = new Date(); int s1 = d.getSeconds() % 10; int s2 = (int)( d.getSeconds() / 10 ); int m1 = d.getMinutes() % 10; int m2 = (int)( d.getMinutes() / 10 ); int h1 = d.getHours() % 10; int h2 = (int)( d.getHours() / 10 ); //一秒ごとに初期化 if( lastSecond != s1 ){ lastSecond = s1; seconds1.setNumber( s1 ); seconds2.setNumber( s2 ); minutes1.setNumber( m1 ); minutes2.setNumber( m2 ); hours1.setNumber( h1 ); hours2.setNumber( h2 ); for( int i = 0; i < ps.length; i++ ){ ps[i].setParam( 0x000000, 10 ); } } //マウスイベント seconds1.hitEvent( mouseX, mouseY ); seconds2.hitEvent( mouseX, mouseY ); minutes1.hitEvent( mouseX, mouseY ); minutes2.hitEvent( mouseX, mouseY ); hours1.hitEvent( mouseX, mouseY ); hours2.hitEvent( mouseX, mouseY ); for( int i = 0; i < ps.length; i++ ){ if( ps[i].hitTest( mouseX, mouseY ) ){ ps[i].setParam( 0xb40000, 15 ); } } //描画 seconds1.paintSelf(); seconds2.paintSelf(); minutes1.paintSelf(); minutes2.paintSelf(); hours1.paintSelf(); hours2.paintSelf(); for( int i = 0; i < ps.length; i++ ){ ps[i].paintSelf(); } //タイトルとコピーライトの描画 fill( color( 255, 255, 255 ) ); textFont( f, 40 ); text( "m5g", 149, 310 ); textFont( f, 14 ); text( "copyright(c) 2004 nogami. all rights reserved.", 149, 335 ); } static boolean[][] NUMBER = { { false, true, true, false, true, false, false, true, true, false, false, true, true, false, false, true, false, true, true, false}, { false, true, true, false, false, false, true, false, false, false, true, false, false, false, true, false, false, false, true, false}, { false, true, true, false, true, false, false, true, false, false, true, false, false, true, false, false, true, true, true, true}, { true, true, true, false, false, false, false, true, true, true, true, true, false, false, false, true, true, true, true, false}, { true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true, false, false, true, false}, { true, true, true, true, true, false, false, false, true, true, true, false, false, false, false, true, true, true, true, false}, { false, true, true, false, true, false, false, false, true, true, true, false, true, false, false, true, false, true, true, false}, { true, true, true, true, true, false, false, true, false, false, true, false, false, true, false, false, true, false, false, false}, { false, true, true, false, true, false, false, true, false, true, true, false, true, false, false, true, false, true, true, false}, { false, true, true, false, true, false, false, true, false, true, true, true, false, false, false, true, false, true, true, false} }; class NumMC{ int x, y; PointMC[] points; NumMC( int x, int y ){ this.x = x; this.y = y; points = new PointMC[20]; int count = 0; for( int iy = 0; iy < 5; iy++ ){ for( int ix = 0; ix < 4; ix++ ){ points[count] = new PointMC( x+ix*10, y+iy*10, 0xc8c8c8, 5 ); count++; } } } void paintSelf(){ for( int i = 0; i < points.length; i++ ){ points[i].paintSelf(); } } void setNumber( int n ){ for( int i = 0; i < points.length; i++ ){ if( NUMBER[n][i] ){ points[i].setParam( 0x000000, 10 ); } else{ points[i].setParam( 0xc8c8c8, 5 ); } } } void hitEvent( int mx, int my ){ for( int i = 0; i < points.length; i++ ){ if( points[i].hitTest( mouseX, mouseY ) ){ points[i].setParam( 0xb40000, 15 ); } } } } class PointMC{ int x, y; color c, nextc; float s, nexts, deltas; PointMC( int x, int y, color c, float s ){ this.x = x; this.y = y; this.c = this.nextc = c; this.s = this.nexts = s; this.deltas = 0; } void setParam( color nextc, float nexts ){ this.nextc = nextc; this.nexts = nexts; } boolean hitTest( int mx, int my ){ float hs = 8; if( x-hs <= mx && x+hs >= mx ){ if( y-hs <= my && y+hs >= my ){ return true; } } return false; } void paintSelf(){ int r = c >> 16 & 0xff; int g = c >> 8 & 0xff; int b = c & 0xff; int nr = nextc >> 16 & 0xff; int ng = nextc >> 8 & 0xff; int nb = nextc & 0xff; r += ( nr - r ) * 0.2; g += ( ng - g ) * 0.2; b += ( nb - b ) * 0.2; c = r<<16 | g<<8 | b; deltas += ( nexts - s ) * 0.4; deltas *= 0.8; s += deltas; fill( r, g, b ); float hs = s/2; ellipse( x-hs, y-hs, s, s ); } }