This is the code for LCD bouncing ball game.
Dependencies: 4DGL-uLCD-SE LSM9DS0 mbed
main.cpp@0:eda8882a56f9, 2015-10-19 (annotated)
- Committer:
- fengspot
- Date:
- Mon Oct 19 18:52:57 2015 +0000
- Revision:
- 0:eda8882a56f9
LCD
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
fengspot | 0:eda8882a56f9 | 1 | // LSM9DS90/uLCD Demo |
fengspot | 0:eda8882a56f9 | 2 | // ECE 4180 Lab Code Template |
fengspot | 0:eda8882a56f9 | 3 | |
fengspot | 0:eda8882a56f9 | 4 | #include "mbed.h" |
fengspot | 0:eda8882a56f9 | 5 | #include "LSM9DS0.h" |
fengspot | 0:eda8882a56f9 | 6 | #include "uLCD_4DGL.h" |
fengspot | 0:eda8882a56f9 | 7 | #include <stdio.h> |
fengspot | 0:eda8882a56f9 | 8 | #include <stdlib.h> |
fengspot | 0:eda8882a56f9 | 9 | #include <time.h> |
fengspot | 0:eda8882a56f9 | 10 | |
fengspot | 0:eda8882a56f9 | 11 | // uncomment this line to enable the uLCD for Part 4 of the lab |
fengspot | 0:eda8882a56f9 | 12 | #define PART_4 |
fengspot | 0:eda8882a56f9 | 13 | |
fengspot | 0:eda8882a56f9 | 14 | // SDO_XM and SDO_G are pulled up, so our addresses are: |
fengspot | 0:eda8882a56f9 | 15 | #define LSM9DS0_XM_ADDR 0x1D // Would be 0x1E if SDO_XM is LOW |
fengspot | 0:eda8882a56f9 | 16 | #define LSM9DS0_G_ADDR 0x6B // Would be 0x6A if SDO_G is LOW |
fengspot | 0:eda8882a56f9 | 17 | |
fengspot | 0:eda8882a56f9 | 18 | // refresh time. set to 500 for part 2 and 50 for part 4 |
fengspot | 0:eda8882a56f9 | 19 | #define REFRESH_TIME_MS 200 |
fengspot | 0:eda8882a56f9 | 20 | |
fengspot | 0:eda8882a56f9 | 21 | // Verify that the pin assignments below match your breadboard |
fengspot | 0:eda8882a56f9 | 22 | LSM9DS0 imu(p9, p10, LSM9DS0_G_ADDR, LSM9DS0_XM_ADDR); |
fengspot | 0:eda8882a56f9 | 23 | Serial pc(USBTX, USBRX); |
fengspot | 0:eda8882a56f9 | 24 | |
fengspot | 0:eda8882a56f9 | 25 | #ifdef PART_4 |
fengspot | 0:eda8882a56f9 | 26 | uLCD_4DGL lcd(p28, p27, p30); |
fengspot | 0:eda8882a56f9 | 27 | #endif |
fengspot | 0:eda8882a56f9 | 28 | |
fengspot | 0:eda8882a56f9 | 29 | //Init Serial port and LSM9DS0 chip |
fengspot | 0:eda8882a56f9 | 30 | void setup() |
fengspot | 0:eda8882a56f9 | 31 | { |
fengspot | 0:eda8882a56f9 | 32 | #ifdef PART_4 |
fengspot | 0:eda8882a56f9 | 33 | lcd.baudrate(3000000); |
fengspot | 0:eda8882a56f9 | 34 | lcd.background_color(0); |
fengspot | 0:eda8882a56f9 | 35 | lcd.cls(); |
fengspot | 0:eda8882a56f9 | 36 | |
fengspot | 0:eda8882a56f9 | 37 | lcd.printf("Initializing..."); |
fengspot | 0:eda8882a56f9 | 38 | #endif |
fengspot | 0:eda8882a56f9 | 39 | |
fengspot | 0:eda8882a56f9 | 40 | // Use the begin() function to initialize the LSM9DS0 library. |
fengspot | 0:eda8882a56f9 | 41 | // You can either call it with no parameters (the easy way): |
fengspot | 0:eda8882a56f9 | 42 | uint16_t status = imu.begin(); |
fengspot | 0:eda8882a56f9 | 43 | } |
fengspot | 0:eda8882a56f9 | 44 | |
fengspot | 0:eda8882a56f9 | 45 | class Brick { |
fengspot | 0:eda8882a56f9 | 46 | |
fengspot | 0:eda8882a56f9 | 47 | public: |
fengspot | 0:eda8882a56f9 | 48 | int x; |
fengspot | 0:eda8882a56f9 | 49 | int y; |
fengspot | 0:eda8882a56f9 | 50 | int color; |
fengspot | 0:eda8882a56f9 | 51 | int width; |
fengspot | 0:eda8882a56f9 | 52 | int height; |
fengspot | 0:eda8882a56f9 | 53 | bool exist; |
fengspot | 0:eda8882a56f9 | 54 | |
fengspot | 0:eda8882a56f9 | 55 | Brick(){ |
fengspot | 0:eda8882a56f9 | 56 | width = 10; |
fengspot | 0:eda8882a56f9 | 57 | height = 5; |
fengspot | 0:eda8882a56f9 | 58 | exist = true; |
fengspot | 0:eda8882a56f9 | 59 | } |
fengspot | 0:eda8882a56f9 | 60 | |
fengspot | 0:eda8882a56f9 | 61 | void set(int x, int y){ |
fengspot | 0:eda8882a56f9 | 62 | this->x = x; |
fengspot | 0:eda8882a56f9 | 63 | this->y = y; |
fengspot | 0:eda8882a56f9 | 64 | } |
fengspot | 0:eda8882a56f9 | 65 | }; |
fengspot | 0:eda8882a56f9 | 66 | |
fengspot | 0:eda8882a56f9 | 67 | int main() |
fengspot | 0:eda8882a56f9 | 68 | { |
fengspot | 0:eda8882a56f9 | 69 | setup(); //Setup sensor and Serial |
fengspot | 0:eda8882a56f9 | 70 | lcd.cls(); |
fengspot | 0:eda8882a56f9 | 71 | |
fengspot | 0:eda8882a56f9 | 72 | int score = 0; |
fengspot | 0:eda8882a56f9 | 73 | Brick* wall[32]; |
fengspot | 0:eda8882a56f9 | 74 | srand(time(0)); |
fengspot | 0:eda8882a56f9 | 75 | for(int i = 0; i < 8; i ++){ |
fengspot | 0:eda8882a56f9 | 76 | for( int j = 0; j < 4; j++){ |
fengspot | 0:eda8882a56f9 | 77 | Brick * brick = new Brick(); |
fengspot | 0:eda8882a56f9 | 78 | brick->set(5 + i * brick->width, 20 + j * brick->height); |
fengspot | 0:eda8882a56f9 | 79 | int c = 0; |
fengspot | 0:eda8882a56f9 | 80 | int num = rand() % 8 + 1; |
fengspot | 0:eda8882a56f9 | 81 | switch (num) { |
fengspot | 0:eda8882a56f9 | 82 | case 1: |
fengspot | 0:eda8882a56f9 | 83 | c = 0xff0000; |
fengspot | 0:eda8882a56f9 | 84 | break; |
fengspot | 0:eda8882a56f9 | 85 | case 2: |
fengspot | 0:eda8882a56f9 | 86 | c = 0xffff00; |
fengspot | 0:eda8882a56f9 | 87 | break; |
fengspot | 0:eda8882a56f9 | 88 | case 3: |
fengspot | 0:eda8882a56f9 | 89 | c = 0x00FF00; |
fengspot | 0:eda8882a56f9 | 90 | break; |
fengspot | 0:eda8882a56f9 | 91 | case 4: |
fengspot | 0:eda8882a56f9 | 92 | c = 0x0000FF; |
fengspot | 0:eda8882a56f9 | 93 | break; |
fengspot | 0:eda8882a56f9 | 94 | case 5: |
fengspot | 0:eda8882a56f9 | 95 | c = 0xFFC0CB; |
fengspot | 0:eda8882a56f9 | 96 | break; |
fengspot | 0:eda8882a56f9 | 97 | case 6: |
fengspot | 0:eda8882a56f9 | 98 | c = 0xA52A2A; |
fengspot | 0:eda8882a56f9 | 99 | break; |
fengspot | 0:eda8882a56f9 | 100 | case 7: |
fengspot | 0:eda8882a56f9 | 101 | c = 0xd3d3d3; |
fengspot | 0:eda8882a56f9 | 102 | break; |
fengspot | 0:eda8882a56f9 | 103 | case 8: |
fengspot | 0:eda8882a56f9 | 104 | c = 0x800080; |
fengspot | 0:eda8882a56f9 | 105 | break; |
fengspot | 0:eda8882a56f9 | 106 | default: |
fengspot | 0:eda8882a56f9 | 107 | c = 0x445566; |
fengspot | 0:eda8882a56f9 | 108 | } |
fengspot | 0:eda8882a56f9 | 109 | brick->color = c; |
fengspot | 0:eda8882a56f9 | 110 | wall[i*4 + j] = brick; |
fengspot | 0:eda8882a56f9 | 111 | } |
fengspot | 0:eda8882a56f9 | 112 | } |
fengspot | 0:eda8882a56f9 | 113 | |
fengspot | 0:eda8882a56f9 | 114 | float player_x = 60.0; |
fengspot | 0:eda8882a56f9 | 115 | float player_y = 120.0; |
fengspot | 0:eda8882a56f9 | 116 | float p_width = 30.0; |
fengspot | 0:eda8882a56f9 | 117 | |
fengspot | 0:eda8882a56f9 | 118 | float ball_x = 23.0; |
fengspot | 0:eda8882a56f9 | 119 | float ball_y = 49.0; |
fengspot | 0:eda8882a56f9 | 120 | float ball_vx = 15.0; |
fengspot | 0:eda8882a56f9 | 121 | float ball_vy = 15.0; |
fengspot | 0:eda8882a56f9 | 122 | float ball_r = 2.0; |
fengspot | 0:eda8882a56f9 | 123 | float width = 110.0; |
fengspot | 0:eda8882a56f9 | 124 | float height = 120.0; |
fengspot | 0:eda8882a56f9 | 125 | bool end = false; |
fengspot | 0:eda8882a56f9 | 126 | bool win = false; |
fengspot | 0:eda8882a56f9 | 127 | |
fengspot | 0:eda8882a56f9 | 128 | while (!end && !win) |
fengspot | 0:eda8882a56f9 | 129 | { |
fengspot | 0:eda8882a56f9 | 130 | lcd.cls(); |
fengspot | 0:eda8882a56f9 | 131 | lcd.printf("score is %d", score); |
fengspot | 0:eda8882a56f9 | 132 | imu.readMag(); |
fengspot | 0:eda8882a56f9 | 133 | imu.readAccel(); |
fengspot | 0:eda8882a56f9 | 134 | |
fengspot | 0:eda8882a56f9 | 135 | for(int i = 0; i < 32; i++ ){ |
fengspot | 0:eda8882a56f9 | 136 | if(wall[i]->exist){ |
fengspot | 0:eda8882a56f9 | 137 | lcd.filled_rectangle(wall[i]->x, wall[i]->y, wall[i]->x + wall[i]->width, wall[i]->y + wall[i]->height, wall[i]->color); |
fengspot | 0:eda8882a56f9 | 138 | } |
fengspot | 0:eda8882a56f9 | 139 | } |
fengspot | 0:eda8882a56f9 | 140 | |
fengspot | 0:eda8882a56f9 | 141 | lcd.circle(ball_x, ball_y, ball_r, RED); |
fengspot | 0:eda8882a56f9 | 142 | lcd.line(player_x, player_y, player_x + p_width, player_y, BLUE); |
fengspot | 0:eda8882a56f9 | 143 | |
fengspot | 0:eda8882a56f9 | 144 | ball_x += ball_vx * 0.7; |
fengspot | 0:eda8882a56f9 | 145 | ball_y += ball_vy * 0.7; |
fengspot | 0:eda8882a56f9 | 146 | player_x = player_x - imu.ax_raw * 0.003; |
fengspot | 0:eda8882a56f9 | 147 | |
fengspot | 0:eda8882a56f9 | 148 | if(player_x + p_width > width){ |
fengspot | 0:eda8882a56f9 | 149 | player_x = width - p_width; |
fengspot | 0:eda8882a56f9 | 150 | } |
fengspot | 0:eda8882a56f9 | 151 | |
fengspot | 0:eda8882a56f9 | 152 | if(player_x < 0){ |
fengspot | 0:eda8882a56f9 | 153 | player_x = 0; |
fengspot | 0:eda8882a56f9 | 154 | } |
fengspot | 0:eda8882a56f9 | 155 | |
fengspot | 0:eda8882a56f9 | 156 | if(ball_x + ball_r > width){ |
fengspot | 0:eda8882a56f9 | 157 | ball_x = width - ball_r; |
fengspot | 0:eda8882a56f9 | 158 | ball_vx *= -1; |
fengspot | 0:eda8882a56f9 | 159 | } |
fengspot | 0:eda8882a56f9 | 160 | |
fengspot | 0:eda8882a56f9 | 161 | if(ball_x - ball_r < 0){ |
fengspot | 0:eda8882a56f9 | 162 | ball_x = ball_r; |
fengspot | 0:eda8882a56f9 | 163 | ball_vx *= -1; |
fengspot | 0:eda8882a56f9 | 164 | } |
fengspot | 0:eda8882a56f9 | 165 | |
fengspot | 0:eda8882a56f9 | 166 | if(ball_y + ball_r > height){ |
fengspot | 0:eda8882a56f9 | 167 | if(ball_x < player_x || ball_x > player_x + p_width){ |
fengspot | 0:eda8882a56f9 | 168 | end = true; |
fengspot | 0:eda8882a56f9 | 169 | } else { |
fengspot | 0:eda8882a56f9 | 170 | ball_y = height - ball_r; |
fengspot | 0:eda8882a56f9 | 171 | ball_vy *= -1; |
fengspot | 0:eda8882a56f9 | 172 | } |
fengspot | 0:eda8882a56f9 | 173 | } |
fengspot | 0:eda8882a56f9 | 174 | |
fengspot | 0:eda8882a56f9 | 175 | if(ball_y - ball_r < 0){ |
fengspot | 0:eda8882a56f9 | 176 | ball_y = ball_r; |
fengspot | 0:eda8882a56f9 | 177 | ball_vy *= -1; |
fengspot | 0:eda8882a56f9 | 178 | } |
fengspot | 0:eda8882a56f9 | 179 | |
fengspot | 0:eda8882a56f9 | 180 | for(int i = 0; i < 32; i++ ){ |
fengspot | 0:eda8882a56f9 | 181 | if(wall[i]->exist){ |
fengspot | 0:eda8882a56f9 | 182 | if (!(ball_x > wall[i]->x + wall[i]->width || |
fengspot | 0:eda8882a56f9 | 183 | ball_x + ball_r < wall[i]->x || |
fengspot | 0:eda8882a56f9 | 184 | ball_y > wall[i]->y + wall[i]->height || |
fengspot | 0:eda8882a56f9 | 185 | ball_y + ball_r < wall[i]->y)){ |
fengspot | 0:eda8882a56f9 | 186 | wall[i]->exist = false; |
fengspot | 0:eda8882a56f9 | 187 | score++; |
fengspot | 0:eda8882a56f9 | 188 | } |
fengspot | 0:eda8882a56f9 | 189 | } |
fengspot | 0:eda8882a56f9 | 190 | } |
fengspot | 0:eda8882a56f9 | 191 | if(score == 32){ |
fengspot | 0:eda8882a56f9 | 192 | win = true; |
fengspot | 0:eda8882a56f9 | 193 | } |
fengspot | 0:eda8882a56f9 | 194 | wait_ms(REFRESH_TIME_MS); |
fengspot | 0:eda8882a56f9 | 195 | } |
fengspot | 0:eda8882a56f9 | 196 | lcd.cls(); |
fengspot | 0:eda8882a56f9 | 197 | |
fengspot | 0:eda8882a56f9 | 198 | if(win){ |
fengspot | 0:eda8882a56f9 | 199 | lcd.printf("You Win!!!"); |
fengspot | 0:eda8882a56f9 | 200 | } else { |
fengspot | 0:eda8882a56f9 | 201 | lcd.printf("Game Over..."); |
fengspot | 0:eda8882a56f9 | 202 | } |
fengspot | 0:eda8882a56f9 | 203 | } |