ELEC2645 (2018/19) / Mbed 2 deprecated el17st

Dependencies:   mbed FATFileSystem

Committer:
rottenegg
Date:
Fri May 10 21:25:27 2019 +0000
Revision:
26:716bcd47f3ca
Parent:
21:f3b0ce18b44f
FINAL_SUBMISSION; ; Changes:; WDplayer: Major Memory Leek fixed related to fclose(); Game_Manager: Tuned Scene Order and Improved Random number generator.; SceneFuctions: Added a Randomly changing Object to Scene 4.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rottenegg 4:34bf3587cf42 1 #include "CaMove.h"
rottenegg 8:e3a76a808a4c 2 #include "AniPaths.h"
rottenegg 18:14e5391beccf 3
rottenegg 5:860087ff295e 4 //Constructor
rottenegg 5:860087ff295e 5 CaMove::CaMove(PinName Button,
rottenegg 5:860087ff295e 6 PinName Pot_h,
rottenegg 5:860087ff295e 7 PinName Pot_v)
rottenegg 5:860087ff295e 8 : //Creating Class Objects
rottenegg 5:860087ff295e 9 _check(new InterruptIn(Button)),
rottenegg 5:860087ff295e 10 _hoz(new AnalogIn(Pot_h)),
rottenegg 5:860087ff295e 11 _ver(new AnalogIn(Pot_v))
rottenegg 5:860087ff295e 12 {
rottenegg 5:860087ff295e 13 _check->mode(PullDown);
rottenegg 5:860087ff295e 14 _check->rise(callback(this,&CaMove::intercheck));
rottenegg 4:34bf3587cf42 15 };
rottenegg 18:14e5391beccf 16
rottenegg 5:860087ff295e 17 //Destructor
rottenegg 4:34bf3587cf42 18 CaMove::~CaMove() {
rottenegg 5:860087ff295e 19 delete _check;
rottenegg 5:860087ff295e 20 delete _hoz;
rottenegg 5:860087ff295e 21 delete _ver;
rottenegg 4:34bf3587cf42 22 };
rottenegg 4:34bf3587cf42 23
rottenegg 21:f3b0ce18b44f 24 //Initilizing Functions
rottenegg 21:f3b0ce18b44f 25 //Player
rottenegg 5:860087ff295e 26 void CaMove::init(int x,int y,Direction D) {
rottenegg 5:860087ff295e 27 _h = x;
rottenegg 5:860087ff295e 28 _v = y;
rottenegg 5:860087ff295e 29 _itr = 0;
rottenegg 5:860087ff295e 30 _fc = D;
rottenegg 5:860087ff295e 31 _trg = false;
rottenegg 5:860087ff295e 32 _treg = -1;
rottenegg 5:860087ff295e 33 };
rottenegg 5:860087ff295e 34
rottenegg 21:f3b0ce18b44f 35 //AI Chasers
rottenegg 21:f3b0ce18b44f 36 void CaMove::AIinit(int chaser) {
rottenegg 21:f3b0ce18b44f 37 enabled = false;
rottenegg 21:f3b0ce18b44f 38 _ch = 0;
rottenegg 26:716bcd47f3ca 39 _cv = 0; //Increment is speed of Chaser
rottenegg 21:f3b0ce18b44f 40 switch (chaser) {
rottenegg 21:f3b0ce18b44f 41 case 2:
rottenegg 21:f3b0ce18b44f 42 increment = 2;
rottenegg 21:f3b0ce18b44f 43 break;
rottenegg 21:f3b0ce18b44f 44 case 1:
rottenegg 21:f3b0ce18b44f 45 increment = 0;
rottenegg 21:f3b0ce18b44f 46 break;
rottenegg 21:f3b0ce18b44f 47 case 4:
rottenegg 21:f3b0ce18b44f 48 increment = 5;
rottenegg 21:f3b0ce18b44f 49 break;
rottenegg 21:f3b0ce18b44f 50 default:
rottenegg 21:f3b0ce18b44f 51 increment = 3;
rottenegg 21:f3b0ce18b44f 52 break;
rottenegg 21:f3b0ce18b44f 53 }
rottenegg 21:f3b0ce18b44f 54 };
rottenegg 21:f3b0ce18b44f 55
rottenegg 21:f3b0ce18b44f 56 //Player Functions
rottenegg 21:f3b0ce18b44f 57
rottenegg 17:7d4d8905b608 58 void CaMove::move(Bitmap &lcd) {
rottenegg 5:860087ff295e 59 //If statements to check joystick movement and has in bluilt collsion detection
rottenegg 5:860087ff295e 60 //collsion detection check 4 sides for black pixels
rottenegg 21:f3b0ce18b44f 61 bool left = (lcd.getPixel((_h-1),(_v+12)) == 0 && lcd.getPixel((_h-1),(_v+1)) == 0) ;
rottenegg 21:f3b0ce18b44f 62 bool right = (lcd.getPixel((_h+10),(_v+12)) == 0 && lcd.getPixel((_h+10),(_v+1)) == 0);
rottenegg 21:f3b0ce18b44f 63 bool down = (lcd.getPixel((_h+1),(_v-1)) == 0 && lcd.getPixel((_h+8),(_v-1)) == 0);
rottenegg 21:f3b0ce18b44f 64 bool up = (lcd.getPixel((_h+1),(_v+14)) == 0 && lcd.getPixel((_h+8),(_v+14)) == 0);
rottenegg 21:f3b0ce18b44f 65 this->check_collision(left,right,down,up);
rottenegg 18:14e5391beccf 66 if (_itr == 3) {
rottenegg 18:14e5391beccf 67 _itr = -1;
rottenegg 18:14e5391beccf 68 }
rottenegg 18:14e5391beccf 69 _itr++;
rottenegg 18:14e5391beccf 70 this->rend(lcd);
rottenegg 18:14e5391beccf 71 }
rottenegg 21:f3b0ce18b44f 72
rottenegg 21:f3b0ce18b44f 73 bool CaMove::in_screen() {
rottenegg 21:f3b0ce18b44f 74 if (_h + 5 >= 84 || (_h + 5) <= 0 || _v + 7 >= 48 || (_v + 8) <= 0) {
rottenegg 21:f3b0ce18b44f 75 return false;
rottenegg 21:f3b0ce18b44f 76 } else {
rottenegg 21:f3b0ce18b44f 77 return true;
rottenegg 21:f3b0ce18b44f 78 }
rottenegg 21:f3b0ce18b44f 79 };
rottenegg 21:f3b0ce18b44f 80
rottenegg 21:f3b0ce18b44f 81 //Aiding Player Functions
rottenegg 21:f3b0ce18b44f 82
rottenegg 21:f3b0ce18b44f 83 void CaMove::check_collision(bool left,bool right,bool down,bool up) {
rottenegg 21:f3b0ce18b44f 84 //Checks Input on Joystick and Verifies if charater can move in that direction
rottenegg 21:f3b0ce18b44f 85 if (_hoz->read() > 0.6f && left) {
rottenegg 4:34bf3587cf42 86 _h = _h - 2;
rottenegg 5:860087ff295e 87 _fc = Lt;
rottenegg 4:34bf3587cf42 88 }
rottenegg 21:f3b0ce18b44f 89 if (_hoz->read() < 0.4f && right) {
rottenegg 4:34bf3587cf42 90 _h = _h + 2;
rottenegg 5:860087ff295e 91 _fc = Rt;
rottenegg 4:34bf3587cf42 92 }
rottenegg 21:f3b0ce18b44f 93 if (_ver->read() > 0.6f && down) {
rottenegg 4:34bf3587cf42 94 _v = _v - 2;
rottenegg 5:860087ff295e 95 _fc = Fd;
rottenegg 4:34bf3587cf42 96 }
rottenegg 21:f3b0ce18b44f 97 if (_ver->read() < 0.4f && up) {
rottenegg 4:34bf3587cf42 98 _v = _v + 2;
rottenegg 5:860087ff295e 99 _fc = Bd;
rottenegg 18:14e5391beccf 100 }
rottenegg 9:ac396c818874 101 }
rottenegg 9:ac396c818874 102
rottenegg 17:7d4d8905b608 103 void CaMove::rend(Bitmap &lcd) {
rottenegg 5:860087ff295e 104 //Switch case allows charater to move diagonally and retains its facing direction when stationary
rottenegg 5:860087ff295e 105 switch (_fc) {
rottenegg 4:34bf3587cf42 106 case Lt:
rottenegg 21:f3b0ce18b44f 107 lcd.renderBMP(L[_itr],_h,_v); //render Charater on Screen
rottenegg 21:f3b0ce18b44f 108 break;
rottenegg 4:34bf3587cf42 109 case Rt:
rottenegg 17:7d4d8905b608 110 lcd.renderBMP(R[_itr],_h,_v);
rottenegg 4:34bf3587cf42 111 break;
rottenegg 4:34bf3587cf42 112 case Fd:
rottenegg 17:7d4d8905b608 113 lcd.renderBMP(F[_itr],_h,_v);
rottenegg 4:34bf3587cf42 114 break;
rottenegg 4:34bf3587cf42 115 case Bd:
rottenegg 17:7d4d8905b608 116 lcd.renderBMP(B[_itr],_h,_v);
rottenegg 4:34bf3587cf42 117 break;
rottenegg 4:34bf3587cf42 118 }
rottenegg 4:34bf3587cf42 119 };
rottenegg 4:34bf3587cf42 120
rottenegg 21:f3b0ce18b44f 121 //Interactive Region Function pack
rottenegg 21:f3b0ce18b44f 122 //Setting regions
rottenegg 21:f3b0ce18b44f 123 void CaMove::set_region(int xmin, int ymin, int xl, int yl) { //Sets values into vector
rottenegg 5:860087ff295e 124 _vreg.push_back((xmin + xl));
rottenegg 5:860087ff295e 125 _vreg.push_back(xmin);
rottenegg 5:860087ff295e 126 _vreg.push_back((ymin + yl));
rottenegg 5:860087ff295e 127 _vreg.push_back(ymin);
rottenegg 4:34bf3587cf42 128 };
rottenegg 4:34bf3587cf42 129
rottenegg 4:34bf3587cf42 130 void CaMove::delete_regions() {
rottenegg 5:860087ff295e 131 _vreg.clear();
rottenegg 4:34bf3587cf42 132 };
rottenegg 4:34bf3587cf42 133
rottenegg 21:f3b0ce18b44f 134 //Interupting Function
rottenegg 4:34bf3587cf42 135 void CaMove::intercheck() {
rottenegg 21:f3b0ce18b44f 136 _trg = false; //reset everytime called
rottenegg 18:14e5391beccf 137 LowerH = false;
rottenegg 18:14e5391beccf 138 UpperH = false;
rottenegg 18:14e5391beccf 139 MidH = false;
rottenegg 18:14e5391beccf 140 LowerV = false;
rottenegg 18:14e5391beccf 141 UpperV = false;
rottenegg 18:14e5391beccf 142 MidV = false;
rottenegg 21:f3b0ce18b44f 143 if (_vreg.size() > 0) { //checks all regions for vector
rottenegg 5:860087ff295e 144 for(int Vvalue = 0; Vvalue < _vreg.size(); Vvalue = Vvalue +4) {
rottenegg 21:f3b0ce18b44f 145 this->set_statements(Vvalue); //returns checked regions if in an Region
rottenegg 21:f3b0ce18b44f 146 this->check_sides(Vvalue); //focuses on regions in facing direction
rottenegg 4:34bf3587cf42 147 }
rottenegg 4:34bf3587cf42 148 }
rottenegg 5:860087ff295e 149 };
rottenegg 18:14e5391beccf 150
rottenegg 21:f3b0ce18b44f 151
rottenegg 21:f3b0ce18b44f 152 //Internal Functions
rottenegg 21:f3b0ce18b44f 153 void CaMove::set_statements(int Vvalue) {
rottenegg 21:f3b0ce18b44f 154 //If Statements check that sides position with all x- y region ranges to see if charater has hit that region.
rottenegg 21:f3b0ce18b44f 155 LowerH = (_h - 1) <= _vreg[Vvalue] && (_h-1) >= _vreg[Vvalue + 1];
rottenegg 21:f3b0ce18b44f 156 UpperH = (_h + 10) <= _vreg[Vvalue] && (_h + 10) >= _vreg[Vvalue + 1];
rottenegg 21:f3b0ce18b44f 157 MidH = (_h + 5) <= _vreg[Vvalue] && (_h + 5) >= _vreg[Vvalue + 1];
rottenegg 21:f3b0ce18b44f 158 LowerV = (_v - 1) >= _vreg[Vvalue + 3] && (_v - 1) <= _vreg[Vvalue + 2];
rottenegg 21:f3b0ce18b44f 159 UpperV = (_v+14) >= _vreg[Vvalue + 3] && (_v + 14) <= _vreg[Vvalue + 2];
rottenegg 21:f3b0ce18b44f 160 MidV = (_v+7) >= _vreg[Vvalue + 3] && (_v + 7) <= _vreg[Vvalue + 2];
rottenegg 21:f3b0ce18b44f 161 }
rottenegg 21:f3b0ce18b44f 162
rottenegg 18:14e5391beccf 163 void CaMove::check_sides(int Vvalue) {
rottenegg 18:14e5391beccf 164 switch (_fc) { //Function only will check the facing side for interative regions
rottenegg 18:14e5391beccf 165 case Lt: //L
rottenegg 18:14e5391beccf 166 if (LowerH && MidV) {
rottenegg 21:f3b0ce18b44f 167 this->set_treg(Vvalue); //returns region number
rottenegg 18:14e5391beccf 168 };
rottenegg 18:14e5391beccf 169 break;
rottenegg 18:14e5391beccf 170 case Rt: //R
rottenegg 18:14e5391beccf 171 if (UpperH && MidV) {
rottenegg 18:14e5391beccf 172 this->set_treg(Vvalue);
rottenegg 18:14e5391beccf 173 }
rottenegg 18:14e5391beccf 174 break;
rottenegg 18:14e5391beccf 175 case Fd: //F
rottenegg 18:14e5391beccf 176 if (MidH && LowerV) {
rottenegg 18:14e5391beccf 177 this->set_treg(Vvalue);
rottenegg 18:14e5391beccf 178 }
rottenegg 18:14e5391beccf 179 break;
rottenegg 18:14e5391beccf 180 case Bd: //B
rottenegg 18:14e5391beccf 181 if (MidH && UpperV) {
rottenegg 18:14e5391beccf 182 this->set_treg(Vvalue);
rottenegg 18:14e5391beccf 183 }
rottenegg 18:14e5391beccf 184 break;
rottenegg 18:14e5391beccf 185 }
rottenegg 18:14e5391beccf 186 }
rottenegg 18:14e5391beccf 187
rottenegg 21:f3b0ce18b44f 188 //Aiding Functions
rottenegg 21:f3b0ce18b44f 189
rottenegg 18:14e5391beccf 190 void CaMove::set_treg(int Vvalue) {
rottenegg 18:14e5391beccf 191 //The region number is found depending on its position in the vector
rottenegg 18:14e5391beccf 192 //e.g elements 0 to 3 are in region 0 and elements 4 to 7 are in region 1
rottenegg 18:14e5391beccf 193 _trg = true;
rottenegg 18:14e5391beccf 194 _treg = Vvalue / 4;
rottenegg 18:14e5391beccf 195 }
rottenegg 18:14e5391beccf 196
rottenegg 21:f3b0ce18b44f 197 //Accessors
rottenegg 18:14e5391beccf 198
rottenegg 5:860087ff295e 199 //Functions revert to default values evrytime they are called.
rottenegg 21:f3b0ce18b44f 200 bool CaMove::is_trg() {
rottenegg 5:860087ff295e 201 bool temp = _trg;
rottenegg 5:860087ff295e 202 _trg = false;
rottenegg 4:34bf3587cf42 203 return temp;
rottenegg 4:34bf3587cf42 204
rottenegg 4:34bf3587cf42 205 };
rottenegg 5:860087ff295e 206
rottenegg 5:860087ff295e 207 int CaMove::get_treg() {
rottenegg 5:860087ff295e 208 int temp = _treg;
rottenegg 5:860087ff295e 209 _treg = -1;
rottenegg 5:860087ff295e 210 return temp;
rottenegg 5:860087ff295e 211 }
rottenegg 5:860087ff295e 212
rottenegg 21:f3b0ce18b44f 213
rottenegg 18:14e5391beccf 214
rottenegg 21:f3b0ce18b44f 215 //Chaser Functions
rottenegg 21:f3b0ce18b44f 216
rottenegg 21:f3b0ce18b44f 217 void CaMove::spawn(int x, int y) { //Chaser Appears
rottenegg 18:14e5391beccf 218 enabled = true;
rottenegg 18:14e5391beccf 219 _ch = x;
rottenegg 18:14e5391beccf 220 _cv = y;
rottenegg 18:14e5391beccf 221 }
rottenegg 18:14e5391beccf 222
rottenegg 21:f3b0ce18b44f 223
rottenegg 21:f3b0ce18b44f 224 bool CaMove::is_caught() {
rottenegg 21:f3b0ce18b44f 225 if (abs(_ch - _h) < 10 && abs(_cv - _v) < 14 && enabled) {
rottenegg 21:f3b0ce18b44f 226 return true;
rottenegg 21:f3b0ce18b44f 227 } else {
rottenegg 21:f3b0ce18b44f 228 return false;
rottenegg 21:f3b0ce18b44f 229 }
rottenegg 21:f3b0ce18b44f 230 }
rottenegg 21:f3b0ce18b44f 231
rottenegg 20:01efa2bce75d 232 void CaMove::chase(Bitmap &lcd, int girl) {
rottenegg 9:ac396c818874 233 if (enabled) {
rottenegg 9:ac396c818874 234 if (_cv < _v) {
rottenegg 10:4fda7b01484a 235 _cv = _cv + increment;
rottenegg 9:ac396c818874 236 } else if (_cv > _v) {
rottenegg 10:4fda7b01484a 237 _cv = _cv - increment;
rottenegg 13:95323e0f2fcb 238 }
rottenegg 13:95323e0f2fcb 239 if (_ch < _h) {
rottenegg 13:95323e0f2fcb 240 _ch = _ch + increment;
rottenegg 15:3d29fb195958 241 } else if (_ch > _h) {
rottenegg 13:95323e0f2fcb 242 _ch = _ch - increment;
rottenegg 9:ac396c818874 243 }
rottenegg 20:01efa2bce75d 244 this->render_chaser(lcd,girl);
rottenegg 18:14e5391beccf 245 }
rottenegg 18:14e5391beccf 246 }
rottenegg 18:14e5391beccf 247
rottenegg 21:f3b0ce18b44f 248 //Internal Functions
rottenegg 21:f3b0ce18b44f 249
rottenegg 18:14e5391beccf 250 void CaMove::render_chaser(Bitmap &lcd,int chaser) {
rottenegg 18:14e5391beccf 251 switch (chaser) {
rottenegg 18:14e5391beccf 252 case 2:
rottenegg 18:14e5391beccf 253 lcd.renderBMP(AIC[_itr],_ch,_cv);
rottenegg 18:14e5391beccf 254 break;
rottenegg 18:14e5391beccf 255 case 4:
rottenegg 18:14e5391beccf 256 lcd.renderBMP(AIC[_itr],_ch,_cv); // change later
rottenegg 18:14e5391beccf 257 break;
rottenegg 18:14e5391beccf 258 default:
rottenegg 18:14e5391beccf 259 lcd.renderBMP(AIM[_itr],_ch,_cv);
rottenegg 18:14e5391beccf 260 break;
rottenegg 9:ac396c818874 261 }
rottenegg 21:f3b0ce18b44f 262 }