Eduardo Nava / Mbed 2 deprecated MazeRunner_Fall2017

Dependencies:   4DGL-uLCD-SE mbed wave_player

Fork of MazeRunner_Fall2017-shell by Eduardo Nava

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?

UserRevisionLine numberNew 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 }