4180-L4
Dependencies: 4DGL-uLCD-SE mbed-rtos mbed
main.cpp@0:68d1066c8288, 2014-10-21 (annotated)
- Committer:
- rfarr6
- Date:
- Tue Oct 21 14:51:25 2014 +0000
- Revision:
- 0:68d1066c8288
- Child:
- 2:5b231e0d0718
initial
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rfarr6 | 0:68d1066c8288 | 1 | #include "mbed.h" |
rfarr6 | 0:68d1066c8288 | 2 | #include "rtos.h" |
rfarr6 | 0:68d1066c8288 | 3 | #include "uLCD_4DGL.h" |
rfarr6 | 0:68d1066c8288 | 4 | |
rfarr6 | 0:68d1066c8288 | 5 | uLCD_4DGL uLCD(p9, p10, p11); |
rfarr6 | 0:68d1066c8288 | 6 | DigitalIn flap_button(p30); |
rfarr6 | 0:68d1066c8288 | 7 | AnalogIn ain(p20); |
rfarr6 | 0:68d1066c8288 | 8 | |
rfarr6 | 0:68d1066c8288 | 9 | int bird_lo_addr = 0x7801; |
rfarr6 | 0:68d1066c8288 | 10 | int y_pos = 63, old_ypos = 63; |
rfarr6 | 0:68d1066c8288 | 11 | int vel = 1; |
rfarr6 | 0:68d1066c8288 | 12 | int state = 0; |
rfarr6 | 0:68d1066c8288 | 13 | int score = 0; |
rfarr6 | 0:68d1066c8288 | 14 | |
rfarr6 | 0:68d1066c8288 | 15 | // wall_1 |
rfarr6 | 0:68d1066c8288 | 16 | int wall_x_pos1 = 128, opening_y_pos1; |
rfarr6 | 0:68d1066c8288 | 17 | |
rfarr6 | 0:68d1066c8288 | 18 | // wall 2 |
rfarr6 | 0:68d1066c8288 | 19 | int wall_x_pos2, opening_y_pos2; |
rfarr6 | 0:68d1066c8288 | 20 | |
rfarr6 | 0:68d1066c8288 | 21 | // wall 3 |
rfarr6 | 0:68d1066c8288 | 22 | int wall_x_pos3, opening_y_pos3; |
rfarr6 | 0:68d1066c8288 | 23 | |
rfarr6 | 0:68d1066c8288 | 24 | void draw_frame() { |
rfarr6 | 0:68d1066c8288 | 25 | |
rfarr6 | 0:68d1066c8288 | 26 | switch (state) { |
rfarr6 | 0:68d1066c8288 | 27 | case 0: |
rfarr6 | 0:68d1066c8288 | 28 | uLCD.locate(0, 6); |
rfarr6 | 0:68d1066c8288 | 29 | uLCD.printf("PRESS 2 START"); |
rfarr6 | 0:68d1066c8288 | 30 | break; |
rfarr6 | 0:68d1066c8288 | 31 | |
rfarr6 | 0:68d1066c8288 | 32 | case 1: |
rfarr6 | 0:68d1066c8288 | 33 | // Draw blue rectangle over old bird position |
rfarr6 | 0:68d1066c8288 | 34 | uLCD.set_sector_address(0x001D, 0x7803); |
rfarr6 | 0:68d1066c8288 | 35 | uLCD.display_image(20, old_ypos); |
rfarr6 | 0:68d1066c8288 | 36 | |
rfarr6 | 0:68d1066c8288 | 37 | if(wall_x_pos1 > -21 && wall_x_pos1 < 128){ |
rfarr6 | 0:68d1066c8288 | 38 | // draw wall 1 |
rfarr6 | 0:68d1066c8288 | 39 | if(wall_x_pos1 < 0){ |
rfarr6 | 0:68d1066c8288 | 40 | //uLCD.filled_rectangle(0, 0, wall_x_pos1 + 19, 127, RED); |
rfarr6 | 0:68d1066c8288 | 41 | //uLCD.filled_rectangle(0, opening_y_pos1, wall_x_pos1 + 19, opening_y_pos1 + 39, BLUE); |
rfarr6 | 0:68d1066c8288 | 42 | uLCD.filled_rectangle(wall_x_pos1 + 20, 0, wall_x_pos1 + 21, 127, BLUE); |
rfarr6 | 0:68d1066c8288 | 43 | } else if (wall_x_pos1 > 119){ |
rfarr6 | 0:68d1066c8288 | 44 | uLCD.filled_rectangle(wall_x_pos1, 0, wall_x_pos1+1, opening_y_pos1-1, RED); |
rfarr6 | 0:68d1066c8288 | 45 | uLCD.filled_rectangle(wall_x_pos1, opening_y_pos1+40, wall_x_pos1+1, 127, RED); |
rfarr6 | 0:68d1066c8288 | 46 | } else { |
rfarr6 | 0:68d1066c8288 | 47 | uLCD.filled_rectangle(wall_x_pos1, 0, wall_x_pos1+1, opening_y_pos1-1, RED); |
rfarr6 | 0:68d1066c8288 | 48 | uLCD.filled_rectangle(wall_x_pos1, opening_y_pos1+40, wall_x_pos1+1, 127, RED); |
rfarr6 | 0:68d1066c8288 | 49 | uLCD.filled_rectangle(wall_x_pos1 + 20, 0, wall_x_pos1 + 21, 127, BLUE); |
rfarr6 | 0:68d1066c8288 | 50 | } |
rfarr6 | 0:68d1066c8288 | 51 | } |
rfarr6 | 0:68d1066c8288 | 52 | |
rfarr6 | 0:68d1066c8288 | 53 | if(wall_x_pos2 > -21 && wall_x_pos2 < 128){ |
rfarr6 | 0:68d1066c8288 | 54 | // draw wall 1 |
rfarr6 | 0:68d1066c8288 | 55 | if(wall_x_pos2 < 0){ |
rfarr6 | 0:68d1066c8288 | 56 | //uLCD.filled_rectangle(0, 0, wall_x_pos2 + 19, 127, RED); |
rfarr6 | 0:68d1066c8288 | 57 | //uLCD.filled_rectangle(0, opening_y_pos2, wall_x_pos2 + 19, opening_y_pos2 + 39, BLUE); |
rfarr6 | 0:68d1066c8288 | 58 | uLCD.filled_rectangle(wall_x_pos2 + 20, 0, wall_x_pos2 + 21, 127, BLUE); |
rfarr6 | 0:68d1066c8288 | 59 | } else if (wall_x_pos2 > 119){ |
rfarr6 | 0:68d1066c8288 | 60 | uLCD.filled_rectangle(wall_x_pos2, 0, wall_x_pos2+1, opening_y_pos2-1, RED); |
rfarr6 | 0:68d1066c8288 | 61 | uLCD.filled_rectangle(wall_x_pos2, opening_y_pos2+40, wall_x_pos2+1, 127, RED); |
rfarr6 | 0:68d1066c8288 | 62 | } else { |
rfarr6 | 0:68d1066c8288 | 63 | uLCD.filled_rectangle(wall_x_pos2, 0, wall_x_pos2+1, opening_y_pos2-1, RED); |
rfarr6 | 0:68d1066c8288 | 64 | uLCD.filled_rectangle(wall_x_pos2, opening_y_pos2+40, wall_x_pos2+1, 127, RED); |
rfarr6 | 0:68d1066c8288 | 65 | uLCD.filled_rectangle(wall_x_pos2 + 20, 0, wall_x_pos2 + 21, 127, BLUE); |
rfarr6 | 0:68d1066c8288 | 66 | } |
rfarr6 | 0:68d1066c8288 | 67 | } |
rfarr6 | 0:68d1066c8288 | 68 | |
rfarr6 | 0:68d1066c8288 | 69 | if(wall_x_pos3 > -21 && wall_x_pos3 < 128){ |
rfarr6 | 0:68d1066c8288 | 70 | // draw wall 3 |
rfarr6 | 0:68d1066c8288 | 71 | if(wall_x_pos3 < 0){ |
rfarr6 | 0:68d1066c8288 | 72 | uLCD.filled_rectangle(wall_x_pos3 + 20, 0, wall_x_pos3 + 21, 127, BLUE); |
rfarr6 | 0:68d1066c8288 | 73 | } else if (wall_x_pos3 > 119){ |
rfarr6 | 0:68d1066c8288 | 74 | uLCD.filled_rectangle(wall_x_pos3, 0, wall_x_pos3+1, opening_y_pos3-1, RED); |
rfarr6 | 0:68d1066c8288 | 75 | uLCD.filled_rectangle(wall_x_pos3, opening_y_pos3+40, wall_x_pos3+1, 127, RED); |
rfarr6 | 0:68d1066c8288 | 76 | } else { |
rfarr6 | 0:68d1066c8288 | 77 | uLCD.filled_rectangle(wall_x_pos3, 0, wall_x_pos3+1, opening_y_pos3-1, RED); |
rfarr6 | 0:68d1066c8288 | 78 | uLCD.filled_rectangle(wall_x_pos3, opening_y_pos3+40, wall_x_pos3+1, 127, RED); |
rfarr6 | 0:68d1066c8288 | 79 | uLCD.filled_rectangle(wall_x_pos3 + 20, 0, wall_x_pos3 + 21, 127, BLUE); |
rfarr6 | 0:68d1066c8288 | 80 | } |
rfarr6 | 0:68d1066c8288 | 81 | } |
rfarr6 | 0:68d1066c8288 | 82 | |
rfarr6 | 0:68d1066c8288 | 83 | // Draw bird at current position |
rfarr6 | 0:68d1066c8288 | 84 | uLCD.set_sector_address(0x001D, bird_lo_addr); |
rfarr6 | 0:68d1066c8288 | 85 | uLCD.display_image(20, y_pos); |
rfarr6 | 0:68d1066c8288 | 86 | |
rfarr6 | 0:68d1066c8288 | 87 | break; |
rfarr6 | 0:68d1066c8288 | 88 | |
rfarr6 | 0:68d1066c8288 | 89 | case 2: |
rfarr6 | 0:68d1066c8288 | 90 | uLCD.filled_rectangle(0, 0, 127, 127, BLACK); |
rfarr6 | 0:68d1066c8288 | 91 | uLCD.locate(0, 6); |
rfarr6 | 0:68d1066c8288 | 92 | uLCD.printf("GAME OVER"); |
rfarr6 | 0:68d1066c8288 | 93 | uLCD.locate(0, 7); |
rfarr6 | 0:68d1066c8288 | 94 | uLCD.printf("SCORE: %d", score); |
rfarr6 | 0:68d1066c8288 | 95 | break; |
rfarr6 | 0:68d1066c8288 | 96 | } |
rfarr6 | 0:68d1066c8288 | 97 | } |
rfarr6 | 0:68d1066c8288 | 98 | |
rfarr6 | 0:68d1066c8288 | 99 | void update_frame() { |
rfarr6 | 0:68d1066c8288 | 100 | // Update bird position |
rfarr6 | 0:68d1066c8288 | 101 | old_ypos = y_pos; |
rfarr6 | 0:68d1066c8288 | 102 | y_pos += vel; |
rfarr6 | 0:68d1066c8288 | 103 | |
rfarr6 | 0:68d1066c8288 | 104 | if (y_pos > 122) { |
rfarr6 | 0:68d1066c8288 | 105 | y_pos = 122; |
rfarr6 | 0:68d1066c8288 | 106 | } else if (y_pos < 0) { |
rfarr6 | 0:68d1066c8288 | 107 | y_pos = 0; |
rfarr6 | 0:68d1066c8288 | 108 | } |
rfarr6 | 0:68d1066c8288 | 109 | |
rfarr6 | 0:68d1066c8288 | 110 | if (wall_x_pos1 <= 26 && wall_x_pos1 > 0) { |
rfarr6 | 0:68d1066c8288 | 111 | if (y_pos < opening_y_pos1 || y_pos+5 > opening_y_pos1+39) { |
rfarr6 | 0:68d1066c8288 | 112 | state = 2; |
rfarr6 | 0:68d1066c8288 | 113 | wait(3); |
rfarr6 | 0:68d1066c8288 | 114 | } |
rfarr6 | 0:68d1066c8288 | 115 | } |
rfarr6 | 0:68d1066c8288 | 116 | |
rfarr6 | 0:68d1066c8288 | 117 | if (wall_x_pos2 <= 26 && wall_x_pos2 > 0) { |
rfarr6 | 0:68d1066c8288 | 118 | if (y_pos < opening_y_pos2 || y_pos+5 > opening_y_pos2+39) { |
rfarr6 | 0:68d1066c8288 | 119 | state = 2; |
rfarr6 | 0:68d1066c8288 | 120 | wait(3); |
rfarr6 | 0:68d1066c8288 | 121 | } |
rfarr6 | 0:68d1066c8288 | 122 | } |
rfarr6 | 0:68d1066c8288 | 123 | |
rfarr6 | 0:68d1066c8288 | 124 | if (wall_x_pos3 <= 26 && wall_x_pos3 > 0) { |
rfarr6 | 0:68d1066c8288 | 125 | if (y_pos < opening_y_pos3 || y_pos+5 > opening_y_pos3+39) { |
rfarr6 | 0:68d1066c8288 | 126 | state = 2; |
rfarr6 | 0:68d1066c8288 | 127 | wait(3); |
rfarr6 | 0:68d1066c8288 | 128 | } |
rfarr6 | 0:68d1066c8288 | 129 | } |
rfarr6 | 0:68d1066c8288 | 130 | |
rfarr6 | 0:68d1066c8288 | 131 | // Update bird velocity |
rfarr6 | 0:68d1066c8288 | 132 | if (!flap_button) { |
rfarr6 | 0:68d1066c8288 | 133 | // Toggle bird flap |
rfarr6 | 0:68d1066c8288 | 134 | bird_lo_addr ^= 0x3; |
rfarr6 | 0:68d1066c8288 | 135 | |
rfarr6 | 0:68d1066c8288 | 136 | vel--; |
rfarr6 | 0:68d1066c8288 | 137 | if (vel < -5) vel = -5; |
rfarr6 | 0:68d1066c8288 | 138 | } else { |
rfarr6 | 0:68d1066c8288 | 139 | vel++; |
rfarr6 | 0:68d1066c8288 | 140 | if (vel > 5) vel = 5; |
rfarr6 | 0:68d1066c8288 | 141 | } |
rfarr6 | 0:68d1066c8288 | 142 | |
rfarr6 | 0:68d1066c8288 | 143 | // Update wall positions |
rfarr6 | 0:68d1066c8288 | 144 | if(wall_x_pos1 > -21){ |
rfarr6 | 0:68d1066c8288 | 145 | wall_x_pos1 -= 2; |
rfarr6 | 0:68d1066c8288 | 146 | } else { |
rfarr6 | 0:68d1066c8288 | 147 | wall_x_pos1 = wall_x_pos3 + 80 - (rand() % score); |
rfarr6 | 0:68d1066c8288 | 148 | opening_y_pos1 = (int)(ain*100.0) % 46 + 20; |
rfarr6 | 0:68d1066c8288 | 149 | score++; |
rfarr6 | 0:68d1066c8288 | 150 | } |
rfarr6 | 0:68d1066c8288 | 151 | |
rfarr6 | 0:68d1066c8288 | 152 | if(wall_x_pos2 > -21){ |
rfarr6 | 0:68d1066c8288 | 153 | wall_x_pos2 -= 2; |
rfarr6 | 0:68d1066c8288 | 154 | } else { |
rfarr6 | 0:68d1066c8288 | 155 | wall_x_pos2 = wall_x_pos1 + 80 - (rand() % score); |
rfarr6 | 0:68d1066c8288 | 156 | opening_y_pos2 = (int)(ain*100.0) % 46 + 20; |
rfarr6 | 0:68d1066c8288 | 157 | score++; |
rfarr6 | 0:68d1066c8288 | 158 | } |
rfarr6 | 0:68d1066c8288 | 159 | |
rfarr6 | 0:68d1066c8288 | 160 | if(wall_x_pos3 > -21){ |
rfarr6 | 0:68d1066c8288 | 161 | wall_x_pos3 -= 2; |
rfarr6 | 0:68d1066c8288 | 162 | } else { |
rfarr6 | 0:68d1066c8288 | 163 | wall_x_pos3 = wall_x_pos2 + 80 - (rand() % score); |
rfarr6 | 0:68d1066c8288 | 164 | opening_y_pos3 = (int)(ain*100.0) % 46 + 20; |
rfarr6 | 0:68d1066c8288 | 165 | score++; |
rfarr6 | 0:68d1066c8288 | 166 | } |
rfarr6 | 0:68d1066c8288 | 167 | } |
rfarr6 | 0:68d1066c8288 | 168 | |
rfarr6 | 0:68d1066c8288 | 169 | int main() { |
rfarr6 | 0:68d1066c8288 | 170 | flap_button.mode(PullUp); |
rfarr6 | 0:68d1066c8288 | 171 | |
rfarr6 | 0:68d1066c8288 | 172 | uLCD.baudrate(3000000); |
rfarr6 | 0:68d1066c8288 | 173 | uLCD.cls(); |
rfarr6 | 0:68d1066c8288 | 174 | uLCD.filled_rectangle(0, 0, 127, 127, BLACK); |
rfarr6 | 0:68d1066c8288 | 175 | uLCD.media_init(); |
rfarr6 | 0:68d1066c8288 | 176 | |
rfarr6 | 0:68d1066c8288 | 177 | opening_y_pos1 = rand() % 46 + 20; |
rfarr6 | 0:68d1066c8288 | 178 | opening_y_pos2 = rand() % 46 + 20; |
rfarr6 | 0:68d1066c8288 | 179 | opening_y_pos3 = rand() % 46 + 20; |
rfarr6 | 0:68d1066c8288 | 180 | |
rfarr6 | 0:68d1066c8288 | 181 | wall_x_pos2 = wall_x_pos1 + 80 - (rand() % 5); |
rfarr6 | 0:68d1066c8288 | 182 | wall_x_pos3 = wall_x_pos2 + 80 - (rand() % 5); |
rfarr6 | 0:68d1066c8288 | 183 | |
rfarr6 | 0:68d1066c8288 | 184 | // Bird is 6 rows, 7 cols |
rfarr6 | 0:68d1066c8288 | 185 | |
rfarr6 | 0:68d1066c8288 | 186 | while (1) { |
rfarr6 | 0:68d1066c8288 | 187 | draw_frame(); |
rfarr6 | 0:68d1066c8288 | 188 | |
rfarr6 | 0:68d1066c8288 | 189 | if (state == 1) { |
rfarr6 | 0:68d1066c8288 | 190 | update_frame(); |
rfarr6 | 0:68d1066c8288 | 191 | } else if (state == 0 && !flap_button) { |
rfarr6 | 0:68d1066c8288 | 192 | uLCD.filled_rectangle(0, 0, 127, 127, BLUE); |
rfarr6 | 0:68d1066c8288 | 193 | state = 1; |
rfarr6 | 0:68d1066c8288 | 194 | } |
rfarr6 | 0:68d1066c8288 | 195 | |
rfarr6 | 0:68d1066c8288 | 196 | wait_ms(50); |
rfarr6 | 0:68d1066c8288 | 197 | } |
rfarr6 | 0:68d1066c8288 | 198 | } |