Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

¡Ataque OVNI!

Componentes y suministros

Arduino UNO
× 1
MAX7219 Módulo de matriz de puntos 4 en una pantalla
× 1
Conector macho de rosca y tuerca DB9-G1-01 Terminal de 9 clavijas Tablero de ruptura
× 1
Transistor de uso general NPN
× 1
Breadboard (genérico)
× 1
Zumbador piezoeléctrico pasivo Adafruit
× 1
Cables de puente macho / hembra
× 5
Cables de puente (genéricos)
× 10
Resistencia 1k ohm
× 1
Joystick compatible con Atari de 9 pines
× 1

Acerca de este proyecto

Construí este juego usando un Arduino UNO, un conjunto "4 en 1" de matrices MAXX7219 y componentes de un Arduino Starter Kit.

El código fue escrito por mí y utilizó las bibliotecas Max72xxPanel, Adafruit GFX y SPI.

¡Pruébalo y destruye algunos ovnis! :-)

Cada nivel tiene un número objetivo de ovnis para matar antes de que aparezca el jefe.

El juego necesita un joystick de 9 pines compatible con Atari. Entonces, si tiene uno viejo por ahí, puede volver a usarlo. O puedes hacer el tuyo propio. Estoy trabajando para convertir esto en una computadora de mano en futuras versiones.

Código

  • Código de ataque OVNI
Código de ataque OVNI C / C ++
 / * ¡ATAQUE OVNI! - Escrito por Anthony Clarke. * // * Algunas líneas de código específicas fueron extraídas de programas de ejemplo de código abierto. Estos están etiquetados en los comentarios. * / # Include  #include  #include  const int pinCS =10; // Conecte CS a este pin, DIN a MOSI y CLK a SCK (cf http://arduino.cc/en/Reference/SPI) const int numberOfHorizontalDisplays =4; const int numberOfVerticalDisplays =1; Max72xxPanel matrix =Max72xxPanel (pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); // 'enviar', 8x8pxconst unsigned char ship [] PROGMEM ={0x80, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // 'UFO', 8x8pxconst unsigned char ufo ={0x40, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // 'explosión', 8x8pxconst unsigned char explosion [] PROGMEM ={0xe0, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00}; // 'Bouncer', 8x8pxconst unsigned char bouncer [] PROGMEM ={0x60, 0xc0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00}; // 'Boss1', 8x8pxconst unsigned char boss [] PROGMEM ={0x18, 0x24, 0x42, 0xff, 0x24, 0xff, 0x7e, 0x3c}; // 'Faller', 8x8pxconst unsigned char faller [] PROGMEM ={0x80, 0xc0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00}; // ' Elevador ', elevador de caracteres sin firmar 8x8pxconst [] PROGMEM ={0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00}; // 'LT', 8x8pxconst unsigned char LT [] PROGMEM ={0x78, 0xfc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00}; // 'UFO láser', 8x8pxconst unsigned char ufoLaser [] PROGMEM ={0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // 'BossBoom', 8x8pxconst unsigned char bossBoom1 [] PROGMEM ={0xaa, 0x55, 0xa2, 0x51, 0x8a, 0x45, , 0x55}; // 'BossBoom2', 8x8pxconst unsigned char bossBoom2 [] PROGMEM ={0x55, 0xaa, 0x45, 0x8a, 0x51, 0xa2, 0x55, 0xaa}; // Juego iniciado variablebool gameStart =false; // Definición del control del joystick pinsint up =2; int down =3; int left =4; int right =5; int trigger =6; // Variables de ticker de título ... Robado sin escrúpulos del ejemplo de ticker:PString tape ="UFO ATTACK! - Presione fuego para comenzar "; int esperar =40; // En milisegundos, int espaciador =1; int ancho =5 + espaciador; // El ancho de la fuente es de 5 píxeles // Variables de posición del barco y del láser int shipx =0; int shipy =0; int lasx; int lasy; // Vive counterint lives =5; // laser existense variablebool lasExist; // UFO laser position variablesint ufoLas1x; int ufoLas1y; int ufoLas2x; int ufoLas2y; int ufoLas3x; int ufoLas3y; int ufoLas4x; int ufoLas4; // Variable de existencia de láser OVNI bool ufoLasExist1 =falso; bool ufoLasExist2 =falso; bool ufoLasExist3 =falso; bool ufoLasExist4 =falso; // Selección de láser de OVNI variableint selection; int lastSelection; // Variable de selección de Boss Minionint minionSelection; // Variables de posición de UFOint ufo1x; int ufo1y; int ufo2x; int ufo2y; int ufo3x; int ufo3y; // Variables de posición de bouncerint bouncer1x; int bouncer1y; int bouncer2x; int bouncer2y; int bouncer3x; int bouncer3y; int bouncer4x; int variables de posición de faller4y faller1x; int faller1y; int faller2x; int faller2y; int faller3x; int faller3y; int faller4x; i nt faller4y; // Variables de velocidad de Fallerint faller1Speedx; int faller1Speedy; int faller2Speedx; int faller2Speedy; int faller3Speedx; int faller3Speedy; int faller4Speedx; int faller4Speed; int fallerxSpeedTargetRisserint1; int riser2x; int riser2y; int riser3x; int riser3y; int riser4x; int riser4y; // Variables de velocidad del elevadorint riser1Speedx; int riser1Speedy; int riser2Speedx; int riser2Speedy; int riser3Speedx; int riser3Speed4 intpeedx; // riser3Speedxer4; int riser4 position variableint ltx; int lty; // LT health variableint ltHealth =3; // LT speed variableint ltxSpeed ​​=0; int ltxSpeedTarget =2; // Boss position variableint bossx =34; int mandón =0; // Variables de velocidad de movimiento del jefeint bossxSpeed ​​=0; int bossySpeed ​​=0; int bossxSpeedTarget =3; int bossySpeedTarget =1; // Variables de existencia de ovnis bool ufo1Exist =false; bool ufo2Exist =false; bool ufo3Exist =false; // Variables de existencia de Bouncer false; bool faller2Exist =false; bool faller3Exist =false; bool faller4Exist =false; // Variables de existencia de Riserbool riser1Exist =false; bool riser2Exist =false; bool riser3Exist =false; bool riser4Exist =false; // LT variable de existenciabool ltExist =false; // Variable de existencia del jefe1; int bouncer1xSpeed; int bouncer2xSpeed; int bouncer3xSpeed; int bouncer4xSpeed; int bouncer1ySpeed; int bouncer2ySpeed; int bouncer3ySpeed; int bouncer4ySpeed; int ySpee d =1; int xSpeed ​​=2; // temporizador de generación y variables de tiempo de generación para enemigos ovniunsigned long startTime; // configuración de variables de temporizadorunsigned long currentTime; unsigned long spawnTime =3000; // Temporizador de generación para ovnis // Temporizador de generación y tiempo de generación para enemigos gorilaunsigned long startTime2; unsigned long currentTime2; unsigned long spawnTime2 =10000; // Temporizador de generación para porteros // Temporizador de generación para LT mini bossunsigned long startTime3; unsigned long currentTime3; unsigned long spawnTime3; // Temporizador de generación para LT // Temporizador de generación para láseres ovniunsigned long bossStartTime; unsigned long bossCurrentTime; unsigned long bossStartTime2; unsigned long bossCurrentTime2; unsigned long bossLaserTimer =1000; unsigned long bossMinionTimer =6000; // Variable habilitadora de generación, necesaria para detener temporalmente spawning for boss battlebool spawnEnabled; // Variable de nivelint levelNumber =1; // Score variableint score =0; // Variables de progresión de nivelint kills; int killsTarget; // Batalla de jefe comprometida variablebool bossBattleStarted =false; // Detección de colisión de barco del jugador variablebool collisionDetection =true; // Lanzamiento de moneda para UFOLaser 4 selectionint coinFlip; // Variables de sonidoint buzzerPin =9; // Variables de sirena de jefefloat sinVal; // Definir una variable para guardar el valor del seno int toneVal; // Defina una variable para guardar la frecuencia del sonido void setup () {//Serial.begin(9600); // Configurando pin de sonido pinMode (buzzerPin, OUTPUT); // Establecer el pin del zumbador en el modo de salida // configurar spawntimers // configurar los modos de pin para el funcionamiento del joystick pinMode (up, INPUT_PULLUP); // UP pin pinMode (abajo, INPUT_PULLUP); // pin ABAJO pinMode (izquierda, INPUT_PULLUP); // pin IZQUIERDO pinMode (derecho, INPUT_PULLUP); // pin DERECHO pinMode (disparador, INPUT_PULLUP); // PIN de FUEGO // configuración de la intensidad del led matrix.setIntensity (0); // Ajústelo a sus propias necesidades matrix.setPosition (0, 3, 0); // La primera pantalla está en <0, 0> matrix.setPosition (1, 2, 0); // La segunda pantalla está en <1, 0> matrix.setPosition (2, 1, 0); // La tercera pantalla está en <2, 0> matrix.setPosition (3, 0, 0); // Y la última pantalla está en <3, 0> // ... matrix.setRotation (0, 3); // La primera pantalla es la posición al revés matrix.setRotation (1, 3); matrix.setRotation (2, 3); matrix.setRotation (3, 3); // Lo mismo se mantiene para la última visualización matrix.fillScreen (LOW);} void loop () {if (gameStart ==false) {Ticker (true); } SpawnTimer (); JoystickControl (); UfoControl (); BouncerControl (); LaserControl (); ScreenLimit (); BossBattle (); BossControl (); UFOLaserControl (); LTControl (); FallerControl (); RiserControl (); ShipCollision (); //Serial.println(ufoLas1x); matrix.write (); // dibuja el retardo de la pantalla (50); // velocidad del retardo matrix.fillScreen (LOW); // limpia la pantalla, se debe hacer en cada fotograma. } Void Level (int level) {if (level ==1) {spawnEnabled =true; // Habilitar spawnTime =3000; // Temporizador de generación para UFO'a spawnTime2 =10000000; // El temporizador de generación de los gorilas está tan alto que nunca aparecerán spawnTime3 =10000000; // El temporizador de generación de LT está tan alto que nunca aparecerán killsTarget =10; // Establece el objetivo de matar. Cuando se alcanza el objetivo, el jefe debe aparecer bossHealth =10; bossLaserTimer =1000; } if (nivel ==2) {spawnEnabled =true; spawnTime =3000; spawnTime2 =8000; spawnTime3 =10000000; killsTarget =20; bossHealth =15; bossLaserTimer =900; } if (nivel ==3) {spawnEnabled =true; spawnTime =2000; spawnTime2 =6000; spawnTime3 =8000; killsTarget =30; bossHealth =20; bossLaserTimer =800; } if (nivel ==4) {spawnEnabled =true; spawnTime =2000; spawnTime2 =5000; spawnTime3 =7000; killsTarget =40; bossHealth =25; bossLaserTimer =700; bossMinionTimer =6000; } if (nivel ==5) {spawnEnabled =true; spawnTime =1800; spawnTime2 =4500; spawnTime3 =6000; killsTarget =50; bossHealth =30; bossLaserTimer =600; bossMinionTimer =5500; } if (nivel ==6) {spawnEnabled =true; spawnTime =2000; spawnTime2 =5000; spawnTime3 =7000; killsTarget =60; bossHealth =35; bossLaserTimer =500; bossMinionTimer =5000; } if (nivel ==7) {spawnEnabled =true; spawnTime =2000; spawnTime2 =5000; spawnTime3 =7000; killsTarget =70; bossHealth =40; bossLaserTimer =400; bossMinionTimer =4000; } if (nivel ==8) {spawnEnabled =true; spawnTime =2000; spawnTime2 =5000; spawnTime3 =7000; killsTarget =80; bossHealth =45; bossLaserTimer =300; bossMinionTimer =3000; } if (nivel ==9) {spawnEnabled =true; spawnTime =2000; spawnTime2 =5000; spawnTime3 =7000; killsTarget =90; bossHealth =50; bossLaserTimer =200; bossMinionTimer =2000; } if (nivel ==10) {spawnEnabled =true; spawnTime =2000; spawnTime2 =5000; spawnTime3 =7000; killsTarget =100; bossHealth =55; bossLaserTimer =100; bossMinionTimer =1000; } // Necesito añadir un mensaje de felicitación por superar el nivel 10} void Ticker (bool resetKills) // Código de teletipo robado descaradamente del ejemplo de Ticker. Se usa para Título y puntuación y fin de juego {while (gameStart ==false) {for (int i =0; i  =0 &&letra> =0) {if (letra  29) {barcox =29; } if (shipy <0) {shipy =0; } if (shipy> 6) {shipy =6; } if (lasExist ==true) // Cuando desaparece de la pantalla, deja de dibujarlo y márcalo como no existente {if (lasx> 31) {lasExist =false; } if (lasy <0) {lasy =0; } if (lasy> 7) {lasy =7; }} // El límite de la pantalla láser OVNI controla if (ufoLas1x <-2) {ufoLasExist1 =false; } si (ufoLas2x <-2) {ufoLasExist2 =falso; } if (ufoLas3x <-2) {ufoLasExist3 =falso; } if (ufoLas4x <-2) {ufoLasExist4 =falso; } // Controles de límite de pantalla OVNI. Reaparecen automáticamente ovnis en una coordenada Y aleatoria en el lado derecho si se salen del lado izquierdo if (ufo1Exist ==true &&ufo1x <-3) {ufo1x =33; // si el OVNI se sale del lado izquierdo, se mueve nuevamente al lado derecho ufo1y =random (0,7); // va a necesitar algún tipo de código de clasificación para detener la superposición de ovnis} if (ufo2Exist ==true &&ufo2x <-3) {ufo2x =33; // si el OVNI se sale del lado izquierdo, se mueve nuevamente al lado derecho ufo2y =random (0,7); // va a necesitar algún tipo de código de clasificación para detener la superposición de ovnis} if (ufo3Exist ==true &&ufo3x <-3) {ufo3x =33; // si el OVNI se sale del lado izquierdo, se mueve nuevamente al lado derecho ufo3y =random (0,7); // va a necesitar algún tipo de código de clasificación para detener la superposición de ovnis} // controles de límite de la pantalla de rebote. Cuando los gorilas golpean la parte superior o inferior, la variable de dirección cambia. Cuando están fuera de la izquierda, se borran de la existencia y reaparecen en un momento posterior. if (bouncer1Exist ==true &&bouncer1y> 5) {bouncer1Direction =false; } else if (bouncer1Exist ==true &&bouncer1y <0) {bouncer1Direction =true; } if (bouncer2Exist ==true &&bouncer2y> 5) {bouncer2Direction =false; } else if (bouncer2Exist ==true &&bouncer2y <0) {bouncer2Direction =true; } if (bouncer3Exist ==true &&bouncer3y> 5) {bouncer3Direction =false; } else if (bouncer3Exist ==true &&bouncer3y <0) {bouncer3Direction =true; } if (bouncer4Exist ==true &&bouncer4y> 5) {bouncer4Direction =false; } else if (bouncer4Exist ==true &&bouncer4y <0) {bouncer4Direction =true; } // Si los gorilas se salen del lado izquierdo, desaparecen como desaparecidos if (bouncer1x <0) {bouncer1Exist =false; } if (bouncer2x <0) {bouncer2Exist =false; } if (bouncer3x <0) {bouncer3Exist =false; } if (bouncer4x <0) {bouncer4Exist =false; } // Control de límite de pantalla LT if (ltExist ==true &<x <-6) {ltx =33; // si LT se sale del lado izquierdo, se mueve nuevamente al lado derecho lty =random (0,6); } // Controles de límite de pantalla para Risers if (faller1Exist ==true &&faller1y> 7) {faller1Exist =false; } if (faller2Exist ==verdadero &&faller2y> 7) {faller2Exist =falso; } if (faller3Exist ==verdadero &&faller3y> 7) {faller3Exist =falso; } if (faller4Exist ==verdadero &&faller4y> 7) {faller4Exist =falso; } // Controles de límite de pantalla para Risers if (riser1Exist ==true &&riser1y <-2) {riser1Exist =false; } if (riser2Exist ==true &&riser2y <-2) {riser2Exist =false; } if (riser3Exist ==true &&riser3y <-2) {riser3Exist =false; } if (riser4Exist ==true &&riser4y <-2) {riser4Exist =false; } }void SpawnTimer(){ if (spawnEnabled ==true) { //Counting spawn timer currentTime =millis(); //get the current time in milliseconds currentTime2 =millis();//same again for second timer currentTime3 =millis();//and again if (currentTime - startTime>=spawnTime) //Uses the currentTime, startTime and spawnTime variables to spawn enemies on set times { //spawn UFO SpawnUFO(); //reset timer startTime =currentTime; //Saves the start time of the spawn so the if statement works } if (currentTime2 - startTime2>=spawnTime2) { //spawn bouncer squad SpawnBouncer(); //reset timer startTime2 =currentTime2; //Saves the start time of the spawn so the if statement works } if (currentTime3 - startTime3>=spawnTime3) { //spawn LT SpawnLT(); //reset timer startTime3 =currentTime3; //Saves the start time of the spawn so the if statement works } } }void SpawnUFO(){ if (ufo1Exist ==false) { ufo1x =32; //Spawn off the right side of the screen ufo1y =random(0,7); //Spawn at a random Y coord ufo1Exist =true; } else if (ufo2Exist ==false) { ufo2x =32; //Spawn off the right side of the screen ufo2y =random(0,7); //Spawn at a random Y coord ufo2Exist =true; } else if (ufo3Exist ==false) { ufo3x =32; //Spawn off the right side of the screen ufo3y =random(0,7); //Spawn at a random Y coord ufo3Exist =true; } }void UfoControl(){ //If the UFO exists then draw its bitmap if (ufo1Exist ==true) { ufo1x--; matrix.drawBitmap(ufo1x,ufo1y,ufo,3,2,1); } if (ufo2Exist ==true) { ufo2x--; matrix.drawBitmap(ufo2x,ufo2y,ufo,3,2,1); } if (ufo3Exist ==true) { ufo3x--; matrix.drawBitmap(ufo3x,ufo3y,ufo,3,2,1); }}void SpawnBouncer(){ if (bouncer1Exist ==false &&bouncer2Exist ==false &&bouncer3Exist ==false &&bouncer4Exist ==false) { bouncer1x =32; //Spawn off the right side of the screen bouncer2x =bouncer1x+bouncerGap;//spawn other bouncers spaced out on the x axis bouncer3x =bouncer2x+bouncerGap; bouncer4x =bouncer3x+bouncerGap; bouncerOrigin =random(0,2); if (bouncerOrigin =0) { bouncer1y =0; //Spawn at top of screen bouncer2y =1; bouncer3y =2; bouncer4y =3; } if (bouncerOrigin =1) { bouncer1y =7; //Spawn at bottom bouncer2y =6; bouncer3y =5; bouncer4y =4; } bouncer1Exist =true; bouncer2Exist =true; bouncer3Exist =true; bouncer4Exist =true; }}void BouncerControl(){ //Bouncer move across to the left and up or down depending opn direction variable. That variable is changed in ScreenLimit() if (bouncer1Exist ==true) //If bouncer exists then increment bouncer x and y counters. These are used to slow the movement. { bouncer1xSpeed++; bouncer1ySpeed++; if (bouncer1xSpeed> xSpeed) //When the counter goes above the speed value then IF statement executes { bouncer1x--; bouncer1xSpeed =0; } if (bouncer1Direction ==true) { if (bouncer1ySpeed> ySpeed) { bouncer1y++; bouncer1ySpeed =0; } } else if (bouncer1Direction ==false) { if (bouncer1ySpeed> ySpeed) { bouncer1y--; bouncer1ySpeed =0; } } matrix.drawBitmap(bouncer1x,bouncer1y,bouncer,2,3,1); } if (bouncer2Exist ==true) { bouncer2xSpeed++; bouncer2ySpeed++; if (bouncer2xSpeed> xSpeed) { bouncer2x--; bouncer2xSpeed =0; } if (bouncer2Direction ==true) { if (bouncer2ySpeed> ySpeed) { bouncer2y++; bouncer2ySpeed =0; } } else if (bouncer2Direction ==false) { if (bouncer2ySpeed> 2) { bouncer2y--; bouncer2ySpeed =0; } } matrix.drawBitmap(bouncer2x,bouncer2y,bouncer,2,3,1); } if (bouncer3Exist ==true) { bouncer3xSpeed++; bouncer3ySpeed++; if (bouncer3xSpeed> xSpeed) { bouncer3x--; bouncer3xSpeed =0; } if (bouncer3Direction ==true) { if (bouncer3ySpeed> ySpeed) { bouncer3y++; bouncer3ySpeed =0; } } else if (bouncer3Direction ==false) { if (bouncer3ySpeed> 2) { bouncer3y--; bouncer3ySpeed =0; } } matrix.drawBitmap(bouncer3x,bouncer3y,bouncer,2,3,1); } if (bouncer4Exist ==true) { bouncer4xSpeed++; bouncer4ySpeed++; if (bouncer4xSpeed> xSpeed) { bouncer4x--; bouncer4xSpeed =0; } if (bouncer4Direction ==true) { if (bouncer4ySpeed> 2) { bouncer4y++; bouncer4ySpeed =0; } } else if (bouncer4Direction ==false) { if (bouncer4ySpeed> ySpeed) { bouncer4y--; bouncer4ySpeed =0; } } matrix.drawBitmap(bouncer4x,bouncer4y,bouncer,2,3,1); }}void SpawnFaller(){ if (faller1Exist ==false &&faller2Exist ==false &&faller3Exist ==false &&faller4Exist ==false) { faller1x =15; //Spawn above the boss off the top of the screen faller2x =faller1x+bouncerGap;//spawn other bouncers spaced out on the x axis faller3x =faller2x+bouncerGap; faller4x =faller3x+bouncerGap; faller1y =-1; //Spawn at top of screen faller2y =-2; faller3y =-3; faller4y =-4; faller1Exist =true; faller2Exist =true; faller3Exist =true; faller4Exist =true; }}void FallerControl(){ //Fallers are spawned by the Boss during battle after level 4. Timer for spawning is in the BossControl function. //Control routines for faller 1 if (faller1Exist ==true) //If faller exists then increment fallerSpeed x and y counters. These are used to slow the movement. { faller1Speedx++; faller1Speedy++; if (faller1Speedx> fallerxSpeedTarget) //When the counter goes above the speed value then IF statement executes { faller1x--; faller1Speedx =0; } if (faller1Speedy> fallerySpeedTarget) { faller1y++; faller1Speedy =0; } matrix.drawBitmap(faller1x,faller1y,faller,3,3,1); }// Control routines for faller 2 if (faller2Exist ==true) //If faller exists then increment fallerSpeed x and y counters. These are used to slow the movement. { faller2Speedx++; faller2Speedy++; if (faller2Speedx> fallerxSpeedTarget) //When the counter goes above the speed value then IF statement executes { faller2x--; faller2Speedx =0; } if (faller2Speedy> fallerySpeedTarget) { faller2y++; faller2Speedy =0; } matrix.drawBitmap(faller2x,faller2y,faller,3,3,1); } // Control routines for faller 3 if (faller3Exist ==true) //If faller exists then increment fallerSpeed x and y counters. These are used to slow the movement. { faller3Speedx++; faller3Speedy++; if (faller3Speedx> fallerxSpeedTarget) //When the counter goes above the speed value then IF statement executes { faller3x--; faller3Speedx =0; } if (faller3Speedy> fallerySpeedTarget) { faller3y++; faller3Speedy =0; } matrix.drawBitmap(faller3x,faller3y,faller,3,3,1); } // Control routines for faller 4 if (faller4Exist ==true) //If faller exists then increment fallerSpeed x and y counters. These are used to slow the movement. { faller4Speedx++; faller4Speedy++; if (faller4Speedx> fallerxSpeedTarget) //When the counter goes above the speed value then IF statement executes { faller4x--; faller4Speedx =0; } if (faller4Speedy> fallerySpeedTarget) { faller4y++; faller4Speedy =0; } matrix.drawBitmap(faller4x,faller4y,faller,3,3,1); } }void SpawnRiser(){ if (riser1Exist ==false &&riser2Exist ==false &&riser3Exist ==false &&riser4Exist ==false) { riser1x =15; //Spawn above the boss off the top of the screen riser2x =riser1x+bouncerGap;//spawn other bouncers spaced out on the x axis riser3x =riser2x+bouncerGap; riser4x =riser3x+bouncerGap; riser1y =7; //Spawn at Bottom of screen riser2y =8; riser3y =9; riser4y =10; riser1Exist =true; riser2Exist =true; riser3Exist =true; riser4Exist =true; }}void RiserControl(){ //Risers are spawned by the Boss during battle after level 5. Timer for spawning is in the BossControl function. //Control routines for riser 1 if (riser1Exist ==true) //If riser exists then increment riserSpeed x and y counters. These are used to slow the movement. { riser1Speedx++; riser1Speedy++; if (riser1Speedx> fallerxSpeedTarget) //When the counter goes above the speed value then IF statement executes { riser1x--; riser1Speedx =0; } if (riser1Speedy> fallerySpeedTarget) { riser1y--; riser1Speedy =0; } matrix.drawBitmap(riser1x,riser1y,riser,3,3,1); } //Control routines for riser 2 if (riser2Exist ==true) //If riser exists then increment riserSpeed x and y counters. These are used to slow the movement. { riser2Speedx++; riser2Speedy++; if (riser2Speedx> fallerxSpeedTarget) //When the counter goes above the speed value then IF statement executes { riser2x--; riser2Speedx =0; } if (riser2Speedy> fallerySpeedTarget) { riser2y--; riser2Speedy =0; } matrix.drawBitmap(riser2x,riser2y,riser,3,3,1); } //Control routines for riser 3 if (riser3Exist ==true) //If riser exists then increment riserSpeed x and y counters. These are used to slow the movement. { riser3Speedx++; riser3Speedy++; if (riser3Speedx> fallerxSpeedTarget) //When the counter goes above the speed value then IF statement executes { riser3x--; riser3Speedx =0; } if (riser3Speedy> fallerySpeedTarget) { riser3y--; riser3Speedy =0; } matrix.drawBitmap(riser3x,riser3y,riser,3,3,1); } //Control routines for riser 4 if (riser4Exist ==true) //If riser exists then increment riserSpeed x and y counters. These are used to slow the movement. { riser4Speedx++; riser4Speedy++; if (riser4Speedx> fallerxSpeedTarget) //When the counter goes above the speed value then IF statement executes { riser4x--; riser4Speedx =0; } if (riser4Speedy> fallerySpeedTarget) { riser4y--; riser4Speedy =0; } matrix.drawBitmap(riser4x,riser4y,riser,3,3,1); }}void SpawnLT(){ if (ltExist ==false) { ltx =32; //Spawn off the right side of the screen lty =random(0,6); //Spawn at a random Y coord ltExist =true; }}void LTControl(){ //If the UFO exists then draw its bitmap if (ltExist ==true) { ltxSpeed++; if (ltxSpeed ==ltxSpeedTarget) { ltxSpeed =0; ltx--; } matrix.drawBitmap(ltx, lty, LT, 6, 3, 1); } if (ltHealth <=0) { ltExist =false; Boom(ltx,lty,false,3); //Calls Boom() function to add score. Kills are added manually below. kills=kills+3; ltHealth =3; }}void BossBattle()//Sounds the warning siren then spawns boss. Still need to finish movement{ if (kills> killsTarget &&bossBattleStarted ==false) { bossBattleStarted =true; spawnEnabled =false; //Turns off spawning for other UFO types for(int i =5; i> 0; i--) //Play alarm sound { for (int x =0; x <360; x++) // X from 0 degree->360 degree { sinVal =sin(x * (PI / 180)); // Calculate the sine of x toneVal =2000 + sinVal * 500; // Calculate sound frequency according to the sine of x tone(buzzerPin, toneVal); // Output sound frequency to buzzerPin delay(1); } } tone(buzzerPin, 0, 5); //This is to stop the tone sound. It sticks around otherwise. if (boss1Exist ==false) { matrix.drawBitmap(bossx, bossy, boss, 8 ,8 ,1); boss1Exist =true; bossStartTime =millis(); //Set start timer for boss weapons bossStartTime =millis(); //Set start timer for boss minions } }}void BossControl(){ if (boss1Exist ==true) { bossxSpeed++; if (bossxSpeed> bossxSpeedTarget &&bossx> 24) //When the counter goes above the speed value then IF statement executes { bossx--; //Move the boss x cords to the left bossxSpeed =0; } matrix.drawBitmap(bossx, bossy, boss, 8, 8, 1); //Draw the boss bitmap at the new coords if (bossx ==24) { //Counting shoot timer bossCurrentTime =millis(); //get the current time in milliseconds bossCurrentTime2 =millis(); if (bossCurrentTime - bossStartTime>=bossLaserTimer) //startTimer is set in BossBattle function { //shoot laser selection =random(1,5);//Select laser cannon at random while (selection ==lastSelection)//While loop to ensure that the same laser isnt fired twice in a row too quick. Prevents timing gaps { selection =random(1,5); } UFOLaserShoot(selection);//Call UFOLaserShoot function with cannon selection //reset timer bossStartTime =bossCurrentTime; //Saves the start time of the spawn so the if statement works } if (levelNumber>=4) { if (bossCurrentTime2 - bossStartTime2>=bossMinionTimer) //startTimer is set in BossBattle function { //Select minions and spawn them minionSelection =random(1,3); if (minionSelection ==1) { SpawnFaller(); } if (minionSelection ==2) { SpawnRiser(); } //reset timer bossStartTime2 =bossCurrentTime2; //Saves the start time of the spawn so the if statement works } } } //Boss health counter hits zero, trigger boss death and new level if (bossHealth <=0) { boss1Exist =false; //Boss no longer exists Boom(bossx,bossy,false,5);//Calls Boom() function to add score matrix.fillScreen(LOW); //Clear screen for (int i =5; i> 0; i--) { matrix.drawBitmap(bossx, bossy, bossBoom1 ,8 ,8, 1); //Boss explosion first frame tone(buzzerPin, 100,100); //Play sound delay(200); //Wait //matrix.fillScreen(LOW); //Clear screen matrix.drawBitmap(bossx, bossy, bossBoom2 ,8 ,8, 1); //Boss explosion second frame tone(buzzerPin, 200,100); //Play second sound delay(200); //Wait } tone(buzzerPin, 1, 1);//Stop beep bossx=39; //Move bossx back to 32 matrix.fillScreen(LOW); //clear the screen gameStart =false; //Mark game as stopped levelNumber++; //increment level if (levelNumber> 10) { GameOver(1); regreso; } tape ="Level "; //Prepare new tape for ticker function tape +=levelNumber; //Adding level number to ticker string tape +=" Score:"; tape +=score; ufoLasExist1 =false; ufoLasExist2 =false; ufoLasExist3 =false; ufoLasExist4 =false; faller1Exist =false; faller2Exist =false; faller3Exist =false; faller4Exist =false; riser1Exist =false; riser2Exist =false; riser3Exist =false; riser4Exist =false; ufoLas1x=bossx; ufoLas2x=bossx; ufoLas3x=bossx; ufoLas4x=bossx; Ticker(true); //Call ticker function to show score and new level } }}void UFOLaserShoot(int selection){ if (selection ==1) { if (ufoLasExist1 ==false)//Check to see if the UFO laser already exists { ufoLas1x=bossx+1; //spawn laser in the middle ufoLas1y=bossy+4; ufoLasExist1=true; tone(buzzerPin, 200,100);//play laser sound } } if (selection ==2) { if (ufoLasExist2 ==false) { ufoLas2x=bossx+2; //spawn laser at the top side ufoLas2y=bossy+1; ufoLasExist2=true; tone(buzzerPin, 300,100);//play laser sound } } if (selection ==3) { if (ufoLasExist3 ==false) { ufoLas3x=bossx+2; //spawn laser at the bottom side ufoLas3y=bossy+7; ufoLasExist3=true; tone(buzzerPin, 400,100);//play laser sound } } if (selection ==4) { if (ufoLasExist4 ==false)//Planning to make this one random { coinFlip =random(0,2); if (coinFlip ==0) { ufoLas4x=bossx+2; ufoLas4y=bossy+2; ufoLasExist4=true; tone(buzzerPin, 500,100);//play laser sound } if (coinFlip ==1) { ufoLas4x=bossx+2; ufoLas4y=bossy+6; ufoLasExist4=true; tone(buzzerPin, 500,100);//play laser sound } } } }void UFOLaserControl(){ if (ufoLasExist1 ==true) { ufoLas1x--; matrix.drawBitmap(ufoLas1x, ufoLas1y, ufoLaser, 2, 1, 1); } if (ufoLasExist2 ==true) { ufoLas2x--; matrix.drawBitmap(ufoLas2x, ufoLas2y, ufoLaser, 2, 1, 1); } if (ufoLasExist3 ==true) { ufoLas3x--; matrix.drawBitmap(ufoLas3x, ufoLas3y, ufoLaser, 2, 1, 1); } if (ufoLasExist4 ==true) { ufoLas4x--; matrix.drawBitmap(ufoLas4x, ufoLas4y, ufoLaser, 2, 1, 1); } }void ShipCollision(){ if (gameStart ==true &&collisionDetection ==true) { //Collision detection for line 0 of ship //Collision detection for UFO1. Dont need line 0 of UFO because line 0 of ship cannot touch it anyway. if (ufo1Exist ==true) { for (int a =0; a <2; a++) { if (shipx ==ufo1x+a &&shipy ==ufo1y+1) ///Line 1 { ShipHit(); } } //Collision detection for line 1 of ship.................. //Contains extra for loop to loop through all the ship line 1 pixels //Collision detection for UFO1 for (int b =0; b <1; b++) //Had b <2 and the collision detection worked but looked wonky when moving towards ufos { for (int a =0; a <2; a++) { if (shipx+b ==ufo1x+a &&shipy+1 ==ufo1y+1) //Line 1 { ShipHit(); } } for (int a =1; a <3; a++) { if (shipx+b ==ufo1x+a &&shipy+1 ==ufo1y) //Line 0 { ShipHit(); } } } } //Collision detection for line 0 of ship //collision detection for UFO2 if (ufo2Exist ==true) { for (int a =0; a <2; a++) { if (shipx ==ufo2x+a &&shipy ==ufo2y+1) ///Line 1 { ShipHit(); } } //Collision detection for line 1 of ship //Collision detection for UFO2 for (int b =0; b <1; b++) { for (int a =0; a <2; a++) { if (shipx+b ==ufo2x+a &&shipy+1 ==ufo2y+1) //Line 1 { ShipHit(); } } for (int a =1; a <3; a++) { if (shipx+b ==ufo2x+a &&shipy+1 ==ufo2y) //Line 0 { ShipHit(); } } } } //Collision detection for line 0 of ship //Collision detection for UFO3 if (ufo3Exist ==true) { for (int a =0; a <2; a++) { if (shipx ==ufo3x+a &&shipy ==ufo3y+1) ///Line 1 { ShipHit(); } } //Contains extra for loop to loop through all the ship line 1 pixels //Collision detection for UFO3 for (int b =0; b <1; b++) { for (int a =0; a <2; a++) { if (shipx+b ==ufo3x+a &&shipy+1 ==ufo3y+1) //Line 1 { ShipHit(); } } for (int a =1; a <3; a++) { if (shipx+b ==ufo3x+a &&shipy+1 ==ufo3y) //Line 0 { ShipHit(); } } } } //Collision detection for line 0 of ship //Collision detection for Bouncer1. Don't need line 0 and 1 becuase line 0 and 1 of bouncers and line 0 of ship never meet if (bouncer1Exist ==true) { for (int a =1; a <2; a++) { if (shipx ==bouncer1x+a &&shipy ==bouncer1y+2) //Line 2 { ShipHit(); } } //Collision detection for Bouncer1 and Line 1 of ship for (int b =0; b <1; b++) { for (int a =1; a <2; a++) { if (shipx+b ==bouncer1x+a &&shipy+1 ==bouncer1y) //Line 0 { ShipHit(); } } for (int a =0; a <2; a++) { if (shipx+b ==bouncer1x+a &&shipy+1 ==bouncer1y+1) //Line 1 { ShipHit(); } } for (int a =1; a <2; a++) { if (shipx+b ==bouncer1x+a &&shipy+1 ==bouncer1y+2) //Line 2 { ShipHit(); } } } } //Collision detection for line 0 of ship //Collision detection for Bouncer2. Don't need line 0 and 1 because line 0 and 1 of bouncers and line 0 of ship never meet if (bouncer2Exist ==true) { for (int a =1; a <2; a++) { if (shipx ==bouncer2x+a &&shipy ==bouncer2y+2) //Line 2 { ShipHit(); } } //Collision detection for Bouncer2 and Line 1 of ship for (int b =0; b <1; b++) { for (int a =1; a <2; a++) { if (shipx+b ==bouncer2x+a &&shipy+1 ==bouncer2y) //Line 0 { ShipHit(); } } for (int a =0; a <2; a++) { if (shipx+b ==bouncer2x+a &&shipy+1 ==bouncer2y+1) //Line 1 { ShipHit(); } } for (int a =1; a <2; a++) { if (shipx+b ==bouncer2x+a &&shipy+1 ==bouncer2y+2) //Line 2 { ShipHit(); } } } } //Collision detection for line 0 of ship //Collision detection for Bouncer3. Don't need line 0 and 1 becuase line 0 and 1 of bouncers and line 0 of ship never meet if (bouncer3Exist ==true) { for (int a =1; a <2; a++) { if (shipx ==bouncer3x+a &&shipy ==bouncer3y+2) //Line 2 { ShipHit(); } } //Collision detection for Bouncer3 and Line 1 of ship for (int b =0; b <1; b++) { for (int a =1; a <2; a++) { if (shipx+b ==bouncer3x+a &&shipy+1 ==bouncer3y) //Line 0 { ShipHit(); } } for (int a =0; a <2; a++) { if (shipx+b ==bouncer3x+a &&shipy+1 ==bouncer3y+1) //Line 1 { ShipHit(); } } for (int a =1; a <2; a++) { if (shipx+b ==bouncer3x+a &&shipy+1 ==bouncer3y+2) //Line 2 { ShipHit(); } } } } //Collision detection for line 0 of ship //Collision detection for Bouncer4. Don't need line 0 and 1 becuase line 0 and 1 of bouncers and line 0 of ship never meet if (bouncer4Exist ==true) { for (int a =1; a <2; a++) { if (shipx ==bouncer4x+a &&shipy ==bouncer4y+2) //Line 2 { ShipHit(); } } //Collision detection for Bouncer4 and Line 1 of ship for (int b =0; b <1; b++) { for (int a =1; a <2; a++) { if (shipx+b ==bouncer4x+a &&shipy+1 ==bouncer4y) //Line 0 { ShipHit(); } } for (int a =0; a <2; a++) { if (shipx+b ==bouncer4x+a &&shipy+1 ==bouncer4y+1) //Line 1 { ShipHit(); } } for (int a =1; a <2; a++) { if (shipx+b ==bouncer4x+a &&shipy+1 ==bouncer4y+2) //Line 2 { ShipHit(); } } } } //Dont need collision detection for lines 0 and 1 of LT and line 0 of ship because they cant touch anyway//Collision detection routines for LT if (ltExist ==true) { for (int a =2; a <4; a++) //Line 2 { if (shipx ==ltx+a &&shipy ==lty+2) { ShipHit(); } } //Collision detection routines for LT and Ship line 1 for (int b =0; b <2; b++) { for (int a =1; a <4; a++) //Top line 0 { if (shipx+b ==ltx+a &&shipy+1 ==lty) { ShipHit(); } } for (int a =0; a <5; a++) //Line 1 { if (shipx+b ==ltx+a &&shipy+1 ==lty+1) { ShipHit(); } } for (int a =2; a <4; a++) //Line 2 { if (shipx+b ==ltx+a &&shipy+1 ==lty+2) { ShipHit(); } } } } //Dont need collision detection between line 0 of ship and line 0 and 1 of fallers because they will never touch//Collision detection for Faller 1 if (faller1Exist ==true) { for (int a =0; a <3; a++) //Line 2 { if (shipx ==faller1x+a &&shipy ==faller1y+2) //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them. { ShipHit(); } } //Collision detection for Faller 1 and ship line 1 for (int b =0; b <1; b++) { for (int a =0; a <2; a++) //Top Line 0 { if (shipx+b ==faller1x+a &&shipy+1 ==faller1y) { ShipHit(); } } for (int a =0; a <3; a++) //Line 1 { if (shipx+b ==faller1x+a &&shipy+1 ==faller1y+1) { ShipHit(); } } for (int a =0; a <3; a++) //Line 2 { if (shipx+b ==faller1x+a &&shipy+1 ==faller1y+2) { ShipHit(); } } } } //Dont need collision detection between line 0 of ship and line 0 and 1 of fallers because they will never touch //Collision detection for Faller 2 if (faller2Exist ==true) { for (int a =0; a <3; a++) //Line 2 { if (shipx ==faller2x+a &&shipy ==faller2y+2) //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them. { ShipHit(); } } //Collision detection for Faller 2 and ship line 1 for (int b =0; b <1; b++) { for (int a =0; a <2; a++) //Top Line 0 { if (shipx+b ==faller2x+a &&shipy+1 ==faller2y) { ShipHit(); } } for (int a =0; a <3; a++) //Line 1 { if (shipx+b ==faller2x+a &&shipy+1 ==faller2y+1) { ShipHit(); } } for (int a =0; a <3; a++) //Line 2 { if (shipx+b ==faller2x+a &&shipy+1 ==faller2y+2) { ShipHit(); } } } } //Dont need collision detection between line 0 of ship and line 0 and 1 of fallers because they will never touch //Collision detection for Faller 3 if (faller3Exist ==true) { for (int a =0; a <3; a++) //Line 2 { if (shipx ==faller3x+a &&shipy ==faller3y+2) //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them. { ShipHit(); } } //Collision detection for Faller 3 and ship line 1 for (int b =0; b <1; b++) { for (int a =0; a <2; a++) //Top Line 0 { if (shipx+b ==faller3x+a &&shipy+1 ==faller3y) { ShipHit(); } } for (int a =0; a <3; a++) //Line 1 { if (shipx+b ==faller3x+a &&shipy+1 ==faller3y+1) { ShipHit(); } } for (int a =0; a <3; a++) //Line 2 { if (shipx+b ==faller3x+a &&shipy+1 ==faller3y+2) { ShipHit(); } } } } //Dont need collision detection between line 0 of ship and line 0 and 1 of fallers because they will never touch //Collision detection for Faller 4 if (faller4Exist ==true) { for (int a =0; a <3; a++) //Line 2 { if (shipx ==faller4x+a &&shipy ==faller4y+2) //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them. { ShipHit(); } } //Collision detection for Faller 4 and ship line 1 for (int b =0; b <1; b++) { for (int a =0; a <2; a++) //Top Line 0 { if (shipx+b ==faller4x+a &&shipy+1 ==faller4y) { ShipHit(); } } for (int a =0; a <3; a++) //Line 1 { if (shipx+b ==faller4x+a &&shipy+1 ==faller4y+1) { ShipHit(); } } for (int a =0; a <3; a++) //Line 2 { if (shipx+b ==faller4x+a &&shipy+1 ==faller4y+2) { ShipHit(); } } } } //Dont need collision detection between line 0 of ship and lines 0 and 1 of risers because they'll never touch //Collision detection for Riser 1 if (riser1Exist ==true) { for (int a =0; a <1; a++) //Line 2 { if (shipx ==riser1x+a &&shipy ==riser1y+2) //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them. { ShipHit(); } } //Collision detection for Riser 1 and Ship line 1 for (int b =0; b <1; b++) { for (int a =0; a <3; a++) //Top Line 0 { if (shipx+b ==riser1x+a &&shipy+1 ==riser1y) { ShipHit(); } } for (int a =0; a <2; a++) //Line 1 { if (shipx+b ==riser1x+0 &&shipy+1 ==riser1y+1) { ShipHit(); } } for (int a =0; a <1; a++) //Line 2 { if (shipx+b ==riser1x+a &&shipy+1 ==riser1y+2) { ShipHit(); } } } } //Dont need collision detection between line 0 of ship and lines 0 and 1 of risers because they'll never touch //Collision detection for Riser 2 if (riser2Exist ==true) { for (int a =0; a <1; a++) //Line 2 { if (shipx ==riser2x+a &&shipy ==riser2y+2) //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them. { ShipHit(); } } //Collision detection for Riser 2 and Ship line 1 for (int b =0; b <1; b++) { for (int a =0; a <3; a++) //Top Line 0 { if (shipx+b ==riser2x+a &&shipy+1 ==riser2y) { ShipHit(); } } for (int a =0; a <2; a++) //Line 1 { if (shipx+b ==riser2x+0 &&shipy+1 ==riser2y+1) { ShipHit(); } } for (int a =0; a <1; a++) //Line 2 { if (shipx+b ==riser2x+a &&shipy+1 ==riser2y+2) { ShipHit(); } } } } //Dont need collision detection between line 0 of ship and lines 0 and 1 of risers because they'll never touch //Collision detection for Riser 3 if (riser3Exist ==true) { for (int a =0; a <1; a++) //Line 2 { if (shipx ==riser3x+a &&shipy ==riser3y+2) //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them. { ShipHit(); } } //Collision detection for Riser 3 and Ship line 1 for (int b =0; b <1; b++) { for (int a =0; a <3; a++) //Top Line 0 { if (shipx+b ==riser3x+a &&shipy+1 ==riser3y) { ShipHit(); } } for (int a =0; a <2; a++) //Line 1 { if (shipx+b ==riser3x+0 &&shipy+1 ==riser3y+1) { ShipHit(); } } for (int a =0; a <1; a++) //Line 2 { if (shipx+b ==riser3x+a &&shipy+1 ==riser3y+2) { ShipHit(); } } } } //Dont need collision detection between line 0 of ship and lines 0 and 1 of risers because they'll never touch //Collision detection for Riser 4 if (riser4Exist ==true) { for (int a =0; a <1; a++) //Line 2 { if (shipx ==riser4x+a &&shipy ==riser4y+2) //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them. { ShipHit(); } } //Collision detection for Riser 4 and Ship line 1 for (int b =0; b <1; b++) { for (int a =0; a <3; a++) //Top Line 0 { if (shipx+b ==riser4x+a &&shipy+1 ==riser4y) { ShipHit(); } } for (int a =0; a <2; a++) //Line 1 { if (shipx+b ==riser4x+0 &&shipy+1 ==riser4y+1) { ShipHit(); } } for (int a =0; a <1; a++) //Line 2 { if (shipx+b ==riser4x+a &&shipy+1 ==riser4y+2) { ShipHit(); } } } } //No collision detection for line 0 of ship and boss because they'll never touch anyway. //Collision detection for Boss abd Ship line 1 if (boss1Exist ==true) { for (int b =0; b <1; b++) { for (int a =3; a <5; a++ ) //Top line 0 { if (shipx+b ==bossx+a &&shipy+1 ==bossy) { ShipHit(); } } for (int a =2; a <5; a++) //Line 1 { if (shipx+b ==bossx+a &&shipy+1 ==bossy+1) { ShipHit(); } } for (int a =1; a <6; a++) //Line 2 { if (shipx+b ==bossx+a &&shipy+1 ==bossy+2) { ShipHit(); } } for (int a =0; a <7; a++) //Line 3 { if (shipx+b ==bossx+a &&shipy+1 ==bossy+3) { ShipHit(); } } for (int a =2; a <6; a++) //Line 4 { if (shipx+b ==bossx+a &&shipy+1 ==bossy+4) { ShipHit(); } } for (int a =0; a <7; a++) //Line 5 { if (shipx+b ==bossx+a &&shipy+1 ==bossy+5) { ShipHit(); } } for (int a =1; a <6; a++) //Line 6 { if (shipx+b ==bossx+a &&shipy+1 ==bossy+6) { ShipHit(); } } for (int a =2; a <5; a++) //Line 7 { if (shipx+b ==bossx+a &&shipy+1 ==bossy+7) { ShipHit(); } } } } //Collision detection for UFO Lasers. They only have line 0 if (ufoLasExist1 ==true) { for (int a =0; a <1; a++) { if (shipx ==ufoLas1x+a &&shipy ==ufoLas1y) ///Line 0 { ShipHit(); } } for (int b =0; b <1; b++) { for (int a =0; a <1; a++) { if (shipx+b ==ufoLas1x+a &&shipy+1 ==ufoLas1y) ///Line 1 { ShipHit(); } } } } //Collision detection for UFO Lasers. They only have line 0 if (ufoLasExist2 ==true) { for (int a =0; a <1; a++) { if (shipx ==ufoLas2x+a &&shipy ==ufoLas2y) ///Line 0 { ShipHit(); } } for (int b =0; b <1; b++) { for (int a =0; a <1; a++) { if (shipx+b ==ufoLas2x+a &&shipy+1 ==ufoLas2y) ///Line 1 { ShipHit(); } } } } //Collision detection for UFO Lasers. They only have line 0 if (ufoLasExist3 ==true) { for (int a =0; a <1; a++) { if (shipx ==ufoLas3x+a &&shipy ==ufoLas3y) ///Line 0 { ShipHit(); } } for (int b =0; b <1; b++) { for (int a =0; a <1; a++) { if (shipx+b ==ufoLas3x+a &&shipy+1 ==ufoLas3y) ///Line 1 { ShipHit(); } } } } //Collision detection for UFO Lasers. They only have line 0 if (ufoLasExist4 ==true) { for (int a =0; a <1; a++) { if (shipx ==ufoLas4x+a &&shipy ==ufoLas4y) ///Line 0 { ShipHit(); } } for (int b =0; b <1; b++) { for (int a =0; a <1; a++) { if (shipx+b ==ufoLas4x+a &&shipy+1 ==ufoLas4y) ///Line 1 { ShipHit(); } } } } }}void GameOver(int gameStatus){ spawnEnabled =false; if (gameStatus ==0) //Game over due to death { tape ="Game Over :( Your score was "; tape +=score; // Ticker(true); tape ="UFO ATTACK! - Press fire to start "; lives =5; score =0; levelNumber =1; } else if (gameStatus ==1)//Game over due to winning level 10 { tape ="Congratulations! You defeated the alien invasion :) Your total score was "; tape +=score; //Ticker(true); lives =5; score =0; levelNumber =1; } else if (gameStatus ==2)//Life lost { tape ="Ship destroyed! "; tape +="Lives left:"; tape +=lives; } ufo1Exist =false; ufo2Exist =false; ufo3Exist =false; bouncer1Exist =false; bouncer2Exist =false; bouncer3Exist =false; bouncer4Exist =false; faller1Exist =false; faller2Exist =false; faller3Exist =false; faller4Exist =false; riser1Exist =false; riser2Exist =false; riser3Exist =false; riser4Exist =false; ltExist =false; boss1Exist =false; gameStart =false; ufoLasExist1 =false; ufoLasExist2 =false; ufoLasExist3 =false; ufoLasExist4 =false; ufoLas1x =34; ufoLas1y =34; ufoLas2x =34; ufoLas2y =34; ufoLas3x =34; ufoLas3y =34; ufoLas4x =34; ufoLas4y =34; ufo1x =34; ufo2x =34; ufo3x =34; bouncer1x =34; bouncer2x =34; bouncer3x =34; bouncer4x =34; faller1x =34; faller2x =34; faller3x =34; faller4x =34; riser1x =34; riser2x =34; riser3x =34; riser4x =34; ltx =34; bossx =34; shipx =0; shipy =3; lasExist =false; if (gameStatus ==2){ Ticker(false);}else if (gameStatus ==0 || gameStatus ==1){ Ticker(true);}}void ShipHit(){ lives--; for (int i =5000; i> 1; i =i-5) { tone(buzzerPin, i, 1); delay(1); } if (lives> 0) { GameOver(2); } else if (lives <=0) { GameOver(0); }} 

Esquemas

Wiring Schematic for UFO Attack game.

Proceso de manufactura

  1. Dados digitales Arduino
  2. Fuego desde el agua
  3. Arduclock 3D RGB
  4. Mi Río
  5. Iron Man
  6. Juego de joystick
  7. Encuéntrame
  8. Brazo robótico Arduino impreso en 3D
  9. Detector de alcance portátil
  10. Control del humidificador Arduino
  11. Pequeño vagabundo