Jnk1296

Space Invaders - Elements

Mar 1st, 2013
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 27.04 KB | None | 0 0
  1. package net.jnk.Unknown;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Font;
  5. import java.awt.Graphics;
  6. import java.awt.Graphics2D;
  7. import java.awt.RenderingHints;
  8.  
  9. import javax.swing.JPanel;
  10.  
  11. public class Elements extends JPanel{
  12.    
  13.     // ***VARIABLES***
  14.    
  15.     // Player Variables
  16.     private static int playerPos = 0;
  17.     private static final int MOVEMENT_SPEED = 1;
  18.     private static boolean playerDead = false;
  19.    
  20.     // HUD Variables
  21.     private static int maxLives = 10;
  22.     private static int currentLives = 3;
  23.     private static int healthHUDpos = SpaceInvaders.SIZE.width - 35;
  24.    
  25.     // Window Focus and Title Variables
  26.     private static boolean runningTitle = true;
  27.     private static boolean titleDisplay = false;
  28.     private static int titleDisplayTick = 0;
  29.     private static int titleTickCount = 0;
  30.     private static int captionDir = 1;
  31.     private static int captionPosY = 375;
  32.     private static int focusCount = 0;
  33.    
  34.     // Score Keeping Variables
  35.     private static int score = 0;
  36.     private static int scoreLifeCount = 0;
  37.     private static final int SCORE_ENEMY = 50; // Point Value of Regular Enemy
  38.     private static final int SCORE_BONUS = 250; // Point Value of Bonus Ship
  39.     private static final int SCORE_LIFE = 1000; // Point Value of extra life
  40.     private static final int SCORE_DEATH = 500; // Point Value of losing a life
  41.     private static boolean scoreAdd = false;
  42.     private static boolean scoreSub = false;
  43.     private static int scoreMod = 0;
  44.    
  45.     // Title Display Variables
  46.     private static int titleTankX = -80;
  47.     private static int titleTankY = SpaceInvaders.SIZE.height / 2 + 155;
  48.     private static int titleEnemyX = -15;
  49.     private static int titleEnemyY = SpaceInvaders.SIZE.height / 2 + 35;
  50.    
  51.     // Starting Variables
  52.     public static boolean hasFocus = true;
  53.     public static boolean isNewBoard = true;
  54.     public static boolean displayDebug = false;
  55.     public static int clearBoardTick = 0;
  56.    
  57.     //Level Counter
  58.     private static int level = 1;
  59.    
  60.     // Enemy Movement and Position Variables
  61.     // 1 = Right; 0 = Left
  62.     private static int enemyMoveDir = 1;
  63.     private static int enemyXPos = 30; // (Range 0 - 90)
  64.     private static int enemyYPos = 40; // (Range 40 - 350)
  65.     private static int maxXDistance = 100;
  66.     private static int maxYDistance = 350;
  67.     private static int enemyMoveDelay = 500;
  68.     private static int currentEnemies = 55;
  69.    
  70.     // Variables for the "Bonus" ship. displayBonus can be manually toggled here for debugging purposes.
  71.     private static boolean displayBonus = false;
  72.     private static boolean bonusDrop = false;
  73.     private static int bonusTickCount = 0;
  74.     private static int bonusMoveSpeed = 1;
  75.     private static int bonusX = -20;
  76.     private static int bonusY = 15;
  77.    
  78.     // Variables for the Bonus Drop
  79.     private static boolean dropPicked = false;
  80.     private static boolean drawGuide = false;
  81.     private static int dropX = 0;
  82.     private static int dropY = 0;
  83.     private static int dropColorTick = 0;
  84.     private static int dropEffectTick = 0;
  85.     private static int guideX = 0;
  86.    
  87.     private static int flashTick = 0;
  88.     private static int flashIntensity = 0;
  89.     private static boolean flashStage1 = true;
  90.     private static boolean flashTrigger = false;
  91.    
  92.     // Amount of time to subtract from the move delay each time the grid moves closer to the player
  93.     private static int enemyMoveDelaySub = 15;
  94.    
  95.     // Counter for Enemy Grid Movement
  96.     private static int enemyTickCounter = 0;
  97.     private static int enemyBonusTick = 0;
  98.    
  99.     // Number of pixels enemy grid moves on X and Y Axis
  100.     private static int enemyXMoveSpeed = 3;
  101.     private static int enemyYMoveSpeed = 20;
  102.    
  103.     // X and Y Size for the Enemy Grid
  104.     private static int gridWidth = 11;
  105.     private static int gridHeight = 5;
  106.    
  107.     // Technical Variables used for enemy grid and HUD elements;
  108.     private static int gridXOffset = 0;
  109.     private static int gridYOffset = 0;
  110.     private static int healthHUDoffset = 0;
  111.     private static int addXPosTick = 0;
  112.     private static int subXPosTick = 0;
  113.     private static int addXPos = 20;
  114.     private static int subXPos = 20;
  115.    
  116.     // Bullet Variables
  117.     private static boolean bulletShot = false;
  118.     private static boolean doesAlign = false;
  119.     private static boolean bonusAlign = false;
  120.     private static boolean bulletHit = false;
  121.     private static boolean setYPos = false;
  122.     private static boolean setXPos = false;
  123.     private static int bulletSpeed = 2;
  124.     private static int bulletY = 0;
  125.     private static int bulletX = 0;
  126.    
  127.     // Enemy Bullet Variables
  128.     private static boolean enemyBulletShot = false;
  129.     private static boolean enemyBulletHit = false;
  130.     private static boolean setEnemyYPos = false;
  131.     private static boolean setEnemyXPos = false;
  132.     private static int enemyBulletY = 0;
  133.     private static int enemyBulletX = 0;
  134.     private static int enemyWaitTick = 0;
  135.     private static int enemyTimeToWait = 500;
  136.    
  137.     private static int iVal = 0;
  138.    
  139.     // Enemy Control Array
  140.     private static boolean[] enemies = new boolean[gridWidth * gridHeight];
  141.     private static int[] enemyLocation = new int[gridWidth]; // Only the X Positions are required for calculations
  142.    
  143.     private static long timeStart;
  144.     private static long timeEnd;
  145.     private static boolean tick = false;
  146.     private static boolean changeTime = true;
  147.  
  148.     private static final long serialVersionUID = 1L;
  149.    
  150.     // ***METHODS***
  151.    
  152.     // Main graphics method (Main Loop)
  153.     public void paint(Graphics g) {
  154.        
  155.         if (changeTime) {
  156.             timeStart = System.nanoTime();
  157.             changeTime = false;
  158.         }
  159.        
  160.         if (tick) {
  161.             // Setting background to dark purple
  162.             g.setColor(new Color(0x2B112A));
  163.             g.fillRect(0, 0, SpaceInvaders.SIZE.width, SpaceInvaders.SIZE.height);
  164.            
  165.             if(!runningTitle) {
  166.                 //Creating "Ground"
  167.                 g.setColor(new Color(0x3B8C1B));
  168.                 g.fillRect(0, SpaceInvaders.SIZE.height - 35, SpaceInvaders.SIZE.width, 10);
  169.                
  170.                 // METHOD CALLS
  171.                
  172.                 // Draw Bonus Drop Effect (Aiming Guide) (We want this to be behind all other elements)
  173.                 drawDropEffect(g);
  174.                 // Draw Tank
  175.                 drawTank(g);
  176.                 // Draw Enemies
  177.                 drawEnemies(g, enemyXPos, enemyYPos);
  178.                 // Draw Bonus Ship
  179.                 drawBonus(g, bonusX, bonusY);
  180.                 // Draw HUD Components
  181.                 drawHUD(g);
  182.                 // Draw Bullet
  183.                 drawBullet(g);
  184.                 // Draw Enemy Bullet
  185.                 drawEnemyBullet(g);
  186.                 // Draw Bonus Ship Drop
  187.                 drawBonusDrop(g);
  188.                 // Enemy Movement AI
  189.                 enemyMove();
  190.                 // Check Enemy Status
  191.                 enemyCheck();
  192.                 // Draw Screen Flash when requested
  193.                 screenFlash(g);
  194.                
  195.                 // Display a "Click to Focus" message when game does not have focus
  196.                 if (!hasFocus) {
  197.                     // Draw Background
  198.                     g.setColor(new Color(0,0,0,100));
  199.                     g.fillRect(0, 0, SpaceInvaders.SIZE.width, SpaceInvaders.SIZE.height);
  200.                    
  201.                     // Draw Border
  202.                     g.setColor(Color.darkGray);
  203.                     g.fillRect((SpaceInvaders.SIZE.width / 2) - 67, (SpaceInvaders.SIZE.height / 2) - 35, 150, 30);
  204.                    
  205.                     // Draw Text
  206.                     if (focusCount <= 180) {
  207.                         g.setColor(Color.WHITE);
  208.                         g.setFont(new Font("Segoe UI", Font.PLAIN, 16));
  209.                         Graphics2D g2d = (Graphics2D)g;
  210.                         g2d.setRenderingHint(
  211.                                 RenderingHints.KEY_TEXT_ANTIALIASING,
  212.                                 RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
  213.                         g.drawString("CLICK TO FOCUS", (SpaceInvaders.SIZE.width / 2) - 60, (SpaceInvaders.SIZE.height / 2) - 15);
  214.                        
  215.                         focusCount++;
  216.                     } else {
  217.                         if (focusCount > 180 && focusCount <= 360) {
  218.                             focusCount++;
  219.                         } else {
  220.                             focusCount = 0;
  221.                         }
  222.                     }
  223.                 }
  224.                
  225.                 // Display Debug Information when the F3 key is pressed (displayDebug == true)
  226.                 if (displayDebug) {
  227.                     g.setColor(Color.WHITE);
  228.                     g.setFont(new Font("Arial", Font.PLAIN, 10));
  229.                     g.drawString("Grid X: " + enemyXPos, 3, 10);
  230.                     g.drawString("Grid Y: " + enemyYPos, 60, 10);
  231.                     g.drawString("Movement Delay: " + enemyMoveDelay, 117, 10);
  232.                     g.drawString("Maximum Lives: " + maxLives, 3, 20);
  233.                     g.drawString("Current Lives: " + currentLives, 105, 20);
  234.                     g.drawString("Level:  " + level, 185, 20);
  235.                     g.drawString("Number of Enemies: " + currentEnemies, 3, 30);
  236.                     g.drawString("Bonus Ship Time: " + enemyBonusTick, 120, 30);
  237.                     g.drawString("Drop Effect Tick: " + dropEffectTick, 3, 40);
  238.                 }
  239.             }
  240.            
  241.             // Update Input
  242.             input();
  243.            
  244.             // Draw Title Screen
  245.             if (runningTitle) drawTitleScreen(g);
  246.            
  247.             tick = false;
  248.         }
  249.        
  250.         timeEnd = System.nanoTime();
  251.        
  252.         // Limit number of updates to help with game speed.
  253.         if ((timeEnd - timeStart) >= 1000000000 / 800) {
  254.             tick = true;
  255.             changeTime = true;
  256.         }
  257.        
  258.         // Loop
  259.         repaint();
  260.     }
  261.  
  262.     // Draws the game's title screen
  263.     private void drawTitleScreen(Graphics g) {
  264.         g.setColor(Color.WHITE);
  265.        
  266.         g.setFont(new Font("FixedsysTTF", Font.ITALIC, 120));
  267.         g.drawString("Space", 90, 165);
  268.         g.drawString("Invaders", 170, 270);
  269.        
  270.         g.setFont(new Font("Arial", Font.PLAIN, 14));
  271.         g.drawString("PRESS FIRE TO START...", (SpaceInvaders.SIZE.width / 2) - 80 , captionPosY);
  272.        
  273.         g.drawString("Jnk Games \u00a9 2012 - 2013. This software is released under GPL v3.0.", 5, SpaceInvaders.SIZE.height - 30);
  274.         g.drawString("Press F1 for help.", SpaceInvaders.SIZE.width - 125, SpaceInvaders.SIZE.height - 30);
  275.        
  276.         // Title Screen Enemy Model
  277.         g.setColor(Color.RED);
  278.         g.fillRect(530, 92, 75, 24);
  279.         g.fillRect(515, 107, 15, 9);
  280.         g.fillRect(605, 107, 15, 9);
  281.         g.fillRect(530, 86, 9, 6);
  282.         g.fillRect(596, 86, 9, 6);
  283.         g.fillRect(515, 116, 6, 6);
  284.         g.fillRect(614, 116, 6, 6);
  285.         g.fillRect(590, 80, 6, 12);
  286.         g.fillRect(539, 80, 6, 12);
  287.         g.fillRect(524, 80, 6, 18);
  288.         g.fillRect(605, 80, 6, 18);
  289.         g.fillRect(566, 74, 6, 18);
  290.         g.fillRect(539, 116, 6, 9);
  291.         g.fillRect(590, 116, 6, 9);
  292.         g.fillRect(545, 116, 45, 6);
  293.        
  294.         // Animate "Press Fire to Start..." message
  295.         if (titleTickCount % 8 == 0) {
  296.             if (captionDir == 1) {
  297.                 if (captionPosY <= 415) {
  298.                     captionPosY += MOVEMENT_SPEED;
  299.                 } else if (captionPosY > 415) captionDir = 0;
  300.             } else if (captionDir == 0) {
  301.                 if (captionPosY >= 375) {
  302.                     captionPosY -= MOVEMENT_SPEED;
  303.                 } else if (captionPosY < 375) {
  304.                     captionDir = 1;
  305.                     titleTickCount = 0;
  306.                 }
  307.             }
  308.         }
  309.        
  310.         titleTickCount++;
  311.        
  312.         // Display Alien and Tank animation on title
  313.         if (titleDisplayTick < 7000) {
  314.             titleDisplayTick++;
  315.         } else if (titleDisplayTick >= 7000) {
  316.             titleDisplay = true;
  317.             if (titleDisplay) {
  318.                 // Tank Model
  319.                 g.setColor(Color.WHITE);
  320.                 g.fillRect(titleTankX + 10, titleTankY - 25, 30, 15);
  321.                 g.fillRect(titleTankX + 22, titleTankY - 32, 6, 8);
  322.                
  323.                 // Enemy Model
  324.                 g.setColor(Color.GREEN);
  325.                 g.fillRect(titleEnemyX + 10, titleEnemyY + 14, 25, 8);
  326.                 g.fillRect(titleEnemyX + 5, titleEnemyY + 19, 5, 3);
  327.                 g.fillRect(titleEnemyX + 35, titleEnemyY + 19, 5, 3);
  328.                 g.fillRect(titleEnemyX + 10, titleEnemyY + 12, 3, 2);
  329.                 g.fillRect(titleEnemyX + 32, titleEnemyY + 12, 3, 2);
  330.                
  331.                 titleDisplayTick++;
  332.                
  333.                 if (titleTankX < SpaceInvaders.SIZE.width + 20 && titleDisplayTick % 2 == 0) {
  334.                     titleTankX++;
  335.                     titleEnemyX++;
  336.                 } else if (titleTankX > SpaceInvaders.SIZE.width + 20) {
  337.                     titleTankX = -35;
  338.                     titleEnemyX = -15;
  339.                     titleDisplay = false;
  340.                 }
  341.             } else if (!titleDisplay) {
  342.                 titleDisplayTick = 0;
  343.             }
  344.         }
  345.     }
  346.  
  347.     // Draws the player model to the screen
  348.     public static void drawTank(Graphics g) {
  349.         // Player Model
  350.         if (!playerDead) {
  351.             g.setColor(Color.WHITE);
  352.             g.fillRect(playerPos + 10, SpaceInvaders.SIZE.height - 50, 30, 15);
  353.             g.fillRect(playerPos + 22, SpaceInvaders.SIZE.height - 57, 6, 8);
  354.         }
  355.            
  356.         if (currentLives == 0) {
  357.             clearBoard(false);
  358.         }
  359.     }
  360.    
  361.     // Draws the enemy grid to the screen
  362.     public static void drawEnemies(Graphics g, int posX, int posY) {
  363.         /* Enemy X Spacing: 75
  364.          * Enemy Y Spacing: 40
  365.          */
  366.         int enemyArray = 0;
  367.        
  368.         if (isNewBoard) {
  369.             for(int reset = 0; reset < enemies.length; reset++) {
  370.                 enemies[reset] = true;
  371.             }
  372.             isNewBoard = false;
  373.         }
  374.        
  375.         for(int height = 0; height < gridHeight; height++) {
  376.             for(int width = 0; width < gridWidth; width++) {
  377.                 if (enemies[enemyArray]) {
  378.                     // Enemy Model
  379.                     g.setColor(Color.GREEN);
  380.                     g.fillRect(posX + gridXOffset + 10, posY + gridYOffset + 14, 25, 8);
  381.                     g.fillRect(posX + gridXOffset + 5, posY + gridYOffset + 19, 5, 3);
  382.                     g.fillRect(posX + gridXOffset + 35, posY + gridYOffset + 19, 5, 3);
  383.                     g.fillRect(posX + gridXOffset + 10, posY + gridYOffset + 12, 3, 2);
  384.                     g.fillRect(posX + gridXOffset + 32, posY + gridYOffset + 12, 3, 2);
  385.                 }
  386.                 gridXOffset += 65;
  387.                 enemyArray++;
  388.             }
  389.             gridYOffset += 40;
  390.             gridXOffset = 0;
  391.         }
  392.         gridYOffset = 0;
  393.        
  394.         // Controls when bonus ship enters screen
  395.         if(hasFocus) {
  396.             if (enemyBonusTick < 20000) {
  397.                 enemyBonusTick++;
  398.             } else if (enemyBonusTick <= 20000) {
  399.                 enemyBonusTick = 0;
  400.                 displayBonus = true;
  401.             }
  402.         }
  403.     }
  404.    
  405.     // Draws the Bonus Ship to the screen
  406.     public static void drawBonus(Graphics g, int posX, int posY) {
  407.         if (displayBonus) {
  408.             // Bonus Ship Model
  409.             g.setColor(Color.RED);
  410.             g.fillRect(bonusX + 10, bonusY + 14, 25, 8);
  411.             g.fillRect(bonusX + 5, bonusY + 19, 5, 3);
  412.             g.fillRect(bonusX + 35, bonusY + 19, 5, 3);
  413.             g.fillRect(bonusX + 10, bonusY + 12, 3, 2);
  414.             g.fillRect(bonusX + 32, bonusY + 12, 3, 2);
  415.             g.fillRect(bonusX + 5, bonusY + 22, 2, 2);
  416.             g.fillRect(bonusX + 38, bonusY + 22, 2, 2);
  417.             g.fillRect(bonusX + 30, bonusY + 10, 2, 4);
  418.             g.fillRect(bonusX + 13, bonusY + 10, 2, 4);
  419.             g.fillRect(bonusX + 8, bonusY + 10, 2, 6);
  420.             g.fillRect(bonusX + 35, bonusY + 10, 2, 6);
  421.             g.fillRect(bonusX + 22, bonusY + 8, 2, 6);
  422.             g.fillRect(bonusX + 13, bonusY + 22, 2, 3);
  423.             g.fillRect(bonusX + 30, bonusY + 22, 2, 3);
  424.             g.fillRect(bonusX + 15, bonusY + 22, 15, 2);
  425.            
  426.             // Check if bullet is in alignment with the bonus ship
  427.             if (bulletX >= bonusX && bulletX <= bonusX + 35) {
  428.                 bonusAlign  = true;
  429.             } else {
  430.                 bonusAlign = false; // To prevent bonusAlign from sticking once the bonus ship moves out of bullet trajectory
  431.             }
  432.            
  433.             if (hasFocus) {
  434.                 bonusTickCount++;
  435.                
  436.                 if (bonusTickCount % 3 == 0) {
  437.                     if (bonusX < SpaceInvaders.SIZE.width + 30) {
  438.                         bonusX += bonusMoveSpeed;
  439.                     } else {
  440.                         displayBonus = false;
  441.                         bonusX = -20;
  442.                         bonusTickCount = 0;
  443.                     }
  444.                 }
  445.             }
  446.         }
  447.     }
  448.    
  449.     // Draw the power-up orb that is seen when the bonus ship is shot down.
  450.     public static void drawBonusDrop(Graphics g) {
  451.         if (bonusDrop && hasFocus) {
  452.            
  453.             if (dropY < SpaceInvaders.SIZE.height - 50) dropY += MOVEMENT_SPEED;
  454.            
  455.             if (dropColorTick <= 50) {
  456.                 g.setColor(new Color(0xD6B547));
  457.                 dropColorTick++;
  458.             } else if (dropColorTick > 50 && dropColorTick <= 100) {
  459.                 g.setColor(Color.LIGHT_GRAY);
  460.                 dropColorTick++;
  461.             } else if (dropColorTick > 100) {
  462.                 dropColorTick = 0;
  463.             }
  464.            
  465.             g.fillOval(dropX, dropY, 15, 15);
  466.             g.setColor(Color.LIGHT_GRAY);
  467.            
  468.             if (dropY >= SpaceInvaders.SIZE.height - 70 && dropY <= SpaceInvaders.SIZE.height - 55) {
  469.                 if (dropX >= playerPos && dropX <= playerPos + 45) {
  470.                     dropPicked = true;
  471.                     flashTrigger = true;
  472.                     drawGuide = true;
  473.                     dropY = -20;
  474.                     bonusDrop = false;
  475.                 }
  476.             } else if (dropY > SpaceInvaders.SIZE.height - 55) {
  477.                 dropY = -20;
  478.                 bonusDrop = false;
  479.             }
  480.         }
  481.     }
  482.    
  483.     // Draw the Laser Sight that appears when power-up orb is picked up.
  484.     public static void drawDropEffect(Graphics g) {
  485.         if (dropPicked && hasFocus) {
  486.             if (dropEffectTick < 10000) {
  487.                 dropEffectTick += 1;
  488.             } else if (dropEffectTick >= 10000 && dropEffectTick <= 13000) {
  489.                 if (dropEffectTick % 32 == 0) {
  490.                     if (drawGuide) {
  491.                         drawGuide = false;
  492.                     } else {
  493.                         drawGuide = true;
  494.                     }
  495.                 }
  496.                 dropEffectTick += 1;
  497.             } else if (dropEffectTick > 13000) {
  498.                 dropPicked = false;
  499.                 dropEffectTick = 0;
  500.             }
  501.            
  502.             if (drawGuide) {
  503.                 guideX = playerPos + 24;
  504.             }
  505.            
  506.             if (!drawGuide) {
  507.                 guideX = -5;
  508.             }
  509.            
  510.             g.setColor(Color.RED);
  511.             g.drawLine(guideX, enemyYPos + 10, guideX, SpaceInvaders.SIZE.height - 55);
  512.             g.setColor(new Color(0xDB8181));
  513.             g.drawLine(guideX + 1, enemyYPos + 10, guideX + 1, SpaceInvaders.SIZE.height - 55);
  514.             g.setColor(Color.LIGHT_GRAY);
  515.         }
  516.     }
  517.    
  518.     // Screen flash. Reusable in multiple locations if needed.
  519.     public static void screenFlash(Graphics g) {
  520.         if (flashTrigger && hasFocus) {
  521.            
  522.             flashTick += 1;
  523.            
  524.             if (flashStage1) {
  525.                 if (flashIntensity < 255) {
  526.                     flashIntensity += 10;
  527.                    
  528.                     if (flashIntensity > 255) {
  529.                         flashIntensity = 255;
  530.                     }
  531.                 }
  532.             } else if (!flashStage1) {
  533.                 if (flashIntensity > 0) {
  534.                     if (flashTick % 6 == 0) flashIntensity -= 1;
  535.                     if (flashIntensity < 0) {
  536.                         flashIntensity = 0;
  537.                     }
  538.                 }
  539.             }
  540.        
  541.             if (flashIntensity == 255) flashStage1 = false;
  542.             if (flashIntensity == 0) flashTrigger = false;
  543.            
  544.             g.setColor(new Color(255, 255, 255, flashIntensity));
  545.             g.fillRect(0, 0, SpaceInvaders.SIZE.width, SpaceInvaders.SIZE.height);
  546.             g.setColor(Color.LIGHT_GRAY);
  547.            
  548.             if (!flashTrigger) {
  549.                 flashTick = 0;
  550.                 flashStage1 = true;
  551.             }
  552.         }
  553.     }
  554.    
  555.     // Draws the tank bullets to the screen
  556.     public static void drawBullet(Graphics g) {
  557.         // Draw "Bullet"
  558.         if (bulletShot) {
  559.             if (!setYPos) {
  560.                 bulletY = SpaceInvaders.SIZE.height - 55;
  561.                 setYPos = true;
  562.             }
  563.            
  564.             if (!setXPos) {
  565.                 bulletX = playerPos + 23;
  566.                 setXPos = true;
  567.             }
  568.        
  569.             // Bullet Model
  570.             g.fillRect(bulletX, bulletY, 4, 6);
  571.            
  572.             if (!bulletHit) {
  573.                 bulletLogic();
  574.             }
  575.            
  576.             if (bulletY > -5) {
  577.                 bulletY -= bulletSpeed;
  578.             } else if (bulletY <= -5) {
  579.                 doesAlign = false;
  580.                 bulletHit = false;
  581.                 setYPos = false;
  582.                 setXPos = false;
  583.                 bulletShot = false;
  584.             }
  585.         }
  586.     }
  587.    
  588.     // Draws the enemy bullet
  589.     public static void drawEnemyBullet(Graphics g) {
  590.         // Draw "Enemy Bullet"
  591.         if (enemyBulletShot) {
  592.             if (!setEnemyYPos) {
  593.                 for(int i = 0; i < enemyLocation.length - 1; i++) {
  594.                     iVal = i;
  595.                     if (playerPos + 23 >= enemyLocation[i] + 5 && playerPos + 23 <= enemyLocation[i + 1] - 30) {
  596.                         if (enemies[i + (4 * gridWidth)]) {
  597.                             enemyBulletY = enemyYPos + (40 * 4) + 23;
  598.                             setEnemyYPos = true;
  599.                             break;
  600.                         } else if (enemies[i + (3 * gridWidth)]) {
  601.                             enemyBulletY = enemyYPos + (40 * 3) + 23;
  602.                             setEnemyYPos = true;
  603.                             break;
  604.                         } else if (enemies[i + (2 * gridWidth)]) {
  605.                             enemyBulletY = enemyYPos + (40 * 2) + 23;
  606.                             setEnemyYPos = true;
  607.                             break;
  608.                         } else if (enemies[i + gridWidth]) {
  609.                             enemyBulletY = enemyYPos + 63;
  610.                             setEnemyYPos = true;
  611.                             break;
  612.                         } else if (enemies[i]) {
  613.                             enemyBulletY = enemyYPos + 23;
  614.                             setEnemyYPos = true;
  615.                             break;
  616.                         }
  617.                     }
  618.                 }
  619.             }
  620.            
  621.             if (!setEnemyXPos) {
  622.                 enemyBulletX = enemyLocation[iVal] + 15;
  623.                 setEnemyXPos = true;
  624.             }
  625.        
  626.             // Bullet Model
  627.             g.fillRect(enemyBulletX, enemyBulletY, 4, 6);
  628.            
  629.             if (!enemyBulletHit) {
  630.                 enemyBulletLogic();
  631.             }
  632.            
  633.             if (enemyBulletY < SpaceInvaders.SIZE.height - 35) {
  634.                 enemyBulletY += bulletSpeed;
  635.             } else if (enemyBulletY >= SpaceInvaders.SIZE.height - 35) {
  636.                 enemyWaitTick = 0;
  637.                 enemyBulletHit = false;
  638.                 setEnemyYPos = false;
  639.                 setEnemyXPos = false;
  640.                 enemyBulletShot = false;
  641.             }
  642.         }
  643.     }
  644.    
  645.     // Check to see if enemy bullet has hit the player
  646.     private static void enemyBulletLogic() {
  647.         if (enemyBulletY >= SpaceInvaders.SIZE.height - 55 && enemyBulletY <= SpaceInvaders.SIZE.height - 35) {
  648.             if (enemyBulletX >= playerPos + 10 && enemyBulletX <= playerPos + 40) {
  649.                 enemyBulletHit = true;
  650.                 enemyBulletY = SpaceInvaders.SIZE.height + 4; // Move the bullet out of the screen area
  651.                 playerPos = 0;
  652.                 scoreChange(SCORE_DEATH, false);
  653.                 dropPicked = false;
  654.                 dropEffectTick = 0;
  655.                 currentLives--;
  656.             }
  657.         }
  658.        
  659.         if (enemyBulletY == bulletY) {
  660.             if (enemyBulletX >= bulletX && enemyBulletX <= bulletX + 3) {
  661.                 enemyBulletY = SpaceInvaders.SIZE.height + 4;
  662.             }
  663.         }
  664.     }
  665.    
  666.     // Checks to see if bullet has hit an enemy and, if it has, destroys the enemy
  667.     public static void bulletLogic() {
  668.         // Determine the position of all the enemies programmatically
  669.        
  670.         // If statement to prevent unnecessary waste of CPU cycles on location calculations
  671.         if (bulletShot) {
  672.             // Defining X Locations for Each Enemy Column
  673.             int i = 0;
  674.            
  675.             for (i = 0; i < enemyLocation.length; i++) {
  676.                 enemyLocation[i] = enemyXPos + (65 * i);
  677.                 if (bulletX >= enemyLocation[i] && bulletX <= enemyLocation[i] + 35) {
  678.                     doesAlign = true;
  679.                     break;
  680.                 }
  681.             }
  682.            
  683.             // Generate Y Locations of enemies and create "bullet collision"
  684.             if (doesAlign && i != 11) {
  685.                 if (enemies[i + (4 * gridWidth)] && bulletY <= (enemyYPos + 10) + (40 * 4)) {
  686.                     enemies[i + (4 * gridWidth)] = false;
  687.                     bulletHit = true;
  688.                     scoreChange(SCORE_ENEMY, true);
  689.                     bulletY = -4;
  690.                 } else if (!bulletHit && enemies[i + (3 * gridWidth)] && bulletY <= (enemyYPos + 10) + (40 * 3)) {
  691.                     enemies[i + (3 * gridWidth)] = false;
  692.                     bulletHit = true;
  693.                     scoreChange(SCORE_ENEMY, true);
  694.                     bulletY = -4;
  695.                 } else if (!bulletHit && enemies[i + (2 * gridWidth)] && bulletY <= (enemyYPos + 10) + (40 * 2)) {
  696.                     enemies[i + (2 * gridWidth)] = false;
  697.                     bulletHit = true;
  698.                     scoreChange(SCORE_ENEMY, true);
  699.                     bulletY = -4;
  700.                 } else if (!bulletHit && enemies[i + gridWidth] && bulletY <= (enemyYPos + 10) + 40) {
  701.                     enemies[i + gridWidth] = false;
  702.                     bulletHit = true;
  703.                     scoreChange(SCORE_ENEMY, true);
  704.                     bulletY = -4;
  705.                 } else if (!bulletHit && enemies[i] && bulletY <= enemyYPos + 10) {
  706.                     enemies[i] = false;
  707.                     bulletHit = true;
  708.                     scoreChange(SCORE_ENEMY, true);
  709.                     bulletY = -4;
  710.                 }
  711.             }
  712.            
  713.             // Create "bullet collision" for Bonus Ship - Trigger Bonus Drop
  714.             if (bonusAlign && bulletY <= 30 && !bulletHit) {
  715.                 bonusX = SpaceInvaders.SIZE.width + 31;
  716.                 bulletY = -4;
  717.                 scoreChange(SCORE_BONUS, true);
  718.                 bonusAlign = false;
  719.                
  720.                 dropX = bulletX - 7;
  721.                 bonusDrop = true;
  722.             }
  723.         }
  724.     }
  725.    
  726.     // Checks if there are any living enemies left on stage
  727.     public static void enemyCheck() {
  728.         int enemyCount = 0;
  729.        
  730.         for(int i = 0; i < enemies.length; i++) {
  731.             if (enemies[i]) enemyCount++;
  732.         }
  733.        
  734.         currentEnemies = enemyCount;
  735.         if (enemyCount == 0) clearBoard(true);
  736.     }
  737.    
  738.     // Actions for when keys are pressed
  739.     public static void input() {
  740.         if(!runningTitle && !playerDead) {
  741.             // Player Movement Left
  742.             if (Input.buttons[0]) {
  743.                 if (playerPos > 0) playerPos -= MOVEMENT_SPEED;
  744.             }
  745.            
  746.             // Player Movement Right
  747.             if (Input.buttons[1]) {
  748.                 if (playerPos < SpaceInvaders.SIZE.width - 55) playerPos += MOVEMENT_SPEED;
  749.             }
  750.         }
  751.        
  752.         // Fire
  753.         if (Input.buttons[2]) {
  754.             if (runningTitle) {
  755.                 runningTitle = false;
  756.                 playerDead = false;
  757.             } else if (!runningTitle) {
  758.                 if (!bulletShot && !playerDead) {
  759.                     bulletShot = true;
  760.                 }
  761.             }
  762.         }
  763.        
  764.         // Exit
  765.         if (Input.buttons[3]) System.exit(0);
  766.     }
  767.    
  768.     // Controls Movement of the Enemy Grid
  769.     public static void enemyMove() {
  770.         if (hasFocus) {
  771.             if (enemyTickCounter < enemyMoveDelay) {
  772.                 enemyTickCounter++;
  773.             } else if (enemyTickCounter >= enemyMoveDelay) {
  774.                 if (enemyMoveDir == 1) {
  775.                     if (enemyXPos < maxXDistance) {
  776.                         enemyXPos += enemyXMoveSpeed;
  777.                     } else if (enemyXPos >= maxXDistance) {
  778.                         enemyMoveDir = 0;
  779.                         enemyYPos += enemyYMoveSpeed;
  780.                         enemyMoveDelay -= enemyMoveDelaySub;
  781.                     }
  782.                 } else if (enemyMoveDir == 0) {
  783.                     if (enemyXPos > 0) {
  784.                         enemyXPos -= enemyXMoveSpeed;
  785.                     } else if (enemyXPos <= 0) {
  786.                         enemyMoveDir = 1;
  787.                         enemyYPos += enemyYMoveSpeed;
  788.                         enemyMoveDelay -= enemyMoveDelaySub;
  789.                     }
  790.                 }
  791.                 enemyTickCounter = 0;
  792.             }
  793.             if (enemyYPos >= maxYDistance) clearBoard(false);
  794.         }
  795.        
  796.         // Shoot bullet at player
  797.         if (enemyWaitTick >= 0 && enemyWaitTick <= enemyTimeToWait) {
  798.             enemyWaitTick++;
  799.         } else if (enemyWaitTick >= enemyTimeToWait) {
  800.             enemyWaitTick = -1;
  801.             if(!enemyBulletShot) enemyBulletShot = true;
  802.         }
  803.     }
  804.    
  805.     // Draws the Heads Up Display; Also handles score change animations
  806.     public static void drawHUD(Graphics g) {
  807.         // Lives Display
  808.         int count = 1;
  809.         for(int i = 0; i < maxLives; i++) {
  810.             if (count <= currentLives) {
  811.                 g.setColor(Color.LIGHT_GRAY);
  812.                 g.fillRect(healthHUDpos + healthHUDoffset + 10, 9, 15, 7);
  813.                 g.fillRect(healthHUDpos + healthHUDoffset + 16, 5, 3, 4);
  814.             }
  815.             count++;
  816.             healthHUDoffset -= 20;
  817.         }
  818.         healthHUDoffset = 0;
  819.        
  820.         // Score Display
  821.         g.setColor(Color.LIGHT_GRAY);
  822.         g.drawString("Score: " + score, (SpaceInvaders.SIZE.width / 2) - 40, 15);
  823.        
  824.         // Display the score changing animation
  825.        
  826.         // If we are adding to the score, then display "+SCORE_NUMBER"
  827.         if (scoreAdd) {
  828.             g.drawString("+ " + scoreMod, (SpaceInvaders.SIZE.width / 2) + addXPos, 15);
  829.             addXPosTick++;
  830.             if (addXPosTick < 75 && addXPosTick % 2 == 0) {
  831.                 addXPos += 1;
  832.             } else if (addXPosTick >= 75) {
  833.                 addXPos = 20;
  834.                 addXPosTick = 0;
  835.                 scoreMod = 0;
  836.                 scoreAdd = false;
  837.             }
  838.            
  839.             // For every ten thousand points earned, if the player does not already have ten lives, then award an extra life
  840.             if (scoreLifeCount >= 10000) {
  841.                 scoreLifeCount = 0;
  842.                 if (currentLives < maxLives) currentLives += 1;
  843.                 scoreChange(SCORE_LIFE, true);
  844.             }
  845.         // If we are subtracting from the score, then display "-SCORE_NUMBER"
  846.         } else if (scoreSub) {
  847.             g.drawString("- " + scoreMod, (SpaceInvaders.SIZE.width / 2) + subXPos, 15);
  848.             subXPosTick++;
  849.             if (subXPosTick < 75 && subXPosTick % 2 == 0) {
  850.                 subXPos += 1;
  851.             } else if (subXPosTick >= 75) {
  852.                 subXPos = 20;
  853.                 subXPosTick = 0;
  854.                 scoreMod = 0;
  855.                 scoreSub = false;
  856.             }
  857.         }
  858.     }
  859.    
  860.     // Change the Score
  861.     public static void scoreChange (int scoreNew, boolean addToScore) {
  862.         if (addToScore) {
  863.             scoreMod = scoreNew;
  864.             score += scoreMod;
  865.             scoreLifeCount += scoreMod;
  866.             scoreAdd = true;
  867.         } else if (!addToScore) {
  868.             scoreMod = scoreNew;
  869.             if (score >= scoreMod) {
  870.                 score -= scoreMod;
  871.             } else if (score < scoreMod) {
  872.                 score = 0; // Prevent Negative Score
  873.             }
  874.             // Losing points will also subtract from the point counter for earning an extra life
  875.             if (scoreLifeCount >= 250) scoreLifeCount -= scoreMod;
  876.             scoreSub = true;
  877.         }
  878.     }
  879.    
  880.     // "Reset" Method. Called when the game is won or lost.
  881.     public static void clearBoard(boolean win) {
  882.         // Wait 500 ticks before resetting the board
  883.        
  884.         if (!win) playerDead = true;
  885.        
  886.         if (clearBoardTick < 1000) {
  887.             clearBoardTick++;
  888.         } else if (clearBoardTick >= 1000) {
  889.             clearBoardTick = 0;
  890.            
  891.             // Reset
  892.             isNewBoard = true;
  893.            
  894.             enemyMoveDir = 1;
  895.             enemyXPos = 30;
  896.             enemyYPos = 40;
  897.             enemyTickCounter = 0;
  898.            
  899.             enemyMoveDelay = 500;
  900.            
  901.             /* If player has beat a level, then 'win' will evaluate to true. When this happens, the
  902.              * level counter goes up. If the player did not beat a level, then the game resets to
  903.              * it's starting variables. */
  904.             if (win) {
  905.                 level++;
  906.                 if (enemyTimeToWait > 25) {
  907.                     enemyTimeToWait -= 25; // Make the time between enemy bullets less with each level advance
  908.                 } else {
  909.                     enemyTimeToWait = 0;
  910.                 }
  911.             } else if (!win) {
  912.                 currentLives = 3;
  913.                 level = 1;
  914.                 score = 0;
  915.                 bonusTickCount = 0;
  916.                 runningTitle = true;
  917.             }
  918.         }
  919.     }
  920. }
  921.  
  922. // ***END_OF_CLASS***
Advertisement
Add Comment
Please, Sign In to add comment