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: 4DGL-uLCD-SE mbed wave_player
Fork of MazeRunner_Fall2017-shell by
wall.cpp@1:2c6ae0fe9a2a, 2017-12-29 (annotated)
- Committer:
- navaem
- Date:
- Fri Dec 29 15:32:31 2017 +0000
- Revision:
- 1:2c6ae0fe9a2a
- Parent:
- 0:cf4396614a79
December 29, 2017;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rconnorlawson | 0:cf4396614a79 | 1 | #include "wall.h" |
rconnorlawson | 0:cf4396614a79 | 2 | |
rconnorlawson | 0:cf4396614a79 | 3 | #include "globals.h" |
rconnorlawson | 0:cf4396614a79 | 4 | #include "physics.h" |
rconnorlawson | 0:cf4396614a79 | 5 | #include "game.h" |
rconnorlawson | 0:cf4396614a79 | 6 | #include "math_extra.h" |
rconnorlawson | 0:cf4396614a79 | 7 | |
navaem | 1:2c6ae0fe9a2a | 8 | #include <math.h> |
navaem | 1:2c6ae0fe9a2a | 9 | |
rconnorlawson | 0:cf4396614a79 | 10 | Wall* create_wall(int direction, int x, int y, int length, float bounce) |
rconnorlawson | 0:cf4396614a79 | 11 | { |
rconnorlawson | 0:cf4396614a79 | 12 | // Alocate memory for wall |
rconnorlawson | 0:cf4396614a79 | 13 | Wall* wall = (Wall*) malloc(sizeof(Wall)); |
rconnorlawson | 0:cf4396614a79 | 14 | |
rconnorlawson | 0:cf4396614a79 | 15 | // Initialize type info. |
rconnorlawson | 0:cf4396614a79 | 16 | // Always draw on the first frame |
rconnorlawson | 0:cf4396614a79 | 17 | wall->type = WALL; |
rconnorlawson | 0:cf4396614a79 | 18 | wall->should_draw = 1; |
rconnorlawson | 0:cf4396614a79 | 19 | |
rconnorlawson | 0:cf4396614a79 | 20 | // Set user parameters |
rconnorlawson | 0:cf4396614a79 | 21 | wall->direction = direction; |
rconnorlawson | 0:cf4396614a79 | 22 | wall->x = x; |
rconnorlawson | 0:cf4396614a79 | 23 | wall->y = y; |
rconnorlawson | 0:cf4396614a79 | 24 | wall->length = length; |
rconnorlawson | 0:cf4396614a79 | 25 | wall->bounce = bounce; |
rconnorlawson | 0:cf4396614a79 | 26 | |
rconnorlawson | 0:cf4396614a79 | 27 | return wall; |
rconnorlawson | 0:cf4396614a79 | 28 | } |
rconnorlawson | 0:cf4396614a79 | 29 | |
navaem | 1:2c6ae0fe9a2a | 30 | int do_wall(Physics* next, const Physics* curr, Wall* wall, float delta) |
rconnorlawson | 0:cf4396614a79 | 31 | { |
rconnorlawson | 0:cf4396614a79 | 32 | // Debug info |
rconnorlawson | 0:cf4396614a79 | 33 | // pc.printf("wall: %d %d %d %d\r\n", wall->direction, wall->x, wall->y, wall->length); |
navaem | 1:2c6ae0fe9a2a | 34 | int hit = 0; |
rconnorlawson | 0:cf4396614a79 | 35 | float adj, percent, contact; |
rconnorlawson | 0:cf4396614a79 | 36 | |
rconnorlawson | 0:cf4396614a79 | 37 | if (wall->direction == VERTICAL) |
rconnorlawson | 0:cf4396614a79 | 38 | { |
rconnorlawson | 0:cf4396614a79 | 39 | // Step 0: Adjust the wall location based on ball radius |
rconnorlawson | 0:cf4396614a79 | 40 | adj = wall->x - sgn(curr->vx)*(radius+1); |
rconnorlawson | 0:cf4396614a79 | 41 | |
rconnorlawson | 0:cf4396614a79 | 42 | // Step 1: Compute percent of motion before bounce |
rconnorlawson | 0:cf4396614a79 | 43 | percent = (adj - curr->px) / (curr->vx*delta); |
rconnorlawson | 0:cf4396614a79 | 44 | |
rconnorlawson | 0:cf4396614a79 | 45 | // Negative percent means we're moving away from the wall |
rconnorlawson | 0:cf4396614a79 | 46 | // >=100% means we don't need to bounce yet |
rconnorlawson | 0:cf4396614a79 | 47 | if (percent >= 0.0 && percent < 1.0) |
rconnorlawson | 0:cf4396614a79 | 48 | { |
rconnorlawson | 0:cf4396614a79 | 49 | // Compute the bounce location |
rconnorlawson | 0:cf4396614a79 | 50 | contact = curr->py + curr->vy*percent*delta; |
rconnorlawson | 0:cf4396614a79 | 51 | if (in_range(contact, wall->y, wall->y + wall->length)) |
rconnorlawson | 0:cf4396614a79 | 52 | { |
rconnorlawson | 0:cf4396614a79 | 53 | |
rconnorlawson | 0:cf4396614a79 | 54 | // Reverse velocity and slow down |
rconnorlawson | 0:cf4396614a79 | 55 | next->vx = -wall->bounce*curr->vx; |
rconnorlawson | 0:cf4396614a79 | 56 | |
rconnorlawson | 0:cf4396614a79 | 57 | // Adjust X position. |
rconnorlawson | 0:cf4396614a79 | 58 | // This dampens the integration based on how far the ball had |
rconnorlawson | 0:cf4396614a79 | 59 | // to travel before reflecting. |
rconnorlawson | 0:cf4396614a79 | 60 | next->px = adj - percent*next->vx*delta; |
navaem | 1:2c6ae0fe9a2a | 61 | if (fabs(curr->vx) > 5) |
navaem | 1:2c6ae0fe9a2a | 62 | hit = 1; |
rconnorlawson | 0:cf4396614a79 | 63 | } |
rconnorlawson | 0:cf4396614a79 | 64 | // Draw the wall if we're close by |
rconnorlawson | 0:cf4396614a79 | 65 | wall->should_draw = 1; |
rconnorlawson | 0:cf4396614a79 | 66 | } |
rconnorlawson | 0:cf4396614a79 | 67 | |
rconnorlawson | 0:cf4396614a79 | 68 | // Make sure we aren't inside the wall |
rconnorlawson | 0:cf4396614a79 | 69 | if (in_range((int)curr->px, wall->x - (radius+1), wall->x + (radius+1)) |
rconnorlawson | 0:cf4396614a79 | 70 | && in_range((int)curr->py, wall->y, wall->y + wall->length)) |
rconnorlawson | 0:cf4396614a79 | 71 | { |
rconnorlawson | 0:cf4396614a79 | 72 | next->px = wall->x + sgn(curr->px - wall->x)*(radius+1); |
rconnorlawson | 0:cf4396614a79 | 73 | wall->should_draw = 1; |
rconnorlawson | 0:cf4396614a79 | 74 | } |
rconnorlawson | 0:cf4396614a79 | 75 | } |
rconnorlawson | 0:cf4396614a79 | 76 | else //direction == HORIZONTAL |
rconnorlawson | 0:cf4396614a79 | 77 | { |
rconnorlawson | 0:cf4396614a79 | 78 | // Same as vertical case, but swap x/y |
rconnorlawson | 0:cf4396614a79 | 79 | adj = wall->y - sgn(curr->vy)*(radius+1); |
rconnorlawson | 0:cf4396614a79 | 80 | percent = (adj - curr->py) / (curr->vy*delta); |
rconnorlawson | 0:cf4396614a79 | 81 | if (percent >= 0.0 && percent < 1.0) |
rconnorlawson | 0:cf4396614a79 | 82 | { |
rconnorlawson | 0:cf4396614a79 | 83 | contact = curr->px + curr->vx*percent*delta; |
rconnorlawson | 0:cf4396614a79 | 84 | if (in_range(contact, wall->x, wall->x + wall->length)) |
rconnorlawson | 0:cf4396614a79 | 85 | { |
rconnorlawson | 0:cf4396614a79 | 86 | next->vy = -wall->bounce*curr->vy; |
rconnorlawson | 0:cf4396614a79 | 87 | next->py = adj - percent*next->vy*delta; |
navaem | 1:2c6ae0fe9a2a | 88 | if (fabs(curr->vy) > 5) |
navaem | 1:2c6ae0fe9a2a | 89 | hit = 1; |
navaem | 1:2c6ae0fe9a2a | 90 | |
rconnorlawson | 0:cf4396614a79 | 91 | } |
rconnorlawson | 0:cf4396614a79 | 92 | // Draw the wall if we bounce |
rconnorlawson | 0:cf4396614a79 | 93 | wall->should_draw = 1; |
navaem | 1:2c6ae0fe9a2a | 94 | |
rconnorlawson | 0:cf4396614a79 | 95 | } |
rconnorlawson | 0:cf4396614a79 | 96 | if (in_range((int)curr->py, wall->y - (radius+1), wall->y + (radius+1)) |
rconnorlawson | 0:cf4396614a79 | 97 | && in_range((int)curr->px, wall->x, wall->x + wall->length)) |
rconnorlawson | 0:cf4396614a79 | 98 | { |
rconnorlawson | 0:cf4396614a79 | 99 | next->py = wall->y + sgn(curr->py - wall->y)*(radius+1); |
rconnorlawson | 0:cf4396614a79 | 100 | wall->should_draw = 1; |
rconnorlawson | 0:cf4396614a79 | 101 | } |
rconnorlawson | 0:cf4396614a79 | 102 | } |
navaem | 1:2c6ae0fe9a2a | 103 | return hit; |
rconnorlawson | 0:cf4396614a79 | 104 | } |
rconnorlawson | 0:cf4396614a79 | 105 | |
rconnorlawson | 0:cf4396614a79 | 106 | void draw_wall(Wall* wall) |
rconnorlawson | 0:cf4396614a79 | 107 | { |
rconnorlawson | 0:cf4396614a79 | 108 | if (wall->should_draw) |
rconnorlawson | 0:cf4396614a79 | 109 | { |
rconnorlawson | 0:cf4396614a79 | 110 | int wx1, wx2, wy1, wy2; |
rconnorlawson | 0:cf4396614a79 | 111 | wx1 = wall->x; |
rconnorlawson | 0:cf4396614a79 | 112 | wy1 = wall->y; |
rconnorlawson | 0:cf4396614a79 | 113 | wx2 = wx1 + ((wall->direction == HORIZONTAL) ? wall->length : 0); |
rconnorlawson | 0:cf4396614a79 | 114 | wy2 = wy1 + ((wall->direction == VERTICAL) ? wall->length : 0); |
rconnorlawson | 0:cf4396614a79 | 115 | uLCD.line(wx1, wy1, wx2, wy2, WHITE); |
rconnorlawson | 0:cf4396614a79 | 116 | |
rconnorlawson | 0:cf4396614a79 | 117 | // Don't draw again unless requested |
rconnorlawson | 0:cf4396614a79 | 118 | wall->should_draw = 0; |
rconnorlawson | 0:cf4396614a79 | 119 | } |
rconnorlawson | 0:cf4396614a79 | 120 | } |