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
Fork of el17zl by
PushingEngine/PushingEngine.cpp@2:9f0d9516a6cd, 2019-03-24 (annotated)
- Committer:
- franklzw
- Date:
- Sun Mar 24 10:45:30 2019 +0000
- Revision:
- 2:9f0d9516a6cd
- Child:
- 3:9fa31396d89d
second commit 24/3/2019
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| franklzw | 2:9f0d9516a6cd | 1 | #include "PushingEngine.h" |
| franklzw | 2:9f0d9516a6cd | 2 | |
| franklzw | 2:9f0d9516a6cd | 3 | PushingEngine::PushingEngine() |
| franklzw | 2:9f0d9516a6cd | 4 | { |
| franklzw | 2:9f0d9516a6cd | 5 | |
| franklzw | 2:9f0d9516a6cd | 6 | } |
| franklzw | 2:9f0d9516a6cd | 7 | |
| franklzw | 2:9f0d9516a6cd | 8 | PushingEngine::~PushingEngine() |
| franklzw | 2:9f0d9516a6cd | 9 | { |
| franklzw | 2:9f0d9516a6cd | 10 | |
| franklzw | 2:9f0d9516a6cd | 11 | } |
| franklzw | 2:9f0d9516a6cd | 12 | |
| franklzw | 2:9f0d9516a6cd | 13 | void PushingEngine::init(int box1_x,int box1_y,int box2_x,int box2_y, |
| franklzw | 2:9f0d9516a6cd | 14 | int ppl_x,int ppl_y, |
| franklzw | 2:9f0d9516a6cd | 15 | int cross1_x,int corss2_x,int cross1_x,int cross2_y) |
| franklzw | 2:9f0d9516a6cd | 16 | { |
| franklzw | 2:9f0d9516a6cd | 17 | // boxes position on screen |
| franklzw | 2:9f0d9516a6cd | 18 | _b1x = box1_x; |
| franklzw | 2:9f0d9516a6cd | 19 | _b2x = box2_x; |
| franklzw | 2:9f0d9516a6cd | 20 | _b1y = box1_y; |
| franklzw | 2:9f0d9516a6cd | 21 | _b2y = box2_y; |
| franklzw | 2:9f0d9516a6cd | 22 | |
| franklzw | 2:9f0d9516a6cd | 23 | // ppl position on screen |
| franklzw | 2:9f0d9516a6cd | 24 | _pplx = ppl_x; |
| franklzw | 2:9f0d9516a6cd | 25 | _pply = ppl_y; |
| franklzw | 2:9f0d9516a6cd | 26 | |
| franklzw | 2:9f0d9516a6cd | 27 | //cross position on screen |
| franklzw | 2:9f0d9516a6cd | 28 | _c1x = cross1_x; |
| franklzw | 2:9f0d9516a6cd | 29 | _c2x = cross2_x; |
| franklzw | 2:9f0d9516a6cd | 30 | _c1y = cross1_y; |
| franklzw | 2:9f0d9516a6cd | 31 | _c2y = cross2_y; |
| franklzw | 2:9f0d9516a6cd | 32 | |
| franklzw | 2:9f0d9516a6cd | 33 | // inital boxes cross and ppl |
| franklzw | 2:9f0d9516a6cd | 34 | _b1.init(_b1x,_b1y); |
| franklzw | 2:9f0d9516a6cd | 35 | _b2.init(_b2x,_b2y); |
| franklzw | 2:9f0d9516a6cd | 36 | _ppl.init(_pplx,_pply); |
| franklzw | 2:9f0d9516a6cd | 37 | _c1.init(_c1x,_c1y); |
| franklzw | 2:9f0d9516a6cd | 38 | _c2.init(_c2x,_c2y); |
| franklzw | 2:9f0d9516a6cd | 39 | } |
| franklzw | 2:9f0d9516a6cd | 40 | |
| franklzw | 2:9f0d9516a6cd | 41 | void PushingEngine::read_input(Gamepad &pad) |
| franklzw | 2:9f0d9516a6cd | 42 | { |
| franklzw | 2:9f0d9516a6cd | 43 | _d = pad.get_direction(); // return direction of joystick |
| franklzw | 2:9f0d9516a6cd | 44 | _mag = pad.get_mag(); |
| franklzw | 2:9f0d9516a6cd | 45 | } |
| franklzw | 2:9f0d9516a6cd | 46 | |
| franklzw | 2:9f0d9516a6cd | 47 | void PushingEngine::draw(N5110 &lcd) |
| franklzw | 2:9f0d9516a6cd | 48 | { |
| franklzw | 2:9f0d9516a6cd | 49 | // draw the elements in the LCD buffer |
| franklzw | 2:9f0d9516a6cd | 50 | // pitch |
| franklzw | 2:9f0d9516a6cd | 51 | lcd.drawRect(0,0,WIDTH,HEIGHT,FILL_TRANSPARENT); |
| franklzw | 2:9f0d9516a6cd | 52 | // scores |
| franklzw | 2:9f0d9516a6cd | 53 | print_scores(lcd); |
| franklzw | 2:9f0d9516a6cd | 54 | // boxes |
| franklzw | 2:9f0d9516a6cd | 55 | _b1.draw(lcd); |
| franklzw | 2:9f0d9516a6cd | 56 | _b2.draw(lcd); |
| franklzw | 2:9f0d9516a6cd | 57 | // ppl |
| franklzw | 2:9f0d9516a6cd | 58 | _ppl.draw(lcd); |
| franklzw | 2:9f0d9516a6cd | 59 | //cross |
| franklzw | 2:9f0d9516a6cd | 60 | _c1.draw(lcd); |
| franklzw | 2:9f0d9516a6cd | 61 | _c2.draw(lcd); |
| franklzw | 2:9f0d9516a6cd | 62 | } |
| franklzw | 2:9f0d9516a6cd | 63 | |
| franklzw | 2:9f0d9516a6cd | 64 | void PushingEngine::update(Gamepad &pad) |
| franklzw | 2:9f0d9516a6cd | 65 | { |
| franklzw | 2:9f0d9516a6cd | 66 | check_goal(pad); |
| franklzw | 2:9f0d9516a6cd | 67 | // important to update boxes and crosses before checking collisions so can |
| franklzw | 2:9f0d9516a6cd | 68 | // correct for it before updating the display |
| franklzw | 2:9f0d9516a6cd | 69 | _b1.update(_d,_mag); |
| franklzw | 2:9f0d9516a6cd | 70 | _b2.update(_d,_mag); |
| franklzw | 2:9f0d9516a6cd | 71 | _ppl.update(); |
| franklzw | 2:9f0d9516a6cd | 72 | _c1.update(); |
| franklzw | 2:9f0d9516a6cd | 73 | _c2.update(); |
| franklzw | 2:9f0d9516a6cd | 74 | |
| franklzw | 2:9f0d9516a6cd | 75 | //check_wall_collision(pad); |
| franklzw | 2:9f0d9516a6cd | 76 | //check_paddle_collisions(pad); |
| franklzw | 2:9f0d9516a6cd | 77 | } |
| franklzw | 2:9f0d9516a6cd | 78 | |
| franklzw | 2:9f0d9516a6cd | 79 | void PushingEngine::check_wall_collision(Gamepad &pad) |
| franklzw | 2:9f0d9516a6cd | 80 | { |
| franklzw | 2:9f0d9516a6cd | 81 | // read current ball attributes |
| franklzw | 2:9f0d9516a6cd | 82 | Vector2D box1_pos = _b1.get_pos(); |
| franklzw | 2:9f0d9516a6cd | 83 | Vector2D box2_pos = _b2.get_pos(); |
| franklzw | 2:9f0d9516a6cd | 84 | |
| franklzw | 2:9f0d9516a6cd | 85 | // check if topleft touch wall |
| franklzw | 2:9f0d9516a6cd | 86 | if (box1_pos.y <= 1 ||box1_pos.x <= 1) { // 1 due to 1 pixel boundary |
| franklzw | 2:9f0d9516a6cd | 87 | box1_pos.y = 1; // keep the position at (1,1) |
| franklzw | 2:9f0d9516a6cd | 88 | // audio feedback |
| franklzw | 2:9f0d9516a6cd | 89 | pad.tone(750.0,0.1); |
| franklzw | 2:9f0d9516a6cd | 90 | } |
| franklzw | 2:9f0d9516a6cd | 91 | // check if hit bottom wall |
| franklzw | 2:9f0d9516a6cd | 92 | else if (ball_pos.y + _ball_size >= (HEIGHT-1) ) { // bottom pixel is 47 |
| franklzw | 2:9f0d9516a6cd | 93 | // hit bottom |
| franklzw | 2:9f0d9516a6cd | 94 | ball_pos.y = (HEIGHT-1) - _ball_size; // stops ball going off screen |
| franklzw | 2:9f0d9516a6cd | 95 | ball_velocity.y = -ball_velocity.y; |
| franklzw | 2:9f0d9516a6cd | 96 | // audio feedback |
| franklzw | 2:9f0d9516a6cd | 97 | pad.tone(750.0,0.1); |
| franklzw | 2:9f0d9516a6cd | 98 | } |
| franklzw | 2:9f0d9516a6cd | 99 | |
| franklzw | 2:9f0d9516a6cd | 100 | // update ball parameters |
| franklzw | 2:9f0d9516a6cd | 101 | _ball.set_velocity(ball_velocity); |
| franklzw | 2:9f0d9516a6cd | 102 | _ball.set_pos(ball_pos); |
| franklzw | 2:9f0d9516a6cd | 103 | } |
| franklzw | 2:9f0d9516a6cd | 104 | |
| franklzw | 2:9f0d9516a6cd | 105 | void PushingEngine::check_paddle_collisions(Gamepad &pad) |
| franklzw | 2:9f0d9516a6cd | 106 | { |
| franklzw | 2:9f0d9516a6cd | 107 | // read current ball attributes |
| franklzw | 2:9f0d9516a6cd | 108 | Vector2D ball_pos = _ball.get_pos(); |
| franklzw | 2:9f0d9516a6cd | 109 | Vector2D ball_velocity = _ball.get_velocity(); |
| franklzw | 2:9f0d9516a6cd | 110 | |
| franklzw | 2:9f0d9516a6cd | 111 | // check p1 first |
| franklzw | 2:9f0d9516a6cd | 112 | Vector2D p1_pos = _p1.get_pos(); |
| franklzw | 2:9f0d9516a6cd | 113 | |
| franklzw | 2:9f0d9516a6cd | 114 | // see if ball has hit the paddle by checking for overlaps |
| franklzw | 2:9f0d9516a6cd | 115 | if ( |
| franklzw | 2:9f0d9516a6cd | 116 | (ball_pos.y >= p1_pos.y) && //top |
| franklzw | 2:9f0d9516a6cd | 117 | (ball_pos.y <= p1_pos.y + _paddle_height) && //bottom |
| franklzw | 2:9f0d9516a6cd | 118 | (ball_pos.x >= _p1x) && //left |
| franklzw | 2:9f0d9516a6cd | 119 | (ball_pos.x <= _p1x + _paddle_width) //right |
| franklzw | 2:9f0d9516a6cd | 120 | ) { |
| franklzw | 2:9f0d9516a6cd | 121 | // if it has, fix position and reflect x velocity |
| franklzw | 2:9f0d9516a6cd | 122 | ball_pos.x = _p1x + _paddle_width; |
| franklzw | 2:9f0d9516a6cd | 123 | ball_velocity.x = -ball_velocity.x; |
| franklzw | 2:9f0d9516a6cd | 124 | // audio feedback |
| franklzw | 2:9f0d9516a6cd | 125 | pad.tone(1000.0,0.1); |
| franklzw | 2:9f0d9516a6cd | 126 | } |
| franklzw | 2:9f0d9516a6cd | 127 | |
| franklzw | 2:9f0d9516a6cd | 128 | // check p2 next |
| franklzw | 2:9f0d9516a6cd | 129 | Vector2D p2_pos = _p2.get_pos(); |
| franklzw | 2:9f0d9516a6cd | 130 | |
| franklzw | 2:9f0d9516a6cd | 131 | // see if ball has hit the paddle by checking for overlaps |
| franklzw | 2:9f0d9516a6cd | 132 | if ( |
| franklzw | 2:9f0d9516a6cd | 133 | (ball_pos.y >= p2_pos.y) && //top |
| franklzw | 2:9f0d9516a6cd | 134 | (ball_pos.y <= p2_pos.y + _paddle_height) && //bottom |
| franklzw | 2:9f0d9516a6cd | 135 | (ball_pos.x + _ball_size >= _p2x) && //left |
| franklzw | 2:9f0d9516a6cd | 136 | (ball_pos.x + _ball_size <= _p2x + _paddle_width) //right |
| franklzw | 2:9f0d9516a6cd | 137 | ) { |
| franklzw | 2:9f0d9516a6cd | 138 | // if it has, fix position and reflect x velocity |
| franklzw | 2:9f0d9516a6cd | 139 | ball_pos.x = _p2x - _ball_size; |
| franklzw | 2:9f0d9516a6cd | 140 | ball_velocity.x = -ball_velocity.x; |
| franklzw | 2:9f0d9516a6cd | 141 | // audio feedback |
| franklzw | 2:9f0d9516a6cd | 142 | pad.tone(1000.0,0.1); |
| franklzw | 2:9f0d9516a6cd | 143 | } |
| franklzw | 2:9f0d9516a6cd | 144 | |
| franklzw | 2:9f0d9516a6cd | 145 | // write new attributes |
| franklzw | 2:9f0d9516a6cd | 146 | _ball.set_velocity(ball_velocity); |
| franklzw | 2:9f0d9516a6cd | 147 | _ball.set_pos(ball_pos); |
| franklzw | 2:9f0d9516a6cd | 148 | } |
| franklzw | 2:9f0d9516a6cd | 149 | |
| franklzw | 2:9f0d9516a6cd | 150 | void PongEngine::check_goal(Gamepad &pad) |
| franklzw | 2:9f0d9516a6cd | 151 | { |
| franklzw | 2:9f0d9516a6cd | 152 | Vector2D ball_pos = _ball.get_pos(); |
| franklzw | 2:9f0d9516a6cd | 153 | // P2 has scored |
| franklzw | 2:9f0d9516a6cd | 154 | if (ball_pos.x + _ball_size < 0) { |
| franklzw | 2:9f0d9516a6cd | 155 | _p2.add_score(); |
| franklzw | 2:9f0d9516a6cd | 156 | _ball.init(_ball_size,_speed); |
| franklzw | 2:9f0d9516a6cd | 157 | pad.tone(1500.0,0.5); |
| franklzw | 2:9f0d9516a6cd | 158 | pad.leds_on(); |
| franklzw | 2:9f0d9516a6cd | 159 | wait(0.5); |
| franklzw | 2:9f0d9516a6cd | 160 | pad.leds_off(); |
| franklzw | 2:9f0d9516a6cd | 161 | } |
| franklzw | 2:9f0d9516a6cd | 162 | |
| franklzw | 2:9f0d9516a6cd | 163 | // P1 has scored |
| franklzw | 2:9f0d9516a6cd | 164 | if (ball_pos.x > WIDTH) { |
| franklzw | 2:9f0d9516a6cd | 165 | _p1.add_score(); |
| franklzw | 2:9f0d9516a6cd | 166 | _ball.init(_ball_size,_speed); |
| franklzw | 2:9f0d9516a6cd | 167 | pad.tone(1500.0,0.5); |
| franklzw | 2:9f0d9516a6cd | 168 | pad.leds_on(); |
| franklzw | 2:9f0d9516a6cd | 169 | wait(0.5); |
| franklzw | 2:9f0d9516a6cd | 170 | pad.leds_off(); |
| franklzw | 2:9f0d9516a6cd | 171 | } |
| franklzw | 2:9f0d9516a6cd | 172 | } |
| franklzw | 2:9f0d9516a6cd | 173 | |
| franklzw | 2:9f0d9516a6cd | 174 | void PongEngine::print_scores(N5110 &lcd) |
| franklzw | 2:9f0d9516a6cd | 175 | { |
| franklzw | 2:9f0d9516a6cd | 176 | // get scores from paddles |
| franklzw | 2:9f0d9516a6cd | 177 | int p1_score = _p1.get_score(); |
| franklzw | 2:9f0d9516a6cd | 178 | int p2_score = _p2.get_score(); |
| franklzw | 2:9f0d9516a6cd | 179 | |
| franklzw | 2:9f0d9516a6cd | 180 | // print to LCD i |
| franklzw | 2:9f0d9516a6cd | 181 | char buffer1[14]; |
| franklzw | 2:9f0d9516a6cd | 182 | sprintf(buffer1,"%2d",p1_score); |
| franklzw | 2:9f0d9516a6cd | 183 | lcd.printString(buffer1,WIDTH/2 - 20,1); // font is 8 wide, so leave 4 pixel gape from middle assuming two digits |
| franklzw | 2:9f0d9516a6cd | 184 | char buffer2[14]; |
| franklzw | 2:9f0d9516a6cd | 185 | sprintf(buffer2,"%2d",p2_score); |
| franklzw | 2:9f0d9516a6cd | 186 | lcd.printString(buffer2,WIDTH/2 + 4,1); |
| franklzw | 2:9f0d9516a6cd | 187 | } |
