ELEC2645 (2018/19) / Mbed 2 deprecated el17dtt

Dependencies:   mbed

Committer:
batJoro
Date:
Fri May 10 12:00:30 2019 +0000
Revision:
10:b939edd9b87c
Parent:
9:dc13042b09f5
Child:
11:0e6a221ad8a9
final;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
batJoro 8:b3738229ba85 1
batJoro 8:b3738229ba85 2 #include "engine.h"
batJoro 8:b3738229ba85 3
batJoro 8:b3738229ba85 4 Engine::Engine(){
batJoro 8:b3738229ba85 5
batJoro 8:b3738229ba85 6
batJoro 8:b3738229ba85 7 }
batJoro 8:b3738229ba85 8
batJoro 8:b3738229ba85 9 Engine::~Engine(){
batJoro 8:b3738229ba85 10
batJoro 8:b3738229ba85 11 }
batJoro 8:b3738229ba85 12
batJoro 8:b3738229ba85 13 void Engine::init(int screenHeight, int screenWidth, int speed){
batJoro 8:b3738229ba85 14
batJoro 8:b3738229ba85 15 _screen_height = screenHeight;
batJoro 9:dc13042b09f5 16 _screen_width = screenWidth;
batJoro 10:b939edd9b87c 17
batJoro 10:b939edd9b87c 18 car.set_speed(0.0f);
batJoro 10:b939edd9b87c 19 car.set_car_position(0.0f);
batJoro 10:b939edd9b87c 20 car.set_car_distance(0.0f);
batJoro 10:b939edd9b87c 21 car.set_gear();
batJoro 10:b939edd9b87c 22
batJoro 9:dc13042b09f5 23 _curvature = 0.0f;
batJoro 9:dc13042b09f5 24
batJoro 10:b939edd9b87c 25 map.set_player_curvature(0.0f);
batJoro 10:b939edd9b87c 26 map.set_timed_curvature(0.0f);
batJoro 9:dc13042b09f5 27
batJoro 10:b939edd9b87c 28 _track_distance = 0.0f;
batJoro 10:b939edd9b87c 29 _lap_time = 0.0f;
batJoro 9:dc13042b09f5 30
batJoro 10:b939edd9b87c 31 addSegment(0.0f, 500.0f);
batJoro 10:b939edd9b87c 32 addSegment(-1.0f, 600.0f);
batJoro 10:b939edd9b87c 33 addSegment(1.0f, 600.0f);
batJoro 10:b939edd9b87c 34 addSegment(-1.0f, 600.0f);
batJoro 10:b939edd9b87c 35 addSegment(-1.0f, 600.0f);
batJoro 10:b939edd9b87c 36 addSegment(1.0f, 600.0f);
batJoro 10:b939edd9b87c 37 addSegment(-1.0f, 600.0f);
batJoro 10:b939edd9b87c 38 addSegment(1.0f, 600.0f);
batJoro 10:b939edd9b87c 39 addSegment(-1.0f, 600.0f);
batJoro 10:b939edd9b87c 40 addSegment(0.0f, 700.0f);
batJoro 9:dc13042b09f5 41
batJoro 10:b939edd9b87c 42 calc_track_distance();
batJoro 10:b939edd9b87c 43
batJoro 8:b3738229ba85 44 }
batJoro 8:b3738229ba85 45
batJoro 8:b3738229ba85 46
batJoro 9:dc13042b09f5 47 void Engine::update(Gamepad &pad, N5110 &lcd, float elapsedTime) {
batJoro 8:b3738229ba85 48
batJoro 8:b3738229ba85 49 clearScreen(lcd);
batJoro 10:b939edd9b87c 50
batJoro 10:b939edd9b87c 51 drawFrame(lcd); // draw the frame around the picture
batJoro 10:b939edd9b87c 52
batJoro 10:b939edd9b87c 53
batJoro 10:b939edd9b87c 54
batJoro 10:b939edd9b87c 55 if(fabs(map.get_player_curvature() - map.get_timed_curvature()) >= 0.5f) {
batJoro 10:b939edd9b87c 56
batJoro 10:b939edd9b87c 57 car.set_speed(car.get_speed() - 5.0f * elapsedTime);
batJoro 9:dc13042b09f5 58 }
batJoro 9:dc13042b09f5 59
batJoro 9:dc13042b09f5 60
batJoro 10:b939edd9b87c 61 // how the car perceives the track
batJoro 10:b939edd9b87c 62 car.set_car_distance(car.get_car_distance() +
batJoro 10:b939edd9b87c 63 (car.get_speed() * 300.0f) * elapsedTime * car.get_rev());
batJoro 9:dc13042b09f5 64
batJoro 9:dc13042b09f5 65 // get point on track
batJoro 9:dc13042b09f5 66 float foffset = 0;
batJoro 9:dc13042b09f5 67 int ntrackSection = 0;
batJoro 9:dc13042b09f5 68
batJoro 10:b939edd9b87c 69 _lap_time += elapsedTime;
batJoro 10:b939edd9b87c 70
batJoro 10:b939edd9b87c 71 // restart the car distance
batJoro 10:b939edd9b87c 72 if ( car.get_car_distance() >= _track_distance) {
batJoro 10:b939edd9b87c 73 car.set_car_distance(car.get_car_distance() - _track_distance);
batJoro 10:b939edd9b87c 74 _lap = 1;
batJoro 10:b939edd9b87c 75 }
batJoro 10:b939edd9b87c 76
batJoro 9:dc13042b09f5 77 // find position on track
batJoro 10:b939edd9b87c 78 while( ntrackSection < track.size() && foffset < car.get_car_distance()){
batJoro 9:dc13042b09f5 79
batJoro 9:dc13042b09f5 80 foffset += track[ntrackSection].meters;
batJoro 9:dc13042b09f5 81 ntrackSection++;
batJoro 9:dc13042b09f5 82 }
batJoro 9:dc13042b09f5 83
batJoro 10:b939edd9b87c 84 // the curvature of the segment we are in
batJoro 9:dc13042b09f5 85 float targetCurvature = track[ntrackSection -1].curvature;
batJoro 9:dc13042b09f5 86
batJoro 10:b939edd9b87c 87 // small curvature to be displayed
batJoro 10:b939edd9b87c 88 float curvDiff = (targetCurvature - _curvature) * elapsedTime * car.get_speed();
batJoro 10:b939edd9b87c 89
batJoro 10:b939edd9b87c 90 // slowly changing curvature
batJoro 9:dc13042b09f5 91 _curvature += curvDiff;
batJoro 10:b939edd9b87c 92
batJoro 10:b939edd9b87c 93 // the best curvature we should aim for
batJoro 10:b939edd9b87c 94 map.set_timed_curvature( (_curvature) * elapsedTime * car.get_speed() );
batJoro 9:dc13042b09f5 95
batJoro 10:b939edd9b87c 96 draw(lcd); // change the pixels of the buffer;
batJoro 10:b939edd9b87c 97
batJoro 10:b939edd9b87c 98 // draw car
batJoro 10:b939edd9b87c 99 car.set_car_position(map.get_player_curvature() - map.get_timed_curvature());
batJoro 10:b939edd9b87c 100 car.draw(lcd, _screen_width);
batJoro 10:b939edd9b87c 101 lcd.refresh();
batJoro 10:b939edd9b87c 102 }
batJoro 10:b939edd9b87c 103
batJoro 10:b939edd9b87c 104 void Engine::read_input(Gamepad &pad, float elapsedTime) {
batJoro 10:b939edd9b87c 105
batJoro 10:b939edd9b87c 106 float _mag;
batJoro 10:b939edd9b87c 107 _mag = pad.get_mag();
batJoro 10:b939edd9b87c 108
batJoro 10:b939edd9b87c 109 if(pad.get_direction() == N) {
batJoro 10:b939edd9b87c 110 car.set_speed(car.get_speed() + 0.5f * elapsedTime * _mag);
batJoro 10:b939edd9b87c 111 car.set_direction(0); //
batJoro 10:b939edd9b87c 112 }
batJoro 10:b939edd9b87c 113 else {
batJoro 10:b939edd9b87c 114 car.set_speed(car.get_speed() - 1.8f * elapsedTime);
batJoro 10:b939edd9b87c 115 }
batJoro 8:b3738229ba85 116
batJoro 10:b939edd9b87c 117 if(pad.get_direction() == S) {
batJoro 10:b939edd9b87c 118 car.set_speed(car.get_speed() - 5.0f * elapsedTime * _mag);
batJoro 10:b939edd9b87c 119 car.set_direction(0); //
batJoro 10:b939edd9b87c 120 }
batJoro 9:dc13042b09f5 121
batJoro 10:b939edd9b87c 122 if(pad.get_direction() == W || pad.get_direction() == NW) {
batJoro 10:b939edd9b87c 123 if(pad.get_direction() == NW) {
batJoro 10:b939edd9b87c 124 map.set_player_curvature(map.get_player_curvature() - 0.7f * elapsedTime);
batJoro 10:b939edd9b87c 125 car.set_speed(car.get_speed() + 4.5f * elapsedTime * _mag);
batJoro 10:b939edd9b87c 126 }
batJoro 10:b939edd9b87c 127 else
batJoro 10:b939edd9b87c 128 map.set_player_curvature(map.get_player_curvature() - 1.4f * elapsedTime);
batJoro 10:b939edd9b87c 129 car.set_direction(1);
batJoro 10:b939edd9b87c 130
batJoro 10:b939edd9b87c 131 }
batJoro 10:b939edd9b87c 132 if(pad.get_direction() == E || pad.get_direction() == NE) {
batJoro 10:b939edd9b87c 133 if(pad.get_direction() == NE) {
batJoro 10:b939edd9b87c 134 map.set_player_curvature(map.get_player_curvature() + 0.7f * elapsedTime);
batJoro 10:b939edd9b87c 135 car.set_speed(car.get_speed() + 4.5f * elapsedTime * _mag);
batJoro 10:b939edd9b87c 136 }
batJoro 10:b939edd9b87c 137 else
batJoro 10:b939edd9b87c 138 map.set_player_curvature(map.get_player_curvature() + 1.4f * elapsedTime);
batJoro 10:b939edd9b87c 139 car.set_direction(2);
batJoro 10:b939edd9b87c 140 }
batJoro 10:b939edd9b87c 141 if(pad.check_event(Gamepad::Y_PRESSED)) {
batJoro 10:b939edd9b87c 142 car.upShift();
batJoro 10:b939edd9b87c 143 }
batJoro 10:b939edd9b87c 144 if(pad.check_event(Gamepad::X_PRESSED)) {
batJoro 10:b939edd9b87c 145 car.downShift();
batJoro 10:b939edd9b87c 146 }
batJoro 10:b939edd9b87c 147 }
batJoro 10:b939edd9b87c 148
batJoro 10:b939edd9b87c 149
batJoro 10:b939edd9b87c 150 void Engine::draw(N5110 &lcd) {
batJoro 10:b939edd9b87c 151
batJoro 10:b939edd9b87c 152 for (int y = 0; y < _screen_height / 2; y++) {
batJoro 9:dc13042b09f5 153
batJoro 9:dc13042b09f5 154 float fPerspective = (float)y / (_screen_height / 2.0f);
batJoro 9:dc13042b09f5 155
batJoro 8:b3738229ba85 156 for (int x = 0; x < _screen_width; x++) {
batJoro 8:b3738229ba85 157
batJoro 9:dc13042b09f5 158 float fPointCentre = 0.5f + _curvature * powf((1.0f - fPerspective), 3);
batJoro 9:dc13042b09f5 159 float fRoadSpace = 0.1f + fPerspective * 0.8f;
batJoro 8:b3738229ba85 160 float fSideSpace = fRoadSpace * 0.15f;
batJoro 8:b3738229ba85 161
batJoro 10:b939edd9b87c 162 // for easier calculating the sides spliting the road space in two
batJoro 8:b3738229ba85 163 fRoadSpace *= 0.5f;
batJoro 8:b3738229ba85 164
batJoro 8:b3738229ba85 165 int leftGrass = (fPointCentre - fRoadSpace - fSideSpace) * _screen_width;
batJoro 8:b3738229ba85 166 int leftSide = (fPointCentre - fRoadSpace) * _screen_width;
batJoro 8:b3738229ba85 167 int rightGrass = (fPointCentre + fRoadSpace + fSideSpace) * _screen_width;
batJoro 8:b3738229ba85 168 int rightSide = (fPointCentre + fRoadSpace) * _screen_width;
batJoro 8:b3738229ba85 169
batJoro 8:b3738229ba85 170 int row = _screen_height / 2 + y;
batJoro 8:b3738229ba85 171
batJoro 10:b939edd9b87c 172 float GrassColour = defineStripes(lcd, car, 20.0f, fPerspective);
batJoro 10:b939edd9b87c 173 float SideColour = defineStripes(lcd, car, 40.0f, fPerspective);
batJoro 9:dc13042b09f5 174
batJoro 10:b939edd9b87c 175 assignPixel(lcd, x, y, row, SideColour, GrassColour, leftGrass, rightGrass,
batJoro 10:b939edd9b87c 176 leftSide,
batJoro 10:b939edd9b87c 177 rightSide);
batJoro 10:b939edd9b87c 178 }
batJoro 10:b939edd9b87c 179 }
batJoro 10:b939edd9b87c 180 }
batJoro 10:b939edd9b87c 181
batJoro 10:b939edd9b87c 182 void Engine::assignPixel(N5110 &lcd,int x, int y, int row, float SideColour, float GrassColour,
batJoro 10:b939edd9b87c 183 int leftGrass,
batJoro 10:b939edd9b87c 184 int rightGrass,
batJoro 10:b939edd9b87c 185 int leftSide,
batJoro 10:b939edd9b87c 186 int rightSide) {
batJoro 8:b3738229ba85 187 if ( x >= 0 && x < leftGrass) {
batJoro 9:dc13042b09f5 188 if ( GrassColour == 0.0f )
batJoro 8:b3738229ba85 189 lcd.setPixel(x, row, true);
batJoro 8:b3738229ba85 190 }
batJoro 8:b3738229ba85 191 if ( x >= leftGrass && x < leftSide) {
batJoro 9:dc13042b09f5 192 if ( x % 2 ==0)
batJoro 9:dc13042b09f5 193 if ( SideColour == 0.0f )
batJoro 9:dc13042b09f5 194 lcd.setPixel(x, row, true);
batJoro 8:b3738229ba85 195 }
batJoro 8:b3738229ba85 196 if ( x >= rightSide && x < rightGrass ) {
batJoro 9:dc13042b09f5 197 if ( x % 2 ==0)
batJoro 9:dc13042b09f5 198 if ( SideColour == 0.0f )
batJoro 9:dc13042b09f5 199 lcd.setPixel(x, row, true);
batJoro 8:b3738229ba85 200 }
batJoro 8:b3738229ba85 201 if ( x >= rightGrass && x < _screen_width) {
batJoro 9:dc13042b09f5 202 if ( GrassColour == 0.0f )
batJoro 8:b3738229ba85 203 lcd.setPixel(x, row, true);
batJoro 10:b939edd9b87c 204 }
batJoro 10:b939edd9b87c 205 }
batJoro 10:b939edd9b87c 206
batJoro 10:b939edd9b87c 207 float Engine::defineStripes(N5110 &lcd, Car &car, float frequency, float perspective) {
batJoro 9:dc13042b09f5 208
batJoro 10:b939edd9b87c 209 float colour = sinf(frequency * powf(1.0f - perspective, 3) + car.get_car_distance() * 0.1f);
batJoro 10:b939edd9b87c 210
batJoro 10:b939edd9b87c 211 if (colour > 0.0f) colour = 1.0f;
batJoro 10:b939edd9b87c 212 else colour = 0.0f;
batJoro 10:b939edd9b87c 213
batJoro 10:b939edd9b87c 214 return colour;
batJoro 8:b3738229ba85 215 }
batJoro 8:b3738229ba85 216
batJoro 10:b939edd9b87c 217 void Engine::addSegment(float curvature, float meters) {
batJoro 10:b939edd9b87c 218
batJoro 10:b939edd9b87c 219 // clap the curvature variable
batJoro 10:b939edd9b87c 220 if(curvature < -1.0f) curvature = -1.0f;
batJoro 10:b939edd9b87c 221 if(curvature > 1.0f) curvature = 1.0f;
batJoro 10:b939edd9b87c 222 MapSegment segment;
batJoro 10:b939edd9b87c 223 segment.curvature = curvature;
batJoro 10:b939edd9b87c 224 segment.meters = meters;
batJoro 10:b939edd9b87c 225 track.push_back(segment);
batJoro 10:b939edd9b87c 226 }
batJoro 10:b939edd9b87c 227
batJoro 10:b939edd9b87c 228 void Engine::calc_track_distance() {
batJoro 8:b3738229ba85 229
batJoro 10:b939edd9b87c 230 for (vector<MapSegment>::iterator it = track.begin(); it != track.end(); ++it) {
batJoro 10:b939edd9b87c 231 _track_distance += it->meters;
batJoro 10:b939edd9b87c 232 }
batJoro 10:b939edd9b87c 233 }
batJoro 10:b939edd9b87c 234
batJoro 10:b939edd9b87c 235 int Engine::get_lap() {
batJoro 10:b939edd9b87c 236
batJoro 10:b939edd9b87c 237 return _lap;
batJoro 10:b939edd9b87c 238 }
batJoro 8:b3738229ba85 239
batJoro 10:b939edd9b87c 240 float Engine::get_lap_time() {
batJoro 10:b939edd9b87c 241
batJoro 10:b939edd9b87c 242 return _lap_time;
batJoro 10:b939edd9b87c 243 }
batJoro 10:b939edd9b87c 244