Helios Lyons 201239214

Dependencies:   mbed

Brief

My aim for this project was to create a FRDM K64F adapted version of the classic Space Invaders by Tomohiro Nishikado. The game itself has a number of clear features to implement;

  • Left to right movement for the player 'canon'
  • A fixed amount of player lives
  • Firing mechanics for both canon and invaders (hence collision systems)
  • Random firing from remaining invaders
  • Wave based combat

My own addition to these established ideas was Boss waves, featuring a single, larger sprite which fires at a faster interval than previous waves. The addition of a movement system using a basic for loop, as opposed to a velocity based system, will enhance the nostalgic feel of the game.

https://os.mbed.com/media/uploads/helioslyons/screenshot_2020-05-27_at_06.12.00.png

Gameplay

Movement is controlled with the joystick, moving the canon left or right. Fire by pressing A. Invaders spawn at set positions, but randomly fire at a set interval, which is higher for boss waves. Time is taken during each wave, and displayed at wave intervals, and if the play wins.

Controls are shown on the Gamepad below: (attribution: Craig A. Evans, ELEC2645 University of Leeds)

https://os.mbed.com/media/uploads/helioslyons/screenshot_2020-05-27_at_06.20.18.png

Committer:
helioslyons
Date:
Wed Apr 22 14:40:39 2020 +0000
Revision:
8:ec4199484adf
Parent:
7:5fe9ac6522c5
Child:
9:6a245c8ce08e
Implementing bullet firing and storing system. Begun menu design with controller options

Who changed what in which revision?

UserRevisionLine numberNew contents of line
helioslyons 4:c644522ff9d9 1 #include "Army.h"
helioslyons 5:72f59786b695 2 #include "Invader.h"
helioslyons 4:c644522ff9d9 3 #include "Bitmap.h"
helioslyons 8:ec4199484adf 4 #include "mbed.h"
helioslyons 8:ec4199484adf 5 #include "N5110.h"
helioslyons 8:ec4199484adf 6 #include "Gamepad.h"
helioslyons 4:c644522ff9d9 7 #include <vector>
helioslyons 4:c644522ff9d9 8
helioslyons 4:c644522ff9d9 9 Army::Army()
helioslyons 4:c644522ff9d9 10 {
helioslyons 6:e3a1bfbb1627 11
helioslyons 4:c644522ff9d9 12 }
helioslyons 6:e3a1bfbb1627 13
helioslyons 4:c644522ff9d9 14 Army::~Army()
helioslyons 4:c644522ff9d9 15 {
helioslyons 6:e3a1bfbb1627 16
helioslyons 4:c644522ff9d9 17 }
helioslyons 6:e3a1bfbb1627 18
helioslyons 4:c644522ff9d9 19 void Army::create_army()
helioslyons 4:c644522ff9d9 20 {
helioslyons 8:ec4199484adf 21 Invader army[3][3];
helioslyons 5:72f59786b695 22
helioslyons 6:e3a1bfbb1627 23 int i, n;
helioslyons 5:72f59786b695 24 for(i=0; i < 4; i++) {
helioslyons 6:e3a1bfbb1627 25 //army[i][.setX(i);
helioslyons 6:e3a1bfbb1627 26
helioslyons 6:e3a1bfbb1627 27 for(n=0; n < 4; n++) {
helioslyons 5:72f59786b695 28 army[i][n].init(i+1, 1);
helioslyons 5:72f59786b695 29 }
helioslyons 6:e3a1bfbb1627 30 }
helioslyons 6:e3a1bfbb1627 31 }
helioslyons 6:e3a1bfbb1627 32
helioslyons 6:e3a1bfbb1627 33 void Army::create_boss()
helioslyons 6:e3a1bfbb1627 34 {
helioslyons 6:e3a1bfbb1627 35 Invader boss;
helioslyons 6:e3a1bfbb1627 36 boss.init(4, 4);
helioslyons 6:e3a1bfbb1627 37 }
helioslyons 6:e3a1bfbb1627 38
helioslyons 6:e3a1bfbb1627 39 void Army::start_pos(int rowX, int rowY)
helioslyons 6:e3a1bfbb1627 40 {
helioslyons 6:e3a1bfbb1627 41 int tempX = rowX;
helioslyons 7:5fe9ac6522c5 42 _move_left = true;
helioslyons 6:e3a1bfbb1627 43
helioslyons 6:e3a1bfbb1627 44 for (int i = 0; i < 4; i++){ // Loop through each row and assign start_pos
helioslyons 6:e3a1bfbb1627 45 army[i][0].set_pos(rowX, rowY); // Based on X and Y inputs
helioslyons 6:e3a1bfbb1627 46 rowX += 13; // 2 above standard Invader width of 11
helioslyons 6:e3a1bfbb1627 47 }
helioslyons 7:5fe9ac6522c5 48 rowX = tempX;
helioslyons 6:e3a1bfbb1627 49 rowY += 10;
helioslyons 6:e3a1bfbb1627 50 for (int i = 0; i < 4; i++){
helioslyons 6:e3a1bfbb1627 51 army[i][1].set_pos(rowX, rowY);
helioslyons 6:e3a1bfbb1627 52 rowX +=13;
helioslyons 6:e3a1bfbb1627 53 }
helioslyons 7:5fe9ac6522c5 54 rowX = tempX;
helioslyons 6:e3a1bfbb1627 55 rowY += 10;
helioslyons 6:e3a1bfbb1627 56 for (int i = 0; i < 4; i++){
helioslyons 6:e3a1bfbb1627 57 army[i][2].set_pos(rowX, rowY);
helioslyons 6:e3a1bfbb1627 58 rowX +=13;
helioslyons 6:e3a1bfbb1627 59 }
helioslyons 6:e3a1bfbb1627 60 }
helioslyons 6:e3a1bfbb1627 61
helioslyons 7:5fe9ac6522c5 62 void Army::move_army(int x_distance, int y_distance) // REPLACE WITH FSM AFTER BASIC FUNCTIONALITY TEST
helioslyons 6:e3a1bfbb1627 63 {
helioslyons 7:5fe9ac6522c5 64 _x_distance = x_distance;
helioslyons 7:5fe9ac6522c5 65 _y_distance = y_distance;
helioslyons 7:5fe9ac6522c5 66
helioslyons 7:5fe9ac6522c5 67 int left_X = 0;
helioslyons 7:5fe9ac6522c5 68 int right_X = 80;
helioslyons 7:5fe9ac6522c5 69 int bot_Y = 0;
helioslyons 7:5fe9ac6522c5 70 int top_Y = 80;
helioslyons 7:5fe9ac6522c5 71
helioslyons 7:5fe9ac6522c5 72 // find leftmost, rightmost, top and bottom invaders
helioslyons 7:5fe9ac6522c5 73 // less invaders means more room to cover (also speed up)
helioslyons 7:5fe9ac6522c5 74
helioslyons 7:5fe9ac6522c5 75 for (int i = 3; i < 0; i--) {
helioslyons 7:5fe9ac6522c5 76 for (int n = 3; n < 0; n--) {
helioslyons 7:5fe9ac6522c5 77 int tempX = army[n][i].get_x_pos();
helioslyons 7:5fe9ac6522c5 78 int tempY = army[n][i].get_y_pos();
helioslyons 7:5fe9ac6522c5 79
helioslyons 7:5fe9ac6522c5 80 if (tempX < left_X) {
helioslyons 7:5fe9ac6522c5 81 left_X = tempX;
helioslyons 7:5fe9ac6522c5 82 }
helioslyons 7:5fe9ac6522c5 83 else if (tempX > right_X) {
helioslyons 7:5fe9ac6522c5 84 right_X = tempX;
helioslyons 7:5fe9ac6522c5 85 }
helioslyons 7:5fe9ac6522c5 86
helioslyons 7:5fe9ac6522c5 87 if (tempY < top_Y) {
helioslyons 7:5fe9ac6522c5 88 top_Y = tempY;
helioslyons 7:5fe9ac6522c5 89 }
helioslyons 7:5fe9ac6522c5 90 else if (tempY > bot_Y) {
helioslyons 7:5fe9ac6522c5 91 bot_Y = tempY;
helioslyons 7:5fe9ac6522c5 92 }
helioslyons 7:5fe9ac6522c5 93 }
helioslyons 7:5fe9ac6522c5 94 }
helioslyons 7:5fe9ac6522c5 95
helioslyons 7:5fe9ac6522c5 96
helioslyons 7:5fe9ac6522c5 97 if (_move_left == true) { // if moving left
helioslyons 7:5fe9ac6522c5 98 if (left_X < 12) { // check if edge will be reached, if so change direction
helioslyons 7:5fe9ac6522c5 99 _move_left = false;
helioslyons 7:5fe9ac6522c5 100 if(bot_Y > 50) {
helioslyons 7:5fe9ac6522c5 101 // if lowest Y point is below 50, move up
helioslyons 7:5fe9ac6522c5 102 for (int i = 3; i < 0; i--) {
helioslyons 7:5fe9ac6522c5 103 for (int n = 3; n < 0; n--) {
helioslyons 7:5fe9ac6522c5 104 army[i][n].set_pos(army[i][n].get_x_pos(), army[i][n].get_y_pos() - _y_distance);
helioslyons 7:5fe9ac6522c5 105 }
helioslyons 7:5fe9ac6522c5 106 }
helioslyons 7:5fe9ac6522c5 107 }
helioslyons 7:5fe9ac6522c5 108 else { // else move down
helioslyons 7:5fe9ac6522c5 109 for (int i = 3; i < 0; i--) {
helioslyons 7:5fe9ac6522c5 110 for (int n = 3; n < 0; n--) {
helioslyons 7:5fe9ac6522c5 111 army[i][n].set_pos(army[i][n].get_x_pos(), army[i][n].get_y_pos() + _y_distance);
helioslyons 7:5fe9ac6522c5 112 }
helioslyons 7:5fe9ac6522c5 113 }
helioslyons 7:5fe9ac6522c5 114 }
helioslyons 7:5fe9ac6522c5 115 }
helioslyons 7:5fe9ac6522c5 116 else { // if edge is not near to being reached, move left
helioslyons 7:5fe9ac6522c5 117 for (int i = 3; i < 0; i--) {
helioslyons 7:5fe9ac6522c5 118 for (int n = 3; n < 0; n--) {
helioslyons 7:5fe9ac6522c5 119 army[i][n].set_pos(army[i][n].get_x_pos() - _x_distance, army[i][n].get_y_pos());
helioslyons 7:5fe9ac6522c5 120 }
helioslyons 7:5fe9ac6522c5 121 }
helioslyons 7:5fe9ac6522c5 122 }
helioslyons 7:5fe9ac6522c5 123 }
helioslyons 7:5fe9ac6522c5 124
helioslyons 7:5fe9ac6522c5 125 else {
helioslyons 7:5fe9ac6522c5 126 if (right_X > 65) { // if rightmost invader is further than X = 65, change direction
helioslyons 7:5fe9ac6522c5 127 _move_left = true;
helioslyons 7:5fe9ac6522c5 128
helioslyons 7:5fe9ac6522c5 129 if (bot_Y > 50) { // if lowest invader is below Y = 50, go up
helioslyons 7:5fe9ac6522c5 130 for (int i = 3; i < 0; i--) {
helioslyons 7:5fe9ac6522c5 131 for (int n = 3; n < 0; n--) {
helioslyons 7:5fe9ac6522c5 132 army[i][n].set_pos(army[i][n].get_x_pos(), army[i][n].get_y_pos() - _y_distance);
helioslyons 7:5fe9ac6522c5 133 }
helioslyons 7:5fe9ac6522c5 134 }
helioslyons 7:5fe9ac6522c5 135 }
helioslyons 7:5fe9ac6522c5 136 else { // otherwise go down
helioslyons 7:5fe9ac6522c5 137 for (int i = 3; i < 0; i--) {
helioslyons 7:5fe9ac6522c5 138 for (int n = 3; n < 0; n--) {
helioslyons 7:5fe9ac6522c5 139 army[i][n].set_pos(army[i][n].get_x_pos(), army[i][n].get_y_pos() + _y_distance);
helioslyons 7:5fe9ac6522c5 140 }
helioslyons 7:5fe9ac6522c5 141 }
helioslyons 7:5fe9ac6522c5 142 }
helioslyons 7:5fe9ac6522c5 143 }
helioslyons 7:5fe9ac6522c5 144 else { // if edge is not near to being reached, move right
helioslyons 7:5fe9ac6522c5 145 for (int i = 3; i < 0; i--) {
helioslyons 7:5fe9ac6522c5 146 for (int n = 3; n < 0; n--) {
helioslyons 7:5fe9ac6522c5 147 army[i][n].set_pos(army[i][n].get_x_pos() + _x_distance, army[i][n].get_y_pos() + _y_distance);
helioslyons 7:5fe9ac6522c5 148 }
helioslyons 7:5fe9ac6522c5 149 }
helioslyons 7:5fe9ac6522c5 150 }
helioslyons 7:5fe9ac6522c5 151 }
helioslyons 6:e3a1bfbb1627 152 }
helioslyons 8:ec4199484adf 153
helioslyons 8:ec4199484adf 154 void Army::draw_army(N5110 &lcd)
helioslyons 8:ec4199484adf 155 {
helioslyons 8:ec4199484adf 156 int i, n;
helioslyons 8:ec4199484adf 157 for(i=0; i < 4; i++) {
helioslyons 8:ec4199484adf 158
helioslyons 8:ec4199484adf 159 for(n=0; n < 4; n++) {
helioslyons 8:ec4199484adf 160 //army[i][n].draw();
helioslyons 8:ec4199484adf 161 }
helioslyons 8:ec4199484adf 162 }
helioslyons 8:ec4199484adf 163 }