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:
Fri Apr 17 13:52:37 2020 +0000
Revision:
7:5fe9ac6522c5
Parent:
6:e3a1bfbb1627
Child:
8:ec4199484adf
Implemented Army movement

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