ELEC2645 (2018/19) / Mbed 2 deprecated el17dtt

Dependencies:   mbed

Committer:
batJoro
Date:
Sun May 05 23:31:07 2019 +0000
Revision:
9:dc13042b09f5
Parent:
8:b3738229ba85
Child:
10:b939edd9b87c
engine4;

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 setSpeed(speed);
batJoro 8:b3738229ba85 16 _screen_height = screenHeight;
batJoro 9:dc13042b09f5 17 _screen_width = screenWidth;
batJoro 9:dc13042b09f5 18 _car_positon = 0.0f;
batJoro 9:dc13042b09f5 19 _distance = 0.0f;
batJoro 9:dc13042b09f5 20 _curvature = 0.0f;
batJoro 9:dc13042b09f5 21
batJoro 9:dc13042b09f5 22 MapSegment seg1;
batJoro 9:dc13042b09f5 23 seg1.curvature = 0.0f;
batJoro 9:dc13042b09f5 24 seg1.meters = 100.0f;
batJoro 9:dc13042b09f5 25 track.push_back(seg1);
batJoro 9:dc13042b09f5 26
batJoro 9:dc13042b09f5 27 MapSegment seg2;
batJoro 9:dc13042b09f5 28 seg2.curvature = -1.0f;
batJoro 9:dc13042b09f5 29 seg2.meters = 200.0f;
batJoro 9:dc13042b09f5 30 track.push_back(seg2);
batJoro 9:dc13042b09f5 31
batJoro 9:dc13042b09f5 32 MapSegment seg3;
batJoro 9:dc13042b09f5 33 seg3.curvature = 1.0f;
batJoro 9:dc13042b09f5 34 seg3.meters = 200.0f;
batJoro 9:dc13042b09f5 35 track.push_back(seg3);
batJoro 9:dc13042b09f5 36
batJoro 9:dc13042b09f5 37 MapSegment seg4;
batJoro 9:dc13042b09f5 38 seg4.curvature = -1.0f;
batJoro 9:dc13042b09f5 39 seg4.meters = 200.0f;
batJoro 9:dc13042b09f5 40 track.push_back(seg4);
batJoro 9:dc13042b09f5 41
batJoro 9:dc13042b09f5 42 MapSegment seg5;
batJoro 9:dc13042b09f5 43 seg5.curvature = 1.0f;
batJoro 9:dc13042b09f5 44 seg5.meters = 200.0f;
batJoro 9:dc13042b09f5 45 track.push_back(seg5);
batJoro 8:b3738229ba85 46 }
batJoro 8:b3738229ba85 47
batJoro 8:b3738229ba85 48 void Engine::setSpeed(int speed) {
batJoro 8:b3738229ba85 49 if (speed <= 0) _speed = 0;
batJoro 8:b3738229ba85 50
batJoro 8:b3738229ba85 51 _speed = speed;
batJoro 8:b3738229ba85 52 }
batJoro 8:b3738229ba85 53
batJoro 9:dc13042b09f5 54 void Engine::update(Gamepad &pad, N5110 &lcd, float elapsedTime) {
batJoro 8:b3738229ba85 55
batJoro 8:b3738229ba85 56 clearScreen(lcd);
batJoro 9:dc13042b09f5 57 if(pad.get_direction() == N) {
batJoro 9:dc13042b09f5 58 _speed += 2.0f * elapsedTime;
batJoro 9:dc13042b09f5 59 }
batJoro 9:dc13042b09f5 60 else
batJoro 9:dc13042b09f5 61 _speed -= 1.0f * elapsedTime;
batJoro 9:dc13042b09f5 62
batJoro 9:dc13042b09f5 63 // clamp speed
batJoro 9:dc13042b09f5 64 if ( _speed < 0.0f) _speed = 0.0f;
batJoro 9:dc13042b09f5 65 if ( _speed > 1.0f) _speed = 1.0f;
batJoro 9:dc13042b09f5 66
batJoro 9:dc13042b09f5 67 _distance += (_speed * 110.0f) * elapsedTime;
batJoro 9:dc13042b09f5 68
batJoro 9:dc13042b09f5 69 // get point on track
batJoro 9:dc13042b09f5 70 float foffset = 0;
batJoro 9:dc13042b09f5 71 int ntrackSection = 0;
batJoro 9:dc13042b09f5 72
batJoro 9:dc13042b09f5 73 // find position on track
batJoro 9:dc13042b09f5 74 while( ntrackSection < track.size() && foffset < _distance){
batJoro 9:dc13042b09f5 75
batJoro 9:dc13042b09f5 76 foffset += track[ntrackSection].meters;
batJoro 9:dc13042b09f5 77 ntrackSection++;
batJoro 9:dc13042b09f5 78 }
batJoro 9:dc13042b09f5 79
batJoro 9:dc13042b09f5 80 float targetCurvature = track[ntrackSection -1].curvature;
batJoro 9:dc13042b09f5 81
batJoro 9:dc13042b09f5 82 float curvDiff = (targetCurvature - _curvature) * elapsedTime;
batJoro 9:dc13042b09f5 83 _curvature += curvDiff;
batJoro 9:dc13042b09f5 84
batJoro 8:b3738229ba85 85
batJoro 8:b3738229ba85 86 for (int y = 0; y < _screen_height / 2; y++) {
batJoro 9:dc13042b09f5 87
batJoro 9:dc13042b09f5 88 //_distance += n;
batJoro 9:dc13042b09f5 89
batJoro 9:dc13042b09f5 90 float fPerspective = (float)y / (_screen_height / 2.0f);
batJoro 9:dc13042b09f5 91
batJoro 8:b3738229ba85 92 for (int x = 0; x < _screen_width; x++) {
batJoro 8:b3738229ba85 93
batJoro 9:dc13042b09f5 94
batJoro 9:dc13042b09f5 95
batJoro 9:dc13042b09f5 96 float fPointCentre = 0.5f + _curvature * powf((1.0f - fPerspective), 3);
batJoro 9:dc13042b09f5 97 float fRoadSpace = 0.1f + fPerspective * 0.8f;
batJoro 8:b3738229ba85 98 float fSideSpace = fRoadSpace * 0.15f;
batJoro 8:b3738229ba85 99
batJoro 8:b3738229ba85 100 // for easier calculating the sides
batJoro 8:b3738229ba85 101 fRoadSpace *= 0.5f;
batJoro 8:b3738229ba85 102
batJoro 8:b3738229ba85 103 int leftGrass = (fPointCentre - fRoadSpace - fSideSpace) * _screen_width;
batJoro 8:b3738229ba85 104 int leftSide = (fPointCentre - fRoadSpace) * _screen_width;
batJoro 8:b3738229ba85 105 int rightGrass = (fPointCentre + fRoadSpace + fSideSpace) * _screen_width;
batJoro 8:b3738229ba85 106 int rightSide = (fPointCentre + fRoadSpace) * _screen_width;
batJoro 8:b3738229ba85 107
batJoro 8:b3738229ba85 108 int row = _screen_height / 2 + y;
batJoro 8:b3738229ba85 109
batJoro 9:dc13042b09f5 110 float GrassColour = sinf(20.0f * powf(1.0f - fPerspective, 3) + _distance * 0.1f);
batJoro 9:dc13042b09f5 111 if (GrassColour > 0.0f) GrassColour = 1.0f;
batJoro 9:dc13042b09f5 112 else GrassColour = 0.0f;
batJoro 9:dc13042b09f5 113
batJoro 9:dc13042b09f5 114 float SideColour = sinf(40.0f * powf(1.0f - fPerspective, 3) + _distance * 0.1f);
batJoro 9:dc13042b09f5 115 if (SideColour > 0.0f) SideColour = 1.0f;
batJoro 9:dc13042b09f5 116 else SideColour = 0.0f;
batJoro 9:dc13042b09f5 117
batJoro 8:b3738229ba85 118 if ( x >= 0 && x < leftGrass) {
batJoro 9:dc13042b09f5 119 if ( GrassColour == 0.0f )
batJoro 8:b3738229ba85 120 lcd.setPixel(x, row, true);
batJoro 8:b3738229ba85 121 }
batJoro 8:b3738229ba85 122 if ( x >= leftGrass && x < leftSide) {
batJoro 9:dc13042b09f5 123 if ( x % 2 ==0)
batJoro 9:dc13042b09f5 124 if ( SideColour == 0.0f )
batJoro 9:dc13042b09f5 125 lcd.setPixel(x, row, true);
batJoro 8:b3738229ba85 126 }
batJoro 8:b3738229ba85 127 if ( x >= rightSide && x < rightGrass ) {
batJoro 9:dc13042b09f5 128 if ( x % 2 ==0)
batJoro 9:dc13042b09f5 129 if ( SideColour == 0.0f )
batJoro 9:dc13042b09f5 130 lcd.setPixel(x, row, true);
batJoro 8:b3738229ba85 131 }
batJoro 8:b3738229ba85 132 if ( x >= rightGrass && x < _screen_width) {
batJoro 9:dc13042b09f5 133 if ( GrassColour == 0.0f )
batJoro 8:b3738229ba85 134 lcd.setPixel(x, row, true);
batJoro 8:b3738229ba85 135 }
batJoro 8:b3738229ba85 136 }
batJoro 8:b3738229ba85 137 }
batJoro 9:dc13042b09f5 138 // draw car
batJoro 9:dc13042b09f5 139 int nCarPosition = _screen_width / 2 + ((int)_screen_width * _car_positon / 2.0f) - 9;
batJoro 9:dc13042b09f5 140
batJoro 9:dc13042b09f5 141 lcd.drawSprite(nCarPosition, 36, 6, 9, car1);
batJoro 8:b3738229ba85 142 lcd.refresh();
batJoro 9:dc13042b09f5 143
batJoro 8:b3738229ba85 144 }
batJoro 8:b3738229ba85 145
batJoro 8:b3738229ba85 146 int Engine::car1[6*9] = {
batJoro 8:b3738229ba85 147 0,0,0,0,1,0,0,0,0,
batJoro 8:b3738229ba85 148 0,0,0,1,1,1,0,0,0,
batJoro 8:b3738229ba85 149 0,0,0,1,1,1,0,0,0,
batJoro 8:b3738229ba85 150 1,0,1,1,1,1,1,0,1,
batJoro 8:b3738229ba85 151 1,1,1,1,1,1,1,1,1,
batJoro 8:b3738229ba85 152 0,0,0,1,0,1,0,0,0
batJoro 8:b3738229ba85 153 };
batJoro 8:b3738229ba85 154
batJoro 8:b3738229ba85 155 int Engine::car2[6*9] = {
batJoro 8:b3738229ba85 156 0,0,1,0,0,1,1,0,0,
batJoro 8:b3738229ba85 157 0,1,0,0,1,1,1,0,0,
batJoro 8:b3738229ba85 158 0,1,1,1,1,1,0,0,0,
batJoro 8:b3738229ba85 159 1,0,1,1,1,0,0,0,0,
batJoro 8:b3738229ba85 160 0,0,0,1,1,1,1,0,0,
batJoro 8:b3738229ba85 161 0,0,1,0,0,0,0,0,0
batJoro 8:b3738229ba85 162 };
batJoro 8:b3738229ba85 163
batJoro 8:b3738229ba85 164 int Engine::car3[6*9] = {
batJoro 8:b3738229ba85 165 0,0,1,1,0,0,1,0,0,
batJoro 8:b3738229ba85 166 0,0,1,1,1,0,0,1,0,
batJoro 8:b3738229ba85 167 0,0,0,1,1,1,1,1,0,
batJoro 8:b3738229ba85 168 0,0,0,0,1,1,1,0,1,
batJoro 8:b3738229ba85 169 0,0,1,1,1,1,0,0,0,
batJoro 8:b3738229ba85 170 0,0,0,0,0,0,1,0,0
batJoro 8:b3738229ba85 171 };