Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
GameEngine/engine.cpp@9:dc13042b09f5, 2019-05-05 (annotated)
- 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?
| User | Revision | Line number | New 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 | }; |