package finished; import java.awt.event.KeyEvent; import java.awt.geom.GeneralPath; import java.awt.image.BufferStrategy; import java.awt.image.BufferedImage; import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics2D; import java.util.Random; import javax.swing.JFrame; /* * Sailor Fun 4K Game * Code Copyright 2007 - Alexander Hristov. http://www.ahristov.com/tutorial * * Code is provided as is for educational purposes. It cannot be posted publicly (either in * electronic or printed form) or used in any other way without permission. */ public class S extends JFrame { private static final int WINDOW_TIMER = 100; public static final int WIDTH = 800; public static final int SCR_HEIGHT = 620; private static final int SCORE_POSITION = 200; private static final int LIVES_POSITION = SCORE_POSITION + 150; private static final int STATUS_LINE = SCR_HEIGHT-60; public static final int HEIGHT = SCR_HEIGHT-50; private static final int STATE_PLAYING = 1; private static final int STATE_GAME_OVER = 2; private static final int STATE_INIT = 3; private static final int STATE_INIT_LEVEL = 4; private static final int STATE_LIFE_LOST = 5; /** * states * 0 = Waiting for new game (moves to 3) * 1 = Playing (moves to 2) * 2 = Game over (moves to 3) * 3 = Initialization request (moves to 1) * 4 = Level initialization request(moves to 1) * 5 = Life lost (moves to 4 on keypress) */ boolean key[] = new boolean[65535]; private static final int MAX_ITEMS = 100; private static final int ITEM_PLAYER = 1; private static final int ITEM_BABY = 7; private static final int ITEM_FALLING_BABY = 8; private static final int ITEM_DEAD_BABY = 9; private static final int ITEM_FLYING_BABY = 10; private static final int ITEM_TV = 11; private static final int ITEM_WINDOW_CLOSED = 12; private static final int ITEM_WINDOW_OPEN = 13; private static final int MAX_IMAGES = 14; private static final int PLAYER_SPEED = 3; private static final int BASE = 500; private static final int WINDOW_WIDTH = 30; private static final int WINDOW_HEIGHT = 40; private static final int WINDOW_H_SPACING = 40; private static final int WINDOW_V_SPACING = 50; private static final int BABY_WIDTH = 21; private static final int BABY_HEIGHT = 28; private static final int PLAYER_WIDTH = 30; private static final int BABY_TIMER = BABY_HEIGHT*10; public static void main(String[] x) { new S(); } public S() { setSize(WIDTH,SCR_HEIGHT); setResizable(false); /************************************************************* * GLOBAL INITIALIZATION *************************************************************/ Random rnd = new Random(); GeneralPath path = new GeneralPath(); int state = STATE_GAME_OVER; Graphics2D g; int i,slot; int babies = 0; int windows =0; int orientation = 1; int openWindows = 0; int score = 0; int lives = 5; int level; int[] itemX = new int[MAX_ITEMS]; int[] itemY = new int[MAX_ITEMS]; int[] itemVY = new int[MAX_ITEMS]; int[] itemType = new int[MAX_ITEMS]; int[] itemTimer = new int[MAX_ITEMS]; itemX[0] = 100; itemY[0] = BASE-50; BufferedImage[] images = new BufferedImage[MAX_IMAGES]; images[ITEM_WINDOW_CLOSED] = new BufferedImage(WINDOW_WIDTH,WINDOW_HEIGHT, BufferedImage.TYPE_INT_RGB); g = images[ITEM_WINDOW_CLOSED].createGraphics(); g.setColor(new Color(0)); g.fillRect(0,0,WINDOW_WIDTH-1,WINDOW_HEIGHT-1); g.setPaint(new GradientPaint(2,2,new Color(255,255,255),7,7,new Color(200,200,255),true)); g.fillRect(2,2,WINDOW_WIDTH-4,WINDOW_HEIGHT-4); images[ITEM_WINDOW_OPEN] = new BufferedImage(WINDOW_WIDTH,WINDOW_HEIGHT, BufferedImage.TYPE_INT_RGB); // Start of Image definition for upperHand images[0] = new BufferedImage(6,22,BufferedImage.TYPE_INT_ARGB); g = images[0].createGraphics(); g.setColor(new Color(0xfac2c2)); path.reset(); path.moveTo(0,4); path.lineTo(1,21); path.lineTo(5,21); path.lineTo(5,6); path.closePath(); g.fill(path); g.setColor(new Color(0)); g.draw(path); g.setColor(new Color(0xb289fa)); path.reset(); path.moveTo(3,0); path.lineTo(2,0); path.lineTo(0,2); path.lineTo(0,4); path.lineTo(5,5); path.lineTo(5,1); path.closePath(); g.fill(path); g.setColor(new Color(0x0)); g.draw(path); g.drawLine(0,2,5,3); // End of Image definition for upperHand // Start of Image definition for lowerHand images[1] = new BufferedImage(6,16,BufferedImage.TYPE_INT_ARGB); g = images[1].createGraphics(); g.setColor(new Color(0xfafafa)); g.fillRect(1,0,4,14); g.setColor(new Color(0x2020b2)); g.drawLine(5,0,5,13); g.drawLine(5,13,3,15); g.drawLine(3,15,1,15); g.drawLine(0,14,0,13); g.drawLine(1,12,1,11); g.setColor(new Color(0)); g.drawLine(4,0,1,0); g.drawLine(1,8,1,10); g.setColor(new Color(0x6969d2)); g.drawLine(1,6,1,1); g.drawLine(1,1,4,1); g.drawLine(4,1,4,10); g.setColor(new Color(0xb289fa)); g.drawLine(2,2,2,8); g.setColor(new Color(0x2020b2)); g.drawLine(2,14,3,13); // End of Image definition for lowerHand // Start of Image definition for upperFoot images[2] = new BufferedImage(18,25,BufferedImage.TYPE_INT_ARGB); g = images[2].createGraphics(); g.setColor(new Color(0xfac2c2)); path.reset(); path.moveTo(0,0); path.lineTo(4,23); path.lineTo(9,23); path.lineTo(8,2); path.closePath(); g.fill(path); g.setColor(new Color(0x692000)); g.draw(path); g.setColor(new Color(0x2020b2)); path.reset(); path.moveTo(0,0); path.lineTo(4,1); path.lineTo(9,1); path.lineTo(11,0); path.closePath(); g.fill(path); g.setColor(new Color(0)); g.draw(path); // End of Image definition for upperFoot // Start of Image definition for lowerFoot images[3] = new BufferedImage(16,18,BufferedImage.TYPE_INT_ARGB); g = images[3].createGraphics(); g.setColor(new Color(0xfac2c2)); path.reset(); path.moveTo(3,0); path.lineTo(6,18); path.lineTo(9,18); path.lineTo(8,0); path.closePath(); g.fill(path); g.setColor(new Color(0x692000)); g.draw(path); g.setColor(new Color(0x0)); g.fillRect(6,15,4,3); // End of Image definition for lowerFoot // Start of Image definition for foot images[4] = new BufferedImage(22,11,BufferedImage.TYPE_INT_ARGB); g = images[4].createGraphics(); g.setColor(new Color(0x0)); path.reset(); path.moveTo(12,0); path.lineTo(15,5); path.lineTo(22,11); path.lineTo(16,11); path.lineTo(13,8); path.lineTo(9,8); path.lineTo(8,0); path.closePath(); g.fill(path); g.draw(path); g.fillRect(10,8,2,3); g.setColor(new Color(0xe27950)); g.drawLine(10,0,10,5); g.drawLine(14,5,17,8); g.drawLine(14,7,15,8); g.setColor(new Color(0xfac2c2)); g.drawLine(11,0,11,3); g.drawLine(12,1,12,2); g.drawLine(14,6,16,8); // End of Image definition for foot // Start of Image definition for body images[5] = new BufferedImage(PLAYER_WIDTH,47,BufferedImage.TYPE_INT_ARGB); g = images[5].createGraphics(); g.setColor(new Color(0xfa9979)); g.fillOval(10,6,10,10); g.setColor(new Color(0x7979)); path.reset(); path.moveTo(18,2); path.lineTo(11,2); path.lineTo(5,6); path.lineTo(5,10); path.lineTo(2,13); path.quadTo(7,22,12,16); path.lineTo(10,10); path.lineTo(15,6); path.lineTo(18,6); path.lineTo(19,9); path.lineTo(19,12); path.lineTo(16,15); path.lineTo(20,16); path.lineTo(22,12); path.lineTo(21,9); path.lineTo(22,5); path.closePath(); g.fill(path); g.setColor(new Color(0)); g.draw(path); g.setColor(new Color(0x6969d2)); g.drawLine(13,9,13,9); g.setColor(new Color(0xfafafa)); g.drawLine(13,10,13,10); g.setColor(new Color(0x2020b2)); g.drawLine(14,9,14,9); g.setColor(new Color(0)); g.drawLine(14,10,14,10); g.setColor(new Color(0)); g.drawLine(18,9,18,9); g.setColor(new Color(0x4040d2)); g.drawLine(18,10,18,10); g.setColor(new Color(0xfac2c2)); g.drawLine(16,12,16,12); g.setColor(new Color(0xd20000)); g.drawLine(16,13,16,13); g.setColor(new Color(0x3069)); path.reset(); path.moveTo(11,17); path.lineTo(8,19); path.quadTo(11,21,6,36); path.quadTo(10,39,6,40); path.quadTo(5,45,17,46); path.quadTo(27,46,26,40); path.quadTo(20,37,22,19); path.quadTo(22,15,14,18); path.closePath(); g.fill(path); g.setColor(new Color(0)); g.draw(path); g.setColor(new Color(0x6969d2)); g.fillRect(17,21,2,6); // End of Image definition for body /********************************************************/ /* ANIMATION DATA */ /********************************************************/ int[][][] partAngle = { // Frame # 0 { //Chain # 0 (Right Hand) {53,-36}, //Chain # 1 (Right Leg) {-13,-256,-252}, //Chain # 2 (Left Leg) {-18,18,0}, //Chain # 3 (body) {23}, //Chain # 5 (Left Hand) {16,-62} }, // Frame # 1 { //Chain # 0 (Right Hand) {58,-33}, //Chain # 1 (Right Leg) {-67,54,63}, //Chain # 2 (Left Leg) {7,42,37}, //Chain # 3 (body) {20}, //Chain # 5 (Left Hand) {-4,-101} }, // Frame # 2 { //Chain # 0 (Right Hand) {77,-45}, //Chain # 1 (Right Leg) {-77,20,23}, //Chain # 2 (Left Leg) {23,54,56}, //Chain # 3 (body) {20}, //Chain # 5 (Left Hand) {-19,-146} }, // Frame # 3 { //Chain # 0 (Right Hand) {82,-28}, //Chain # 1 (Right Leg) {-76,15,0}, //Chain # 2 (Left Leg) {18,71,76}, //Chain # 3 (body) {22}, //Chain # 5 (Left Hand) {-17,-136} }, // Frame # 4 { //Chain # 0 (Right Hand) {67,-28}, //Chain # 1 (Right Leg) {-58,-8,-14}, //Chain # 2 (Left Leg) {8,-265,-262}, //Chain # 3 (body) {19}, //Chain # 5 (Left Hand) {-8,-99} }, // Frame # 5 { //Chain # 0 (Right Hand) {44,-29}, //Chain # 1 (Right Leg) {-42,3,0}, //Chain # 2 (Left Leg) {-9,-253,-243}, //Chain # 3 (body) {15}, //Chain # 5 (Left Hand) {12,-57} }, // Frame # 6 { //Chain # 0 (Right Hand) {26,-57}, //Chain # 1 (Right Leg) {-23,26,0}, //Chain # 2 (Left Leg) {-37,-261,-256}, //Chain # 3 (body) {21}, //Chain # 5 (Left Hand) {43,-18} }, // Frame # 7 { //Chain # 0 (Right Hand) {0,-90}, //Chain # 1 (Right Leg) {1,32,13}, //Chain # 2 (Left Leg) {-66,52,49}, //Chain # 3 (body) {18}, //Chain # 5 (Left Hand) {60,-9} }, // Frame # 8 { //Chain # 0 (Right Hand) {-15,-138}, //Chain # 1 (Right Leg) {23,52,63}, //Chain # 2 (Left Leg) {-78,23,18}, //Chain # 3 (body) {20}, //Chain # 5 (Left Hand) {81,0} }, // Frame # 9 { //Chain # 0 (Right Hand) {-16,-151}, //Chain # 1 (Right Leg) {23,78,72}, //Chain # 2 (Left Leg) {-62,-6,-15}, //Chain # 3 (body) {19}, //Chain # 5 (Left Hand) {74,-14} }, // Frame # 10 { //Chain # 0 (Right Hand) {4,-99}, //Chain # 1 (Right Leg) {17,-247,-241}, //Chain # 2 (Left Leg) {-52,-16,-14}, //Chain # 3 (body) {15}, //Chain # 5 (Left Hand) {60,-21} }, // Frame # 11 { //Chain # 0 (Right Hand) {14,-70}, //Chain # 1 (Right Leg) {-7,-242,-230}, //Chain # 2 (Left Leg) {-38,8,0}, //Chain # 3 (body) {12}, //Chain # 5 (Left Hand) {52,-52} } }; /********************************************************/ /* CHAIN DATA */ /********************************************************/ int[][] chainImageMap = { //Chain # 0 (Right Hand) {23,20,0,1}, //Chain # 1 (Right Leg) {11,39,2,3,4}, //Chain # 2 (Left Leg) {11,39,2,3,4}, //Chain # 3 (body) {24,2,5}, //Chain # 5 (Left Hand) {10,17,0,1} }; int[][] stopStance = { {-12,-57}, {-32,-5,2}, {5,18,0}, {22}, {24,-34}, }; int frame = 1; int steps = 5; int tweenPtr = -1; // Babies for (i = ITEM_BABY; i <= ITEM_DEAD_BABY; i++) { images[i] = new BufferedImage(21,28,BufferedImage.TYPE_INT_ARGB); g = images[i].createGraphics(); g.setColor(new Color(0xc6a521)); path.reset(); path.moveTo(9,6); if (i == ITEM_BABY ) { // Hands down path.lineTo(1,14); path.quadTo(0,18,1,20); path.lineTo(4,15); } else { // Hands Up path.lineTo(5,11); path.quadTo(2,12,1,7); path.lineTo(0,11); } path.lineTo(5,17); path.lineTo(5,25); path.lineTo(4,27); path.lineTo(9,27); path.lineTo(10,14); path.closePath(); g.fill(path); g.setColor(new Color(0x0)); g.draw(path); g.setColor(new Color(0xf9f7ef)); path.reset(); path.moveTo(10,18); path.lineTo(4,18); path.lineTo(4,21); path.lineTo(8,23); path.lineTo(10,21); path.closePath(); g.fill(path); g.setColor(new Color(0x0)); g.draw(path); // Face g.scale(-1,1); g.translate(-21,0); g.drawImage(images[i],0,0,null); g = images[i].createGraphics(); g.setPaint( new GradientPaint(6,3,new Color(0xfbffad),15,11,new Color(0x8c6f00),true)); g.fillOval(3,0,14,14); g.setColor(new Color(0x0)); g.drawOval(3,0,14,14); g.drawLine(10,3,11,2); g.drawLine(9,0,9,3); if (i != ITEM_DEAD_BABY) { g.fillRect(12,5,2,2); g.fillRect(7,5,2,2); if (i == ITEM_BABY) { g.fillOval(7,9,6,2); g.setColor(new Color(0x0)); g.drawOval(7,9,6,2); } else { g.drawLine(8,10,10,8); g.drawLine(10,8,12,10); } } else { g.drawLine(6,5,8,7); g.drawLine(8,5,6,7); g.drawLine(11,5,13,7); g.drawLine(13,5,11,7); g.drawLine(7,10,12,10); g.fillRect(10,11,2,2); } g.setColor(new Color(0xc6a521)); g.drawLine(10,15,10,17); } images[ITEM_FLYING_BABY] = new BufferedImage(40,50,BufferedImage.TYPE_INT_ARGB); g = images[ITEM_FLYING_BABY].createGraphics(); g.setColor(new Color(0xc61042)); g.fillOval(14,1,14,16); g.setColor(new Color(0)); g.drawOval(14,1,14,16); g.setColor(new Color(0xefeff7)); g.fillRect(22,5,2,3); g.setColor(new Color(0)); g.drawLine(20,18,20,30); g.drawImage(images[ITEM_FALLING_BABY],0,20,null); images[ITEM_TV] = new BufferedImage(24,24,BufferedImage.TYPE_INT_ARGB); g = images[ITEM_TV].createGraphics(); g.setColor(new Color(0x8)); g.fillRect(2,8,20,12); //g.setPaint( new GradientPaint(9,13,new Color(0xbdffff),15,18,new Color(0x5a7b9c),true)); g.setColor(new Color(0x5a7b9c)); g.fillRect(5,10,13,8); g.setColor(new Color(0x0)); g.drawLine(9,1,15,8); g.drawLine(15,8,22,1); g.fillRect(5,20,2,4); g.fillRect(18,20,2,4); g.setColor(new Color(0xffff00)); g.fillOval(19,10,2,2); g.fillOval(19,15,2,2); BufferedImage scenery = new BufferedImage(WIDTH,SCR_HEIGHT,BufferedImage.TYPE_INT_RGB); enableEvents(8); // For mouse events // enableEvents(KeyEvent.MOUSE_EVENT_MASK); show(); createBufferStrategy(2); BufferStrategy strategy = getBufferStrategy(); long lastFrame = 0; while (true) { if (System.currentTimeMillis()-lastFrame <10) { Thread.yield(); continue; } lastFrame = System.currentTimeMillis(); if (!isVisible()) { System.exit(0); } if (state == STATE_INIT || state == STATE_INIT_LEVEL) { // LEVEL INITIALIZATION itemX = new int[MAX_ITEMS]; itemY = new int[MAX_ITEMS]; itemVY = new int[MAX_ITEMS]; itemType = new int[MAX_ITEMS]; itemTimer = new int[MAX_ITEMS]; itemType[0]=ITEM_PLAYER; itemX[0] = 100; itemY[0] = BASE-50; babies = 0; g = scenery.createGraphics(); // Sky g.setPaint(new GradientPaint(0,0,new Color(0x00FFFF),0,BASE,new Color(0xFFFFFF))); g.fillRect(0,0,WIDTH,BASE); // The sun g.setColor(new Color(0xFFFF00)); g.fillOval(30,30,80,80); // Soil g.setPaint(new GradientPaint(0,BASE,new Color(0x00AA00),0,SCR_HEIGHT,new Color(0x005500))); g.fillRect(0,BASE,WIDTH,SCR_HEIGHT-BASE); // Buildings windows = 0; openWindows = 0; for (i = 0; i< WIDTH; ) { g.setColor(new Color(0x745E2A)); int w = (rnd.nextInt(3)+1)*(WINDOW_WIDTH+WINDOW_H_SPACING)+WINDOW_H_SPACING; if (i+w > WIDTH) w = WIDTH-i; int h = (rnd.nextInt(3)+3)*(WINDOW_HEIGHT+WINDOW_V_SPACING)+WINDOW_V_SPACING; g.fillRect(i,BASE-h,w,h); g.setColor(new Color(0)); g.drawRect(i,BASE-h,w,h); // Building shadow g.setColor(new Color(0)); path.reset(); path.moveTo(i+w,BASE-h); path.lineTo(i+w+10,BASE-h+10); path.lineTo(i+w+10,BASE); path.lineTo(i+w,BASE); path.closePath(); g.fill(path); for (int x = WINDOW_H_SPACING; x+WINDOW_WIDTH< w; x+=WINDOW_H_SPACING+WINDOW_WIDTH) { for (int y = WINDOW_V_SPACING; y+3*WINDOW_HEIGHT< h; y+=WINDOW_V_SPACING+WINDOW_HEIGHT) { windows++; itemX[windows]=i+x; itemY[windows]=BASE-h+y; itemType[windows]=ITEM_WINDOW_CLOSED; } } i+=w+20; } if (state == STATE_INIT) { // GAME INITIALIZATION score = 0; lives = 5; } state = STATE_PLAYING; } /***************************************************************** * EVOLUTION *****************************************************************/ if (key[KeyEvent.VK_ENTER]) { if (state == STATE_LIFE_LOST) { state = STATE_INIT_LEVEL; } if (state == STATE_GAME_OVER) { state =STATE_INIT ; } } if (state == STATE_PLAYING) { level = 1 + score / 500; //level = 10; if (key[KeyEvent.VK_LEFT]) { itemX[0]-=PLAYER_SPEED+level/3; orientation = -1; } if (key[KeyEvent.VK_RIGHT]) { itemX[0]+=PLAYER_SPEED+level/3; orientation = 1; } // Spawn if (rnd.nextInt(200) < 3*level && openWindows < level) { // Find a random int window = rnd.nextInt(windows); if (itemType[window+1]==ITEM_WINDOW_CLOSED) { openWindows++; itemType[window+1]=ITEM_WINDOW_OPEN; // Start opening process itemTimer[window+1] = 0; } } for (i = 0; i < MAX_ITEMS;i++) { if (itemType[i]!=0) { itemTimer[i]++; if (itemType[i] == ITEM_WINDOW_OPEN && itemTimer[i] > WINDOW_TIMER+BABY_TIMER) { itemType[i] = ITEM_WINDOW_CLOSED; openWindows--; } if (itemType[i] == ITEM_WINDOW_OPEN && itemTimer[i] == WINDOW_TIMER) { for (slot = 1; slot < MAX_ITEMS -1 && itemType[slot] != 0; slot++); itemX[slot]=itemX[i]; itemY[slot]=itemY[i]+WINDOW_HEIGHT-1; itemVY[slot]=0; itemTimer[slot]=0; if (babies < (level%3+1) && rnd.nextInt(100)>(10*(level%10))) { itemType[slot]=ITEM_BABY; babies++; } else { itemType[slot]=ITEM_TV; itemVY[slot]=1+rnd.nextInt(3); } } if (itemType[i] == ITEM_BABY) { itemTimer[i]+=level; if (itemTimer[i] >= BABY_TIMER) { if (rnd.nextInt(6) >= level%5) { itemVY[i]=1; itemType[i] = ITEM_FALLING_BABY; } else { itemVY[i]=-1-rnd.nextInt(3); itemType[i] = ITEM_FLYING_BABY; } } } itemY[i]+=itemVY[i]; if (itemY[i] < 50) { itemType[i] = ITEM_FALLING_BABY; itemVY[i] = 2; } if (i==0) continue; if (itemY[i] > BASE-70 && ((itemX[i] >= itemX[0] && itemX[i]<=itemX[0] + PLAYER_WIDTH) || (itemX[i]+BABY_WIDTH >=itemX[0] && itemX[i]+BABY_WIDTH <= itemX[0]+PLAYER_WIDTH))) { if (itemType[i] == ITEM_FALLING_BABY || itemType[i] == ITEM_BABY) { score+=50*itemVY[i]; babies--; itemType[i] = 0; } else { lives--; if (lives < 0) state = STATE_GAME_OVER; else state = STATE_LIFE_LOST; } } else if (itemY[i] > BASE) { if (itemType[i] != ITEM_FALLING_BABY) { itemType[i] = 0; } else { lives--; if (lives < 0) state = STATE_GAME_OVER; else state = STATE_LIFE_LOST; itemType[i] = ITEM_DEAD_BABY; //babies--; } } } } if (itemX[0] < 0) itemX[0] = WIDTH; if (itemX[0] > WIDTH) itemX[0] = 0; } /****************************************************************** * SCREEN UPDATE ******************************************************************/ g = (Graphics2D)strategy.getDrawGraphics(); g.drawImage(scenery,0,0,null); if (state == STATE_GAME_OVER ) { g.setColor(new Color(255,0,0)); g.drawString("GAME OVER",300,300); } if (state == STATE_PLAYING) { tweenPtr++; if (tweenPtr > steps) { tweenPtr = 0; frame++; if (frame > partAngle.length) frame = 1; } } for (int chainNum = 0; chainNum < chainImageMap.length;chainNum++) { int connectX = itemX[0]+chainImageMap[chainNum][0]; int connectY = itemY[0]+chainImageMap[chainNum][1]; // Part i of Chain for (i = 2; i < chainImageMap[chainNum].length; i++) { double tweenStartAngle = partAngle[frame-1][chainNum][i-2]/57.0;//*Math.PI/180; double tweenEndAngle; if (frame == partAngle.length) tweenEndAngle = partAngle[0][chainNum][i-2]/57.0; //*Math.PI/180; else tweenEndAngle = partAngle[frame][chainNum][i-2]/57.0; //*Math.PI/180; double delta = (tweenEndAngle-tweenStartAngle); double angle; if (delta < -Math.PI) angle = tweenStartAngle+(delta+2*Math.PI)/steps*tweenPtr; else if (delta > Math.PI) angle = tweenStartAngle+(delta-2*Math.PI)/steps*tweenPtr; else angle = tweenStartAngle+delta/steps*tweenPtr; if ((!key[KeyEvent.VK_LEFT]) && (!key[KeyEvent.VK_RIGHT])) { angle = stopStance[chainNum][i-2]/57.0; //*Math.PI/180; } BufferedImage img = images[chainImageMap[chainNum][i]]; int w = img.getWidth(); int h = img.getHeight(); g.translate(itemX[0]+images[5].getWidth()/2,0); g.scale(orientation,1); g.translate(-itemX[0]-images[5].getWidth()/2,0); g.rotate(angle,connectX,connectY); g.drawImage(img,connectX-w/2,connectY,null); connectX = (int)(connectX-h*Math.sin(angle)); connectY = (int)(connectY+h*Math.cos(angle)); g = (Graphics2D)strategy.getDrawGraphics(); } } for (i = 1; i < MAX_ITEMS; i++) { if (itemType[i] !=0) { if (itemType[i] == ITEM_BABY) { g.drawImage( images[ITEM_BABY], itemX[i],itemY[i]-itemTimer[i]/10,itemX[i]+BABY_WIDTH,itemY[i], 0,0,BABY_WIDTH,itemTimer[i]/10, null); }else if (itemType[i] != ITEM_DEAD_BABY) { g.drawImage(images[itemType[i]],itemX[i],itemY[i],null); } else { g.rotate(-Math.PI/2,itemX[i]+BABY_WIDTH,itemY[i]+BABY_HEIGHT); g.drawImage(images[ITEM_DEAD_BABY],itemX[i],itemY[i],null); } g = (Graphics2D)strategy.getDrawGraphics(); } } // Draw Score g.setColor(new Color(0x00FF00)); g.drawString(String.valueOf(score),SCORE_POSITION+75,STATUS_LINE+20); // Draw lives for (i = 0; i < lives; i++) { g.drawImage(images[ITEM_BABY],LIVES_POSITION+20*i,STATUS_LINE,null); } strategy.show(); } } protected void processKeyEvent(KeyEvent e) { key[((KeyEvent)e).getKeyCode()] =e.getID() == KeyEvent.KEY_PRESSED; } } /** Size diary 3386 - Bullets and items. Basic player mechanics 3641 - Hmmm 3898 - Game mechanics + graphics 3984 - Dead baby graphics 3988 - Full game without any optimizations 4055 - Full game with level-varying difficulty Level varying items: Number of babies : level % 3 +1 Number of open windows : level Probability of a baby spawning : level*3% Probability of a TV spawning : (level*5)% 4008 - Some optimizations performed 4135 - Flying babies */