AsteroidDefender

Dependencies:   4DGL-uLCD-SE DebounceIn mbed

Revision:
0:bbc2ad180020
Child:
1:34bb7c386b9f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Oct 20 02:49:21 2015 +0000
@@ -0,0 +1,202 @@
+#include "mbed.h"
+#include "game.h"
+#include "uLCD_4DGL.h"
+#include <list>
+#include <stdlib.h>
+
+uLCD_4DGL lcd(p28,p27,p29);
+
+DigitalOut myled(LED1);
+Serial pc(USBTX, USBRX);
+AnalogIn sliderh(p17);
+AnalogIn sliderv(p19);
+DigitalIn pb1(p21);
+bool down = false;
+bool lost = false;
+int lives = 2;
+std::list<Missile> missiles;
+std::list<Projectile> projectiles;
+Shooter shooter;
+int counter = 0;
+
+int speed = 128;
+
+void render_missiles() {
+    for(std::list<Missile>::iterator j = missiles.begin(); j != missiles.end(); j++){
+        if(j->moved) {
+            lcd.filled_rectangle(j->old_coord.x, j->old_coord.y, j->old_coord.x + j->size.x, j->old_coord.y + j->size.y, 0x000000);
+        }
+        lcd.filled_rectangle(j->coord.x, j->coord.y, j->coord.x + j->size.x, j->coord.y + j->size.y, 0xFF0000);
+        if(j->coord.y >= 128) {
+            j = missiles.erase(j);
+            lives--;
+            if(lives == 0)
+                lost = true;
+        }
+        else {
+            j->move();
+        }
+    }
+}
+
+void check_collisions() {
+    for(std::list<Projectile>::iterator j = projectiles.begin(); j != projectiles.end(); j++){
+        for(std::list<Missile>::iterator k = missiles.begin(); k != missiles.end(); k++){
+//            if(k->coord.y < (j->coord.y - 6))
+//                continue
+            if( (j->old_coord.x >= k->old_coord.x && j->old_coord.x <= (k->old_coord.x + k->size.x)) || ((j->coord.x + j->size.x) >= k->old_coord.x && (j->old_coord.x + j->size.x) <= (k->old_coord.x + k->size.x)) ){
+                //Now we look at the y axis:
+                if( (j->old_coord.y >= k->old_coord.y && j->old_coord.y <= (k->old_coord.y + k->size.y)) ||
+                ((j->old_coord.y + j->size.y) >= k->old_coord.y && (j->old_coord.y + j->size.y) <= (k->old_coord.y + k->size.y)) ){
+                //The sprites appear to overlap.
+                lcd.filled_rectangle(j->old_coord.x, j->old_coord.y, j->old_coord.x + j->size.x, j->old_coord.y + j->size.y, 0x000000);
+                lcd.filled_rectangle(k->old_coord.x, k->old_coord.y, k->old_coord.x + k->size.x, k->old_coord.y + k->size.y, 0x000000);
+                k = missiles.erase(k);
+                j = projectiles.erase(j);
+    }
+  }
+        }
+    }
+}
+
+void render_shooter() {
+    if(shooter.moved) {
+        lcd.filled_rectangle(shooter.old_coord.x, shooter.old_coord.y, shooter.old_coord.x + shooter.size.x, shooter.old_coord.y + shooter.size.y, 0x000000);
+        shooter.moved = false;
+    }
+    lcd.filled_rectangle(shooter.coord.x, shooter.coord.y, shooter.coord.x + shooter.size.x, shooter.coord.y + shooter.size.y, 0xFF0000);
+}
+
+void render_projectiles() {
+    for(std::list<Projectile>::iterator j = projectiles.begin(); j != projectiles.end(); j++){
+        if(j->moved) {
+            lcd.filled_rectangle(j->old_coord.x, j->old_coord.y, j->old_coord.x + j->size.x, j->old_coord.y + j->size.y, 0x000000);
+        }
+        lcd.filled_rectangle(j->coord.x, j->coord.y, j->coord.x + j->size.x, j->coord.y + j->size.y, 0xFF0000);
+        if(j->coord.y < -4) {
+            j = projectiles.erase(j);
+        }
+        else {
+            j->move();
+        }
+    }
+}
+
+void check_button() {
+    if(pb1 == 0 && !down) {
+        down = true;
+        if(projectiles.size() >= 3) {
+        }
+        else{
+            Projectile bullet1(shooter.coord);
+            projectiles.push_back(bullet1);   
+        }
+    }
+    
+    if(pb1 == 1) {
+        down = false;
+    }
+}
+void render() {
+    if(counter >= 4) {
+        render_missiles();
+        counter = 0;
+    }
+    render_shooter();
+    check_button();
+    render_projectiles();
+    check_collisions(); 
+    counter++;
+}
+
+void shooter_move() {
+    if(sliderh < 0.4) {
+        shooter.old_coord = shooter.coord;
+        if(shooter.coord.x - 4 > 0) {
+            shooter.coord.x -= 4;
+            shooter.moved = true;
+        }
+    }
+    else if(sliderh > 0.6) {
+        shooter.old_coord = shooter.coord;
+        if(shooter.coord.x + 4 < 128) {
+            shooter.coord.x += 4;
+            shooter.moved = true;
+        }
+    }
+//    if(sliderv < 0.4) {
+//        shooter.coord.x -= 0.2;
+//    }
+//    if(sliderv > 0.6) {
+//        shooter.coord.x += 0.2;
+//    }
+}
+
+void create_rocks(int number, int speed) {
+    for(int i = 0; i<number; i++) {
+        vec2 spawn, dest;
+        spawn.x = rand() % 124 + 0;
+        spawn.y = 0;
+        dest.x = rand() % 124 + 0;
+        dest.y = 129;
+        int steps = speed;
+        Missile missile(spawn, dest, steps);
+        missiles.push_back(missile);
+    }
+}
+int main() {
+    pb1.mode(PullUp);
+    pc.baud(9600);
+    lcd.baudrate(3000000);
+    lcd.cls();
+    int counter2 = 0;
+    int rock_number = 5;
+    //lcd.printf("hello");
+    //lcd.filled_rectangle(0, 0, 128, 64.5, 0xFF0000);
+    while(1) {
+        
+        if(lost) {
+            lcd.filled_rectangle(0, 0, 128, 128, 0xFF0000);
+            break;
+        }
+        
+//        vec2 spawn, dest;
+//        spawn.x = rand() % 124 + 0;
+//        spawn.y = 0;
+//        dest.x = rand() % 124 + 0;
+//        dest.y = 129;
+//        int steps = 128;
+//        Missile yolo(spawn, dest, steps);
+//        missiles.push_back(yolo);
+//        spawn.x = rand() % 124 + 0;
+//        spawn.y = 0;
+//        dest.x = 0;
+//        dest.y = 129;
+//        Missile yolo2(spawn, dest, steps);
+//        missiles.push_back(yolo2);
+        
+        //CHANGE TO INCREASE OVER TIME
+        create_rocks(rock_number, speed);
+        //render();
+//        wait(.5);
+        //lcd.cls();
+        //yolo.move();
+        for (int x = 0; x<128000000; x++) {           
+            render();
+            shooter_move();
+            if(missiles.size() == 0) {
+                speed -= 15;
+                if(counter % 2 == 1) {
+                    rock_number += 1;
+                }
+                counter2 += 1;
+                break;
+            }
+            wait(.041);
+        }
+        //lcd.cls();
+        //yolo.move();
+//        render();
+        wait(2.5);
+    }
+}