// // Author : Will Schenk (chilly@psu.edu) import java.awt.*; class Star { // º°ÀÇ À§Ä¡¿Í À¯Çü¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Áø Ŭ·¡½º int H, V; int x, y, z; int type; Star( int width, int height, int depth, int type ) { this.type = type; H = width/2; V = height/2; x = (int)(Math.random()*width) - H; // ³­¼ö ¹ß»ýÀ¸·Î º°ÀÇ ÁÂÇ¥¸¦ ±¸ÇÑ´Ù. y = (int)(Math.random()*height) - V; if ( (x == 0) && (y == 0 ) ) x = 10; z = (int) (Math.random()*depth); // z´Â 3Â÷¿ø(±íÀÌ)À» Ç¥ÇöÇÏ´Â º¯¼öÀÌ´Ù. } public void Draw( Graphics g, double rot ) // StarField Ŭ·¡½ºÀÇ PaintMe() µµ±¸¿¡ ÀÇÇØ È£ÃâµÇ¸ç { // ½ÇÁ¦ º°À» Ç¥ÇöÇÑ´Ù. double X, Y; int h, v, hh, vv; int d; z-=2; if ( z < -63 ) z = 100; hh = (x*64)/(64+z); vv = (y*64)/(64+z); X = (hh*Math.cos(rot))-(vv*Math.sin(rot)); // cos(), sin() µµ±¸ÀÇ ÀÎÀÚ´Â ¶óµð¾È °ªÀÌ´Ù. Y = (hh*Math.sin(rot))+(vv*Math.cos(rot)); h = (int)X+H; // »ý¼ºÀÚ¿¡¼­ »¯´ø H, V °ªÀ» ´Ù½Ã ´õÇÑ´Ù. v = (int)Y+V; // h´Â °¡·Î ÁÂÇ¥ÀÌ°í v´Â ¼¼·Î ÁÂÇ¥ÀÌ´Ù. if ( (h < 0) || (h > (2*H))) z = 100; if ( (v < 0) || (v > (2*H))) z = 100; GrayMe(g); // ±íÀ̸¦ Ç¥ÇöÇÏ´Â z °ª¿¡ µû¶ó º°ÀÇ »öÀ» °áÁ¤ if( type == 0 ) { // typeÀÌ 0ÀÏ °æ¿ì ÀÛÀº »ç°¢ÇüÀ¸·Î º°À» Ç¥Çö d=(100-z)/50; // ±íÀ̸¦ Ç¥ÇöÇÏ´Â z °ª¿¡ µû¶ó º°ÀÇ Å©±â¸¦ °áÁ¤ if( d == 0 ) d = 1; g.fillRect( h, v, d, d ); } else { // typeÀÌ 0ÀÌ ¾Æ´Ò °æ¿ì ½ÊÀÚ ¸ð¾ç(³× °³ÀÇ ¼±)À¸·Î º°À» Ç¥Çö d=(100-z)/20; // ±íÀ̸¦ Ç¥ÇöÇÏ´Â z °ª¿¡ µû¶ó º°ÀÇ Å©±â¸¦ °áÁ¤ g.drawLine( h-d, v, h+d, v ); g.drawLine( h, v-d, h, v+d ); if( z < 50 ) { d/=2; g.drawLine( h-d, v-d, h+d, v+d ); g.drawLine( h+d, v-d, h-d, v+d ); } } } public void GrayMe(Graphics g) { // 3Â÷¿ø(±íÀÌ)À» Ç¥ÇöÇÏ´Â º¯¼öÀÎ zÀÇ °ª¿¡ µû¶ó »ö±òÀ» ´Ù¸£°Ô Ç¥ÇöÇÑ´Ù. /* if( z > 75 ) { g.setColor( Color.darkGray ); // ¾îµÎ¿î ȸ»öÀº ¹è°æ»ö°ú Å« Â÷ÀÌ°¡ ¾ø¾î ÁÖ¼®Ã³¸® } else */ if ( z > 50 ) { // ¸Õ °ÍÀº ȸ»ö g.setColor( Color.gray ); } else if ( z > 25 ) { // Áß°£ Áö´ë´Â ¿¬ÇÑ È¸»ö g.setColor( Color.lightGray ); } else { g.setColor( Color.white ); // °¡±î¿î °ÍÀº Èò»öÀ¸·Î Ç¥Çö. } } } public class StarField extends java.applet.Applet implements Runnable { // ¾ÖÇø´ StarField, Runnable ÀÎÅÍÆäÀ̽º·ÎºÎÅÍ ÆÄ»ýµÇ±â ¶§¹®¿¡ run() µµ±¸¸¦ °¡Áø´Ù. int Width, Height; Thread me = null; // º°ÀÇ À§Ä¡¸¦ À̵¿½ÃÄÑÁÖ´Â ¾²·¹µå boolean suspend = false; Image im; Graphics offscreen; // ¹öÆÛ À̹ÌÁö¸¦ ÀúÀåÇÏ´Â ±×·¡ÇÈ µð¹ÙÀ̽ºÀÌ´Ù. double rot, dx, ddx; // dx´Â rotÀÇ Áõ°¡·®ÀÌ°í ddx´Â dxÀÇ Áõ°¡·®ÀÌ´Ù. int speed, stars, type; double defddx, max; // defddx´Â ddxÀÇ ±âº»°ªÀÌ°í max´Â dxÀÇ ÃÖ´ë°ªÀÌ´Ù. Star pol[]; // Points of light, º°µéÀÇ À§Ä¡ ¹è¿­ÀÌ´Ù. public void init() // ¾ÖÇø´À» ½ÇÇàÇϱâ À§ÇØ ºê¶ó¿ìÀú°¡ °¡Àå ¸ÕÀú È£Ãâ { rot = 0; dx=0; ddx=0; Width = size().width; Height = size().height; String theSpeed = getParameter( "speed" ); Show( "speed", theSpeed ); // Ç¥ÁØ Ãâ·ÂÀ¸·Î HTML º¯¼ö Á¤º¸¸¦ Ãâ·Â speed = (theSpeed == null ) ? 50 : Integer.valueOf( theSpeed ).intValue(); String theStars = getParameter( "stars" ); Show( "stars", theStars ); stars = (theStars == null ) ? 30 : Integer.valueOf( theStars ).intValue(); String theType = getParameter( "type" ); Show( "type", theType ); type = (theType == null ) ? 0 : Integer.valueOf( theType ).intValue(); String theRot = getParameter( "spin" ); Show( "spin", theRot ); rot = (theRot == null) ? 0 : Double.valueOf( theRot ).doubleValue(); String theMax = getParameter( "maxspin" ); Show( "maxspin", theRot ); max = (theMax == null) ? .1 : Double.valueOf( theMax ).doubleValue(); String theddx = getParameter( "ddx" ); Show( "ddx", theddx ); defddx = (theddx == null) ? .005 : Double.valueOf( theddx ).doubleValue(); try { im = createImage( Width, Height ); // È­¸é¿¡´Â ³ªÅ¸³ªÁö ¾Ê´Â ¹öÆÛ À̹ÌÁö¸¦ »ý¼ºÇÑ´Ù. // ¾Ö´Ï¸ÞÀ̼ǿ¡ ÀÚÁÖ »ç¿ëµÇ´Â ´õºí ¹öÆÛ¸µ¿¡ »ç¿ëµÈ´Ù. offscreen = im.getGraphics(); // ¹öÆÛ À̹ÌÁöÀÇ ±×·¡ÇÈ µð¹ÙÀ̽º¸¦ ±¸Çؼ­ offscreenÀ¸·Î ÇÑ´Ù. } catch( Exception e) { offscreen = null; } pol = new Star[stars]; // Star ÀνºÅϽº°¡ ÀúÀåµÉ ¹è¿­ »ý¼º for ( int i = 0; i < stars; i++ ) pol[i] = new Star( Width, Height, 100, type ); // stars °³ÀÇ Star ÀνºÅϽº »ý¼º } public void paint( Graphics g ) { if( offscreen != null ) { // ¹öÆÛ À̹ÌÁö°¡ ÀÖ´Â °æ¿ì paintMe( offscreen ); // ¹öÆÛ À̹ÌÁö¿¡ ¹è°æÀ» Ä¥ÇÏ°í º°µéÀ» »õ·Î ±×¸°´Ù. g.drawImage( im, 0, 0, this ); // ±×·ÁÁø ¹öÆÛ À̹ÌÁö¸¦ È­¸é¿¡ »Ñ¸°´Ù. } else { // ¹öÆÛ À̹ÌÁö°¡ nullÀ̸é ÇöÀç ±×·¡ÇÈ µð¹ÙÀ̽º·Î ¹è°æÀ» Ä¥ÇÏ°í º°µéÀ» ±×¸°´Ù. paintMe( g ); } } public void paintMe( Graphics g ) { g.setColor( Color.black ); // ÇöÀç »ö±òÀ» °ËÁ¤À¸·Î ÇÑ´Ù. g.fillRect( 0, 0, Width, Height ); // ¾ÖÇø´ Àüü¸¦ °Ë°Ô Ä¥ÇÑ´Ù. //g.setColor( Color.gray ); for( int i = 0; i < stars; i++ ) // º°µéÀ» stars °³¼ö¸¸Å­ ±×¸°´Ù. pol[i].Draw( g, rot ); } public void start() // À¥ ºê¶ó¿ìÀú°¡ ¾ÖÇø´À» ½ÇÇàÇÒ ¶§ init() ´ÙÀ½À¸·Î È£ÃâÇÑ´Ù. { if ( me == null ) { // me ¾²·¹µå´Â º°ÀÇ À§Ä¡¸¦ À̵¿½ÃÅ°´Â ¾²·¹µåÀÌ´Ù. me = new Thread( this ); // run()À» ½ÇÇàÇÏ´Â me ¾²·¹µå¸¦ »ý¼ºÇÑ´Ù. me.start(); // »ý¼ºµÈ me ¾²·¹µå°¡ run()À» ½ÇÇàÇÑ´Ù. } } public void stop() // À¥ ºê¶ó¿ìÀú¿¡ ÀÇÇØ È£ÃâµÈ´Ù. { if( me != null ) { me.stop(); me = null; } } public void run() { while( me != null ) { rot += dx; dx += ddx; if( dx > max ) ddx=-defddx; // dx°¡ maxº¸´Ù Å©¸é ddx °ªÀ» À½À¸·Î ÇÑ´Ù. if( dx < -max) ddx=defddx; // dx°¡ -maxº¸´Ù ÀÛÀ¸¸é ddx °ªÀ» ¾çÀ¸·Î ÇÑ´Ù. try { Thread.sleep( speed ); } catch (InterruptedException e){} repaint(); // update() È£Ãâ } } public void update( Graphics g ) { paint( g ); // º°µéÀ» »õ·Î ±×¸°´Ù. } public boolean mouseDown( java.awt.Event evt, int x, int y ) { ddx = (ddx == 0) ? defddx : 0; // ddx°¡ 0À̾úÀ¸¸é defddx·Î, 0ÀÌ ¾Æ´Ï¾úÀ¸¸é 0À¸·Î ÇÑ´Ù. return true; } public void Toggle( ) { if( me != null ) { if( suspend ) { me.resume(); // me ¾²·¹µå ¼öÇàÀ» Àç°³ÇÑ´Ù. } else { me.suspend(); // me ¾²·¹µå ¼öÇàÀ» ÀÏ´Ü ¸ØÃá´Ù. } suspend = !suspend; // suspend °ªÀ» Åä±ÛÇÑ´Ù. } } public void Show( String theString, String theValue ) // HTMLÀÇ º¯¼ö¿Í °ªÀ» Ç¥ÁØÃâ·ÂÀ¸·Î Ãâ·Â { if ( theValue == null ) { System.out.println( theString + " : null"); } else { System.out.println( theString + " : " + theValue ); } } }