My ELEC2645 joystick project Tetris Game NAME: JIANWEI CHEN SID: 200879849
Dependencies: N5110 SDFileSystem mbed
main.cpp@3:5494a0fb3a33, 2016-05-01 (annotated)
- Committer:
- cjw851102
- Date:
- Sun May 01 23:09:33 2016 +0000
- Revision:
- 3:5494a0fb3a33
- Parent:
- 2:f427089e2bfa
- Child:
- 4:463abe5f5135
finish game
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
cjw851102 | 0:12a1972fa0d0 | 1 | #include "mbed.h" |
cjw851102 | 0:12a1972fa0d0 | 2 | #include "Patterns.h" |
cjw851102 | 0:12a1972fa0d0 | 3 | #include "N5110.h" |
cjw851102 | 0:12a1972fa0d0 | 4 | |
cjw851102 | 1:2a758565f691 | 5 | #define DIRECTION_TOLERANCE 0.05 |
cjw851102 | 1:2a758565f691 | 6 | |
cjw851102 | 0:12a1972fa0d0 | 7 | //VCC, SCE, RST, D/C, MOSI,SCLK, LED |
cjw851102 | 0:12a1972fa0d0 | 8 | N5110 lcd(PTE26,PTA0,PTC4,PTD0,PTD2,PTD1,PTC3); |
cjw851102 | 1:2a758565f691 | 9 | AnalogIn yPot(PTB2); |
cjw851102 | 1:2a758565f691 | 10 | AnalogIn xPot(PTB3); |
cjw851102 | 1:2a758565f691 | 11 | DigitalIn button(PTB11); |
cjw851102 | 0:12a1972fa0d0 | 12 | Patterns patterns; |
cjw851102 | 1:2a758565f691 | 13 | |
cjw851102 | 1:2a758565f691 | 14 | Ticker game; |
cjw851102 | 1:2a758565f691 | 15 | void game_isr(); |
cjw851102 | 1:2a758565f691 | 16 | volatile int g_game_flag = 0; |
cjw851102 | 1:2a758565f691 | 17 | |
cjw851102 | 0:12a1972fa0d0 | 18 | void drawPattern(int type,int rotation,int x,int y,int fill); // draw pattern at (x,y), fill = 0 white, fill = 1 black |
cjw851102 | 0:12a1972fa0d0 | 19 | |
cjw851102 | 0:12a1972fa0d0 | 20 | void left_collisionDetect(); |
cjw851102 | 0:12a1972fa0d0 | 21 | int left_collision_flag = 0; |
cjw851102 | 0:12a1972fa0d0 | 22 | |
cjw851102 | 0:12a1972fa0d0 | 23 | void right_collisionDetect(); |
cjw851102 | 0:12a1972fa0d0 | 24 | int right_collision_flag = 0; |
cjw851102 | 0:12a1972fa0d0 | 25 | |
cjw851102 | 2:f427089e2bfa | 26 | void bottom_collisionDetect(); |
cjw851102 | 2:f427089e2bfa | 27 | int bottom_collision_flag = 0; |
cjw851102 | 2:f427089e2bfa | 28 | |
cjw851102 | 2:f427089e2bfa | 29 | void top_collisionDetect(); |
cjw851102 | 2:f427089e2bfa | 30 | int top_collision_flag = 0; |
cjw851102 | 0:12a1972fa0d0 | 31 | |
cjw851102 | 2:f427089e2bfa | 32 | void rotation_collisionDetect(); |
cjw851102 | 2:f427089e2bfa | 33 | int rotation_collision_flag = 0; |
cjw851102 | 2:f427089e2bfa | 34 | |
cjw851102 | 2:f427089e2bfa | 35 | void fastmove_bottom_collisionDetect(); |
cjw851102 | 2:f427089e2bfa | 36 | int fastmove_bottom_collision_flag = 0; |
cjw851102 | 0:12a1972fa0d0 | 37 | |
cjw851102 | 0:12a1972fa0d0 | 38 | struct Position { |
cjw851102 | 0:12a1972fa0d0 | 39 | float x; |
cjw851102 | 0:12a1972fa0d0 | 40 | float y; |
cjw851102 | 0:12a1972fa0d0 | 41 | int type; |
cjw851102 | 0:12a1972fa0d0 | 42 | int rotation; |
cjw851102 | 0:12a1972fa0d0 | 43 | }; |
cjw851102 | 0:12a1972fa0d0 | 44 | typedef struct Position position; |
cjw851102 | 0:12a1972fa0d0 | 45 | |
cjw851102 | 1:2a758565f691 | 46 | position pos; |
cjw851102 | 0:12a1972fa0d0 | 47 | |
cjw851102 | 0:12a1972fa0d0 | 48 | void init_game(); |
cjw851102 | 1:2a758565f691 | 49 | int typeArray[100]; |
cjw851102 | 1:2a758565f691 | 50 | int rotationArray[100]; |
cjw851102 | 0:12a1972fa0d0 | 51 | |
cjw851102 | 0:12a1972fa0d0 | 52 | int pattern_buffer[6][6]; |
cjw851102 | 0:12a1972fa0d0 | 53 | void get_pattern(int type, int rotatin); |
cjw851102 | 0:12a1972fa0d0 | 54 | |
cjw851102 | 0:12a1972fa0d0 | 55 | void scan(); |
cjw851102 | 0:12a1972fa0d0 | 56 | int buffer[84][48]; |
cjw851102 | 0:12a1972fa0d0 | 57 | |
cjw851102 | 1:2a758565f691 | 58 | // create enumerated type (0,1,2,3 etc. for direction) |
cjw851102 | 1:2a758565f691 | 59 | // could be extended for diagonals etc. |
cjw851102 | 1:2a758565f691 | 60 | enum DirectionName { |
cjw851102 | 1:2a758565f691 | 61 | UP, |
cjw851102 | 1:2a758565f691 | 62 | DOWN, |
cjw851102 | 1:2a758565f691 | 63 | LEFT, |
cjw851102 | 1:2a758565f691 | 64 | RIGHT, |
cjw851102 | 1:2a758565f691 | 65 | CENTRE, |
cjw851102 | 1:2a758565f691 | 66 | UNKNOWN |
cjw851102 | 1:2a758565f691 | 67 | }; |
cjw851102 | 1:2a758565f691 | 68 | // struct for Joystick |
cjw851102 | 1:2a758565f691 | 69 | typedef struct JoyStick Joystick; |
cjw851102 | 1:2a758565f691 | 70 | struct JoyStick { |
cjw851102 | 2:f427089e2bfa | 71 | double x; // current x value |
cjw851102 | 2:f427089e2bfa | 72 | double x0; // 'centred' x value |
cjw851102 | 2:f427089e2bfa | 73 | double y; // current y value |
cjw851102 | 2:f427089e2bfa | 74 | double y0; // 'centred' y value |
cjw851102 | 1:2a758565f691 | 75 | int button; // button state (assume pull-down used, so 1 = pressed, 0 = unpressed) |
cjw851102 | 1:2a758565f691 | 76 | DirectionName direction; // current direction |
cjw851102 | 1:2a758565f691 | 77 | }; |
cjw851102 | 1:2a758565f691 | 78 | // create struct variable |
cjw851102 | 1:2a758565f691 | 79 | Joystick joystick; |
cjw851102 | 1:2a758565f691 | 80 | void calibrateJoystick(); |
cjw851102 | 1:2a758565f691 | 81 | void updateJoystick(); |
cjw851102 | 1:2a758565f691 | 82 | |
cjw851102 | 2:f427089e2bfa | 83 | void cancelLine();// if one line is filled, cancel it and add the score |
cjw851102 | 2:f427089e2bfa | 84 | int score=0; |
cjw851102 | 2:f427089e2bfa | 85 | |
cjw851102 | 2:f427089e2bfa | 86 | void finishAnimation(); |
cjw851102 | 2:f427089e2bfa | 87 | |
cjw851102 | 2:f427089e2bfa | 88 | int xOld; |
cjw851102 | 2:f427089e2bfa | 89 | int typeCount = 0; |
cjw851102 | 2:f427089e2bfa | 90 | int nextTypeCount; |
cjw851102 | 2:f427089e2bfa | 91 | |
cjw851102 | 0:12a1972fa0d0 | 92 | int main() |
cjw851102 | 0:12a1972fa0d0 | 93 | { |
cjw851102 | 0:12a1972fa0d0 | 94 | wait(2.0); // short delay for power to settle |
cjw851102 | 0:12a1972fa0d0 | 95 | lcd.init(); |
cjw851102 | 0:12a1972fa0d0 | 96 | lcd.normalMode(); // normal colour mode |
cjw851102 | 1:2a758565f691 | 97 | lcd.setBrightness(1.0); // put LED backlight on 100% |
cjw851102 | 0:12a1972fa0d0 | 98 | init_game(); |
cjw851102 | 3:5494a0fb3a33 | 99 | game.attach(&game_isr,0.2); |
cjw851102 | 1:2a758565f691 | 100 | lcd.refresh(); |
cjw851102 | 1:2a758565f691 | 101 | calibrateJoystick(); |
cjw851102 | 0:12a1972fa0d0 | 102 | |
cjw851102 | 0:12a1972fa0d0 | 103 | while (1) { |
cjw851102 | 0:12a1972fa0d0 | 104 | |
cjw851102 | 1:2a758565f691 | 105 | if(g_game_flag==1) { |
cjw851102 | 1:2a758565f691 | 106 | g_game_flag = 0; |
cjw851102 | 1:2a758565f691 | 107 | pos.type = typeArray[typeCount]; |
cjw851102 | 2:f427089e2bfa | 108 | nextTypeCount=typeCount+1; |
cjw851102 | 2:f427089e2bfa | 109 | if (nextTypeCount>99) { |
cjw851102 | 2:f427089e2bfa | 110 | nextTypeCount=0; |
cjw851102 | 2:f427089e2bfa | 111 | } |
cjw851102 | 2:f427089e2bfa | 112 | drawPattern(typeArray[nextTypeCount],0,55,41,1);// draw next pattern |
cjw851102 | 2:f427089e2bfa | 113 | if (pos.y >= -5) { // clear previous pattern |
cjw851102 | 1:2a758565f691 | 114 | drawPattern(pos.type,pos.rotation,xOld,pos.y-1,0); |
cjw851102 | 1:2a758565f691 | 115 | } |
cjw851102 | 1:2a758565f691 | 116 | updateJoystick(); |
cjw851102 | 2:f427089e2bfa | 117 | top_collisionDetect(); |
cjw851102 | 2:f427089e2bfa | 118 | if (top_collision_flag == 1) { |
cjw851102 | 2:f427089e2bfa | 119 | finishAnimation(); |
cjw851102 | 2:f427089e2bfa | 120 | lcd.clear(); |
cjw851102 | 2:f427089e2bfa | 121 | char scoreBuffer[14]; |
cjw851102 | 2:f427089e2bfa | 122 | sprintf(scoreBuffer,"%d",score); |
cjw851102 | 2:f427089e2bfa | 123 | lcd.printString("SCORE IS: ",10,2); |
cjw851102 | 2:f427089e2bfa | 124 | lcd.printString(scoreBuffer,35,3); |
cjw851102 | 2:f427089e2bfa | 125 | lcd.refresh(); |
cjw851102 | 2:f427089e2bfa | 126 | break; |
cjw851102 | 2:f427089e2bfa | 127 | } |
cjw851102 | 1:2a758565f691 | 128 | switch(joystick.direction) { |
cjw851102 | 1:2a758565f691 | 129 | case UP: |
cjw851102 | 2:f427089e2bfa | 130 | rotation_collisionDetect(); |
cjw851102 | 2:f427089e2bfa | 131 | if(rotation_collision_flag == 0) { |
cjw851102 | 2:f427089e2bfa | 132 | pos.rotation++; |
cjw851102 | 2:f427089e2bfa | 133 | if (pos.rotation>3) { |
cjw851102 | 2:f427089e2bfa | 134 | pos.rotation=0; |
cjw851102 | 2:f427089e2bfa | 135 | } |
cjw851102 | 2:f427089e2bfa | 136 | drawPattern(pos.type,pos.rotation,pos.x,pos.y,1); |
cjw851102 | 2:f427089e2bfa | 137 | } else {// if collision |
cjw851102 | 2:f427089e2bfa | 138 | drawPattern(pos.type,pos.rotation,pos.x,pos.y,1); |
cjw851102 | 2:f427089e2bfa | 139 | } |
cjw851102 | 1:2a758565f691 | 140 | break; |
cjw851102 | 1:2a758565f691 | 141 | case DOWN: |
cjw851102 | 2:f427089e2bfa | 142 | fastmove_bottom_collisionDetect(); |
cjw851102 | 2:f427089e2bfa | 143 | if (fastmove_bottom_collision_flag == 0) { |
cjw851102 | 2:f427089e2bfa | 144 | pos.y +=4; |
cjw851102 | 2:f427089e2bfa | 145 | drawPattern(pos.type,pos.rotation,pos.x,pos.y,1); |
cjw851102 | 2:f427089e2bfa | 146 | } else { |
cjw851102 | 2:f427089e2bfa | 147 | drawPattern(pos.type,pos.rotation,pos.x,pos.y,1); |
cjw851102 | 2:f427089e2bfa | 148 | } |
cjw851102 | 1:2a758565f691 | 149 | break; |
cjw851102 | 1:2a758565f691 | 150 | case RIGHT: |
cjw851102 | 1:2a758565f691 | 151 | right_collisionDetect(); |
cjw851102 | 1:2a758565f691 | 152 | if( right_collision_flag == 0) { |
cjw851102 | 1:2a758565f691 | 153 | pos.x +=2; |
cjw851102 | 1:2a758565f691 | 154 | drawPattern(pos.type,pos.rotation,pos.x,pos.y,1); |
cjw851102 | 1:2a758565f691 | 155 | } else { |
cjw851102 | 1:2a758565f691 | 156 | drawPattern(pos.type,pos.rotation,pos.x,pos.y,1); |
cjw851102 | 3:5494a0fb3a33 | 157 | right_collision_flag = 0; |
cjw851102 | 1:2a758565f691 | 158 | } |
cjw851102 | 1:2a758565f691 | 159 | break; |
cjw851102 | 1:2a758565f691 | 160 | case LEFT: |
cjw851102 | 1:2a758565f691 | 161 | left_collisionDetect(); |
cjw851102 | 1:2a758565f691 | 162 | if( left_collision_flag == 0) { |
cjw851102 | 1:2a758565f691 | 163 | pos.x -=2; |
cjw851102 | 1:2a758565f691 | 164 | drawPattern(pos.type,pos.rotation,pos.x,pos.y,1); |
cjw851102 | 1:2a758565f691 | 165 | } else { |
cjw851102 | 1:2a758565f691 | 166 | drawPattern(pos.type,pos.rotation,pos.x,pos.y,1); |
cjw851102 | 3:5494a0fb3a33 | 167 | left_collision_flag = 0; |
cjw851102 | 1:2a758565f691 | 168 | } |
cjw851102 | 3:5494a0fb3a33 | 169 | |
cjw851102 | 1:2a758565f691 | 170 | break; |
cjw851102 | 1:2a758565f691 | 171 | case CENTRE: |
cjw851102 | 1:2a758565f691 | 172 | drawPattern(pos.type,pos.rotation,pos.x,pos.y,1); |
cjw851102 | 1:2a758565f691 | 173 | break; |
cjw851102 | 1:2a758565f691 | 174 | case UNKNOWN: |
cjw851102 | 1:2a758565f691 | 175 | drawPattern(pos.type,pos.rotation,pos.x,pos.y,1); |
cjw851102 | 1:2a758565f691 | 176 | break; |
cjw851102 | 1:2a758565f691 | 177 | } |
cjw851102 | 1:2a758565f691 | 178 | |
cjw851102 | 1:2a758565f691 | 179 | xOld = pos.x; |
cjw851102 | 2:f427089e2bfa | 180 | bottom_collisionDetect(); |
cjw851102 | 2:f427089e2bfa | 181 | if (bottom_collision_flag == 0) { |
cjw851102 | 1:2a758565f691 | 182 | pos.y++; |
cjw851102 | 1:2a758565f691 | 183 | } else { |
cjw851102 | 2:f427089e2bfa | 184 | drawPattern(pos.type,pos.rotation,pos.x,pos.y,1);// fix pattern |
cjw851102 | 2:f427089e2bfa | 185 | cancelLine(); |
cjw851102 | 2:f427089e2bfa | 186 | pos.x = 10; |
cjw851102 | 2:f427089e2bfa | 187 | pos.y = -6; |
cjw851102 | 2:f427089e2bfa | 188 | pos.rotation=0; |
cjw851102 | 2:f427089e2bfa | 189 | drawPattern(typeArray[nextTypeCount],pos.rotation,55,41,0);// clear the old next pattern |
cjw851102 | 2:f427089e2bfa | 190 | typeCount ++; |
cjw851102 | 2:f427089e2bfa | 191 | if (typeCount >99) { |
cjw851102 | 2:f427089e2bfa | 192 | typeCount = 0; |
cjw851102 | 2:f427089e2bfa | 193 | } |
cjw851102 | 1:2a758565f691 | 194 | } |
cjw851102 | 2:f427089e2bfa | 195 | |
cjw851102 | 1:2a758565f691 | 196 | } |
cjw851102 | 1:2a758565f691 | 197 | lcd.refresh(); |
cjw851102 | 0:12a1972fa0d0 | 198 | } |
cjw851102 | 0:12a1972fa0d0 | 199 | |
cjw851102 | 0:12a1972fa0d0 | 200 | } |
cjw851102 | 0:12a1972fa0d0 | 201 | |
cjw851102 | 0:12a1972fa0d0 | 202 | void init_game() |
cjw851102 | 0:12a1972fa0d0 | 203 | { |
cjw851102 | 1:2a758565f691 | 204 | pos.x = 10; |
cjw851102 | 1:2a758565f691 | 205 | pos.y = -6; |
cjw851102 | 2:f427089e2bfa | 206 | pos.rotation=0; |
cjw851102 | 1:2a758565f691 | 207 | for(int i=0; i<=99; i++) { |
cjw851102 | 1:2a758565f691 | 208 | typeArray[i] = rand()%7; |
cjw851102 | 1:2a758565f691 | 209 | rotationArray[i] = rand()%5; |
cjw851102 | 1:2a758565f691 | 210 | } |
cjw851102 | 1:2a758565f691 | 211 | lcd.drawLine(30,0,30,47,1); |
cjw851102 | 1:2a758565f691 | 212 | lcd.printString("Level:",42,0); |
cjw851102 | 1:2a758565f691 | 213 | lcd.printString("easy",42,1); |
cjw851102 | 1:2a758565f691 | 214 | lcd.printString("Score:",42,2); |
cjw851102 | 2:f427089e2bfa | 215 | lcd.printString("0",42,3); |
cjw851102 | 1:2a758565f691 | 216 | lcd.printString("Next:",42,4); |
cjw851102 | 1:2a758565f691 | 217 | |
cjw851102 | 0:12a1972fa0d0 | 218 | } |
cjw851102 | 0:12a1972fa0d0 | 219 | |
cjw851102 | 0:12a1972fa0d0 | 220 | void get_pattern(int type, int rotation) |
cjw851102 | 0:12a1972fa0d0 | 221 | { |
cjw851102 | 0:12a1972fa0d0 | 222 | for(int i=0; i<=5; i++) { |
cjw851102 | 0:12a1972fa0d0 | 223 | for(int j=0; j<=5; j++) { |
cjw851102 | 0:12a1972fa0d0 | 224 | pattern_buffer[i][j] = patterns.getPatterns(type,rotation,j,i); // return pattern[type][rotation][y][x]; |
cjw851102 | 0:12a1972fa0d0 | 225 | } |
cjw851102 | 0:12a1972fa0d0 | 226 | } |
cjw851102 | 0:12a1972fa0d0 | 227 | } |
cjw851102 | 0:12a1972fa0d0 | 228 | |
cjw851102 | 0:12a1972fa0d0 | 229 | void scan() |
cjw851102 | 0:12a1972fa0d0 | 230 | { |
cjw851102 | 0:12a1972fa0d0 | 231 | for (int i=0; i<=83; i++) { |
cjw851102 | 0:12a1972fa0d0 | 232 | for (int j=0; j<=47; j++) { |
cjw851102 | 0:12a1972fa0d0 | 233 | if(lcd.getPixel(i,j)) { |
cjw851102 | 0:12a1972fa0d0 | 234 | buffer[i][j] = 1; |
cjw851102 | 0:12a1972fa0d0 | 235 | } else { |
cjw851102 | 0:12a1972fa0d0 | 236 | buffer[i][j] = 0; |
cjw851102 | 0:12a1972fa0d0 | 237 | } |
cjw851102 | 0:12a1972fa0d0 | 238 | } |
cjw851102 | 0:12a1972fa0d0 | 239 | } |
cjw851102 | 0:12a1972fa0d0 | 240 | } |
cjw851102 | 0:12a1972fa0d0 | 241 | |
cjw851102 | 0:12a1972fa0d0 | 242 | |
cjw851102 | 0:12a1972fa0d0 | 243 | void drawPattern(int type,int rotation,int x,int y,int fill) |
cjw851102 | 0:12a1972fa0d0 | 244 | { |
cjw851102 | 0:12a1972fa0d0 | 245 | get_pattern(type,rotation); |
cjw851102 | 0:12a1972fa0d0 | 246 | for(int i=x; i <= x+5; i++) { // (x,y) is the left top point of a 6*6 square |
cjw851102 | 0:12a1972fa0d0 | 247 | for(int j=y; j <= y+5; j++) { |
cjw851102 | 1:2a758565f691 | 248 | if (j>=0) { |
cjw851102 | 1:2a758565f691 | 249 | if(pattern_buffer[i-x][j-y]==1) { |
cjw851102 | 1:2a758565f691 | 250 | if (fill==0) { |
cjw851102 | 2:f427089e2bfa | 251 | if (j<=47 && i>=0) { |
cjw851102 | 1:2a758565f691 | 252 | lcd.clearPixel(i,j); |
cjw851102 | 1:2a758565f691 | 253 | } |
cjw851102 | 1:2a758565f691 | 254 | } else if (fill==1) { |
cjw851102 | 2:f427089e2bfa | 255 | if (j<=47 && i>=0) { |
cjw851102 | 1:2a758565f691 | 256 | lcd.setPixel(i,j); |
cjw851102 | 1:2a758565f691 | 257 | } |
cjw851102 | 1:2a758565f691 | 258 | } |
cjw851102 | 0:12a1972fa0d0 | 259 | } |
cjw851102 | 0:12a1972fa0d0 | 260 | } |
cjw851102 | 0:12a1972fa0d0 | 261 | } |
cjw851102 | 0:12a1972fa0d0 | 262 | } |
cjw851102 | 0:12a1972fa0d0 | 263 | } |
cjw851102 | 0:12a1972fa0d0 | 264 | |
cjw851102 | 0:12a1972fa0d0 | 265 | void left_collisionDetect() |
cjw851102 | 0:12a1972fa0d0 | 266 | { |
cjw851102 | 2:f427089e2bfa | 267 | int left_boundary[6][6]; |
cjw851102 | 1:2a758565f691 | 268 | get_pattern(pos.type,pos.rotation); |
cjw851102 | 2:f427089e2bfa | 269 | |
cjw851102 | 0:12a1972fa0d0 | 270 | // get the left boundary pattern |
cjw851102 | 1:2a758565f691 | 271 | for (int j=0; j<=5; j++) { // |
cjw851102 | 1:2a758565f691 | 272 | for (int i=0; i<=5; i++) { |
cjw851102 | 0:12a1972fa0d0 | 273 | if (pattern_buffer[i][j]==1) { |
cjw851102 | 0:12a1972fa0d0 | 274 | left_boundary[i][j]=1; |
cjw851102 | 1:2a758565f691 | 275 | for(int k=i+1; k<=5; k++) { |
cjw851102 | 0:12a1972fa0d0 | 276 | left_boundary[k][j] = 0; |
cjw851102 | 0:12a1972fa0d0 | 277 | } |
cjw851102 | 1:2a758565f691 | 278 | break; |
cjw851102 | 0:12a1972fa0d0 | 279 | } else { |
cjw851102 | 0:12a1972fa0d0 | 280 | left_boundary[i][j]=0; |
cjw851102 | 0:12a1972fa0d0 | 281 | } |
cjw851102 | 0:12a1972fa0d0 | 282 | } |
cjw851102 | 0:12a1972fa0d0 | 283 | } |
cjw851102 | 0:12a1972fa0d0 | 284 | |
cjw851102 | 0:12a1972fa0d0 | 285 | //check left collision |
cjw851102 | 1:2a758565f691 | 286 | int x = pos.x; |
cjw851102 | 1:2a758565f691 | 287 | int y = pos.y; |
cjw851102 | 1:2a758565f691 | 288 | if (x<0) { |
cjw851102 | 1:2a758565f691 | 289 | left_collision_flag = 1; |
cjw851102 | 1:2a758565f691 | 290 | } else { |
cjw851102 | 1:2a758565f691 | 291 | for(int i=x; i <= x+5; i++) { // (x,y) is the left top point of a 6*6 square |
cjw851102 | 1:2a758565f691 | 292 | for(int j=y; j <= y+5; j++) { |
cjw851102 | 1:2a758565f691 | 293 | if(left_boundary[i-x][j-y]==1) { |
cjw851102 | 1:2a758565f691 | 294 | if(i == 0) { |
cjw851102 | 1:2a758565f691 | 295 | left_collision_flag = 1; |
cjw851102 | 1:2a758565f691 | 296 | break; |
cjw851102 | 2:f427089e2bfa | 297 | } else if (lcd.getPixel(i-1,j)) { |
cjw851102 | 1:2a758565f691 | 298 | left_collision_flag = 1; |
cjw851102 | 1:2a758565f691 | 299 | break; |
cjw851102 | 1:2a758565f691 | 300 | } else { |
cjw851102 | 1:2a758565f691 | 301 | left_collision_flag = 0; |
cjw851102 | 0:12a1972fa0d0 | 302 | } |
cjw851102 | 0:12a1972fa0d0 | 303 | } |
cjw851102 | 2:f427089e2bfa | 304 | } |
cjw851102 | 2:f427089e2bfa | 305 | if (left_collision_flag == 1) { |
cjw851102 | 2:f427089e2bfa | 306 | break; |
cjw851102 | 0:12a1972fa0d0 | 307 | } |
cjw851102 | 0:12a1972fa0d0 | 308 | } |
cjw851102 | 0:12a1972fa0d0 | 309 | } |
cjw851102 | 0:12a1972fa0d0 | 310 | } |
cjw851102 | 0:12a1972fa0d0 | 311 | |
cjw851102 | 1:2a758565f691 | 312 | |
cjw851102 | 0:12a1972fa0d0 | 313 | void right_collisionDetect() |
cjw851102 | 0:12a1972fa0d0 | 314 | { |
cjw851102 | 0:12a1972fa0d0 | 315 | int right_boundary[6][6]; |
cjw851102 | 1:2a758565f691 | 316 | get_pattern(pos.type,pos.rotation); |
cjw851102 | 0:12a1972fa0d0 | 317 | // get the left boundary pattern |
cjw851102 | 1:2a758565f691 | 318 | for (int j=0; j<=5; j++) { |
cjw851102 | 1:2a758565f691 | 319 | for (int i=5; i>=0; i--) { |
cjw851102 | 0:12a1972fa0d0 | 320 | if (pattern_buffer[i][j]==1) { |
cjw851102 | 0:12a1972fa0d0 | 321 | right_boundary[i][j]=1; |
cjw851102 | 0:12a1972fa0d0 | 322 | for(int k=i-1; k>=0; k--) { |
cjw851102 | 0:12a1972fa0d0 | 323 | right_boundary[k][j] = 0; |
cjw851102 | 0:12a1972fa0d0 | 324 | } |
cjw851102 | 1:2a758565f691 | 325 | break; |
cjw851102 | 0:12a1972fa0d0 | 326 | } else { |
cjw851102 | 0:12a1972fa0d0 | 327 | right_boundary[i][j]=0; |
cjw851102 | 0:12a1972fa0d0 | 328 | } |
cjw851102 | 0:12a1972fa0d0 | 329 | } |
cjw851102 | 0:12a1972fa0d0 | 330 | } |
cjw851102 | 0:12a1972fa0d0 | 331 | |
cjw851102 | 0:12a1972fa0d0 | 332 | //check left collision |
cjw851102 | 1:2a758565f691 | 333 | int x = pos.x; |
cjw851102 | 1:2a758565f691 | 334 | int y = pos.y; |
cjw851102 | 0:12a1972fa0d0 | 335 | for(int i = x; i <= x+5; i++) { // (x,y) is the left top point of a 6*6 square |
cjw851102 | 0:12a1972fa0d0 | 336 | for(int j=y; j <= y+5; j++) { |
cjw851102 | 0:12a1972fa0d0 | 337 | if(right_boundary[i-x][j-y]==1) { |
cjw851102 | 1:2a758565f691 | 338 | if(j>=0) { |
cjw851102 | 1:2a758565f691 | 339 | if(i >= 29) { |
cjw851102 | 1:2a758565f691 | 340 | right_collision_flag = 1; |
cjw851102 | 1:2a758565f691 | 341 | break; |
cjw851102 | 2:f427089e2bfa | 342 | } else if (lcd.getPixel(i+1,j)) { |
cjw851102 | 1:2a758565f691 | 343 | right_collision_flag = 1; |
cjw851102 | 1:2a758565f691 | 344 | break; |
cjw851102 | 1:2a758565f691 | 345 | } else { |
cjw851102 | 1:2a758565f691 | 346 | right_collision_flag = 0; |
cjw851102 | 0:12a1972fa0d0 | 347 | } |
cjw851102 | 0:12a1972fa0d0 | 348 | } |
cjw851102 | 0:12a1972fa0d0 | 349 | } |
cjw851102 | 2:f427089e2bfa | 350 | } |
cjw851102 | 2:f427089e2bfa | 351 | if (right_collision_flag == 1) { |
cjw851102 | 2:f427089e2bfa | 352 | break; |
cjw851102 | 0:12a1972fa0d0 | 353 | } |
cjw851102 | 0:12a1972fa0d0 | 354 | |
cjw851102 | 0:12a1972fa0d0 | 355 | } |
cjw851102 | 0:12a1972fa0d0 | 356 | } |
cjw851102 | 0:12a1972fa0d0 | 357 | |
cjw851102 | 0:12a1972fa0d0 | 358 | void bottom_collisionDetect() |
cjw851102 | 0:12a1972fa0d0 | 359 | { |
cjw851102 | 2:f427089e2bfa | 360 | int bot_boundary[6][6]; |
cjw851102 | 1:2a758565f691 | 361 | get_pattern(pos.type,pos.rotation); |
cjw851102 | 0:12a1972fa0d0 | 362 | // get the left boundary pattern |
cjw851102 | 1:2a758565f691 | 363 | for (int i=0; i<=5; i++) { |
cjw851102 | 1:2a758565f691 | 364 | for (int j=5; j>=0; j--) { |
cjw851102 | 0:12a1972fa0d0 | 365 | if (pattern_buffer[i][j]==1) { |
cjw851102 | 0:12a1972fa0d0 | 366 | bot_boundary[i][j]=1; |
cjw851102 | 2:f427089e2bfa | 367 | for(int k=j-1; k>=0; k--) { |
cjw851102 | 0:12a1972fa0d0 | 368 | bot_boundary[i][k] = 0; |
cjw851102 | 0:12a1972fa0d0 | 369 | } |
cjw851102 | 2:f427089e2bfa | 370 | break; |
cjw851102 | 0:12a1972fa0d0 | 371 | } else { |
cjw851102 | 0:12a1972fa0d0 | 372 | bot_boundary[i][j]=0; |
cjw851102 | 0:12a1972fa0d0 | 373 | } |
cjw851102 | 0:12a1972fa0d0 | 374 | } |
cjw851102 | 0:12a1972fa0d0 | 375 | } |
cjw851102 | 0:12a1972fa0d0 | 376 | |
cjw851102 | 0:12a1972fa0d0 | 377 | //check left collision |
cjw851102 | 1:2a758565f691 | 378 | int x = pos.x; |
cjw851102 | 1:2a758565f691 | 379 | int y = pos.y; |
cjw851102 | 0:12a1972fa0d0 | 380 | for(int i = x; i <= x+5; i++) { // (x,y) is the left top point of a 6*6 square |
cjw851102 | 2:f427089e2bfa | 381 | for(int j=y+5; j >= y; j--) { |
cjw851102 | 2:f427089e2bfa | 382 | if (j>=-1) { |
cjw851102 | 2:f427089e2bfa | 383 | if(bot_boundary[i-x][j-y]==1) { |
cjw851102 | 2:f427089e2bfa | 384 | if(j >= 47) { |
cjw851102 | 2:f427089e2bfa | 385 | bottom_collision_flag = 1; |
cjw851102 | 2:f427089e2bfa | 386 | break; |
cjw851102 | 2:f427089e2bfa | 387 | } else if (lcd.getPixel(i,j+1)) { |
cjw851102 | 2:f427089e2bfa | 388 | bottom_collision_flag = 1; |
cjw851102 | 2:f427089e2bfa | 389 | break; |
cjw851102 | 2:f427089e2bfa | 390 | } else { |
cjw851102 | 2:f427089e2bfa | 391 | bottom_collision_flag = 0; |
cjw851102 | 2:f427089e2bfa | 392 | } |
cjw851102 | 2:f427089e2bfa | 393 | } |
cjw851102 | 2:f427089e2bfa | 394 | } else { |
cjw851102 | 2:f427089e2bfa | 395 | bottom_collision_flag = 0; |
cjw851102 | 2:f427089e2bfa | 396 | } |
cjw851102 | 2:f427089e2bfa | 397 | } |
cjw851102 | 2:f427089e2bfa | 398 | if( bottom_collision_flag == 1) { |
cjw851102 | 2:f427089e2bfa | 399 | break; |
cjw851102 | 2:f427089e2bfa | 400 | } |
cjw851102 | 2:f427089e2bfa | 401 | } |
cjw851102 | 2:f427089e2bfa | 402 | } |
cjw851102 | 2:f427089e2bfa | 403 | |
cjw851102 | 2:f427089e2bfa | 404 | void rotation_collisionDetect() |
cjw851102 | 2:f427089e2bfa | 405 | { |
cjw851102 | 2:f427089e2bfa | 406 | int rotation = pos.rotation+1; |
cjw851102 | 2:f427089e2bfa | 407 | if (rotation>3) { |
cjw851102 | 2:f427089e2bfa | 408 | rotation=0; |
cjw851102 | 2:f427089e2bfa | 409 | } |
cjw851102 | 2:f427089e2bfa | 410 | get_pattern(pos.type,rotation); |
cjw851102 | 2:f427089e2bfa | 411 | |
cjw851102 | 2:f427089e2bfa | 412 | //check |
cjw851102 | 2:f427089e2bfa | 413 | int x = pos.x; |
cjw851102 | 2:f427089e2bfa | 414 | int y = pos.y; |
cjw851102 | 2:f427089e2bfa | 415 | for(int i = x; i <= x+5; i++) { // (x,y) is the left top point of a 6*6 square |
cjw851102 | 0:12a1972fa0d0 | 416 | for(int j=y; j <= y+5; j++) { |
cjw851102 | 2:f427089e2bfa | 417 | if(pattern_buffer[i-x][j-y]==1) { |
cjw851102 | 2:f427089e2bfa | 418 | if(i<0) { |
cjw851102 | 2:f427089e2bfa | 419 | rotation_collision_flag = 1; |
cjw851102 | 2:f427089e2bfa | 420 | } else if(lcd.getPixel(i,j)) { |
cjw851102 | 2:f427089e2bfa | 421 | rotation_collision_flag = 1; |
cjw851102 | 2:f427089e2bfa | 422 | break; |
cjw851102 | 1:2a758565f691 | 423 | } else { |
cjw851102 | 2:f427089e2bfa | 424 | rotation_collision_flag = 0; |
cjw851102 | 0:12a1972fa0d0 | 425 | } |
cjw851102 | 0:12a1972fa0d0 | 426 | } |
cjw851102 | 0:12a1972fa0d0 | 427 | } |
cjw851102 | 2:f427089e2bfa | 428 | if (rotation_collision_flag == 1) { |
cjw851102 | 2:f427089e2bfa | 429 | break; |
cjw851102 | 2:f427089e2bfa | 430 | } |
cjw851102 | 2:f427089e2bfa | 431 | } |
cjw851102 | 2:f427089e2bfa | 432 | } |
cjw851102 | 0:12a1972fa0d0 | 433 | |
cjw851102 | 2:f427089e2bfa | 434 | void top_collisionDetect() |
cjw851102 | 2:f427089e2bfa | 435 | { |
cjw851102 | 2:f427089e2bfa | 436 | if (pos.y==-6) { |
cjw851102 | 2:f427089e2bfa | 437 | bottom_collisionDetect(); |
cjw851102 | 2:f427089e2bfa | 438 | if (bottom_collision_flag == 1) { |
cjw851102 | 2:f427089e2bfa | 439 | top_collision_flag = 1; |
cjw851102 | 2:f427089e2bfa | 440 | } else { |
cjw851102 | 2:f427089e2bfa | 441 | top_collision_flag = 0; |
cjw851102 | 2:f427089e2bfa | 442 | } |
cjw851102 | 2:f427089e2bfa | 443 | } |
cjw851102 | 2:f427089e2bfa | 444 | } |
cjw851102 | 2:f427089e2bfa | 445 | |
cjw851102 | 2:f427089e2bfa | 446 | void fastmove_bottom_collisionDetect() |
cjw851102 | 2:f427089e2bfa | 447 | { |
cjw851102 | 2:f427089e2bfa | 448 | int bot_boundary[6][6]; |
cjw851102 | 2:f427089e2bfa | 449 | get_pattern(pos.type,pos.rotation); |
cjw851102 | 2:f427089e2bfa | 450 | // get the left boundary pattern |
cjw851102 | 2:f427089e2bfa | 451 | for (int i=0; i<=5; i++) { |
cjw851102 | 2:f427089e2bfa | 452 | for (int j=5; j>=0; j--) { |
cjw851102 | 2:f427089e2bfa | 453 | if (pattern_buffer[i][j]==1) { |
cjw851102 | 2:f427089e2bfa | 454 | bot_boundary[i][j]=1; |
cjw851102 | 2:f427089e2bfa | 455 | for(int k=j-1; k>=0; k--) { |
cjw851102 | 2:f427089e2bfa | 456 | bot_boundary[i][k] = 0; |
cjw851102 | 2:f427089e2bfa | 457 | } |
cjw851102 | 2:f427089e2bfa | 458 | break; |
cjw851102 | 2:f427089e2bfa | 459 | } else { |
cjw851102 | 2:f427089e2bfa | 460 | bot_boundary[i][j]=0; |
cjw851102 | 2:f427089e2bfa | 461 | } |
cjw851102 | 2:f427089e2bfa | 462 | } |
cjw851102 | 2:f427089e2bfa | 463 | } |
cjw851102 | 2:f427089e2bfa | 464 | |
cjw851102 | 2:f427089e2bfa | 465 | //check left collision |
cjw851102 | 2:f427089e2bfa | 466 | int x = pos.x; |
cjw851102 | 2:f427089e2bfa | 467 | int y = pos.y; |
cjw851102 | 2:f427089e2bfa | 468 | for(int i = x; i <= x+5; i++) { // (x,y) is the left top point of a 6*6 square |
cjw851102 | 2:f427089e2bfa | 469 | for(int j=y+5; j >= y; j--) { |
cjw851102 | 2:f427089e2bfa | 470 | if (j>=-1) { |
cjw851102 | 2:f427089e2bfa | 471 | if(bot_boundary[i-x][j-y]==1) { |
cjw851102 | 3:5494a0fb3a33 | 472 | if(j >= 42) { |
cjw851102 | 2:f427089e2bfa | 473 | fastmove_bottom_collision_flag = 1; |
cjw851102 | 2:f427089e2bfa | 474 | break; |
cjw851102 | 2:f427089e2bfa | 475 | } else if (lcd.getPixel(i,j+4)) { |
cjw851102 | 2:f427089e2bfa | 476 | fastmove_bottom_collision_flag = 1; |
cjw851102 | 2:f427089e2bfa | 477 | break; |
cjw851102 | 2:f427089e2bfa | 478 | } else { |
cjw851102 | 2:f427089e2bfa | 479 | fastmove_bottom_collision_flag = 0; |
cjw851102 | 2:f427089e2bfa | 480 | } |
cjw851102 | 2:f427089e2bfa | 481 | } |
cjw851102 | 2:f427089e2bfa | 482 | } else { |
cjw851102 | 2:f427089e2bfa | 483 | fastmove_bottom_collision_flag = 0; |
cjw851102 | 2:f427089e2bfa | 484 | } |
cjw851102 | 2:f427089e2bfa | 485 | } |
cjw851102 | 2:f427089e2bfa | 486 | if( fastmove_bottom_collision_flag == 1) { |
cjw851102 | 2:f427089e2bfa | 487 | break; |
cjw851102 | 2:f427089e2bfa | 488 | } |
cjw851102 | 0:12a1972fa0d0 | 489 | } |
cjw851102 | 1:2a758565f691 | 490 | } |
cjw851102 | 1:2a758565f691 | 491 | |
cjw851102 | 1:2a758565f691 | 492 | void game_isr() |
cjw851102 | 1:2a758565f691 | 493 | { |
cjw851102 | 1:2a758565f691 | 494 | g_game_flag = 1; |
cjw851102 | 1:2a758565f691 | 495 | } |
cjw851102 | 1:2a758565f691 | 496 | |
cjw851102 | 1:2a758565f691 | 497 | // read default positions of the joystick to calibrate later readings |
cjw851102 | 1:2a758565f691 | 498 | void calibrateJoystick() |
cjw851102 | 1:2a758565f691 | 499 | { |
cjw851102 | 1:2a758565f691 | 500 | button.mode(PullDown); |
cjw851102 | 1:2a758565f691 | 501 | // must not move during calibration |
cjw851102 | 1:2a758565f691 | 502 | joystick.x0 = xPot; // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly) |
cjw851102 | 1:2a758565f691 | 503 | joystick.y0 = yPot; |
cjw851102 | 1:2a758565f691 | 504 | } |
cjw851102 | 1:2a758565f691 | 505 | |
cjw851102 | 1:2a758565f691 | 506 | void updateJoystick() |
cjw851102 | 1:2a758565f691 | 507 | { |
cjw851102 | 1:2a758565f691 | 508 | // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred) |
cjw851102 | 1:2a758565f691 | 509 | joystick.x = xPot - joystick.x0; |
cjw851102 | 1:2a758565f691 | 510 | joystick.y = yPot - joystick.y0; |
cjw851102 | 1:2a758565f691 | 511 | // read button state |
cjw851102 | 1:2a758565f691 | 512 | joystick.button = button; |
cjw851102 | 1:2a758565f691 | 513 | |
cjw851102 | 1:2a758565f691 | 514 | // calculate direction depending on x,y values |
cjw851102 | 1:2a758565f691 | 515 | // tolerance allows a little lee-way in case joystick not exactly in the stated direction |
cjw851102 | 1:2a758565f691 | 516 | if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) { |
cjw851102 | 1:2a758565f691 | 517 | joystick.direction = CENTRE; |
cjw851102 | 1:2a758565f691 | 518 | } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) { |
cjw851102 | 1:2a758565f691 | 519 | joystick.direction = UP; |
cjw851102 | 1:2a758565f691 | 520 | } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) { |
cjw851102 | 1:2a758565f691 | 521 | joystick.direction = DOWN; |
cjw851102 | 1:2a758565f691 | 522 | } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) { |
cjw851102 | 1:2a758565f691 | 523 | joystick.direction = RIGHT; |
cjw851102 | 1:2a758565f691 | 524 | } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) { |
cjw851102 | 1:2a758565f691 | 525 | joystick.direction = LEFT; |
cjw851102 | 1:2a758565f691 | 526 | } else { |
cjw851102 | 1:2a758565f691 | 527 | joystick.direction = UNKNOWN; |
cjw851102 | 1:2a758565f691 | 528 | } |
cjw851102 | 1:2a758565f691 | 529 | |
cjw851102 | 2:f427089e2bfa | 530 | } |
cjw851102 | 2:f427089e2bfa | 531 | |
cjw851102 | 2:f427089e2bfa | 532 | void cancelLine() |
cjw851102 | 2:f427089e2bfa | 533 | { |
cjw851102 | 2:f427089e2bfa | 534 | // int linePattern[30][2]; //the pixel setting for one line(30x2 square) |
cjw851102 | 2:f427089e2bfa | 535 | int count; |
cjw851102 | 2:f427089e2bfa | 536 | for(int j=0; j<=46; j+=2) { |
cjw851102 | 2:f427089e2bfa | 537 | for(int i=0; i<=29; i++) { |
cjw851102 | 2:f427089e2bfa | 538 | if (lcd.getPixel(i,j)==0||lcd.getPixel(i,j+1)==0) { |
cjw851102 | 2:f427089e2bfa | 539 | count=0; |
cjw851102 | 2:f427089e2bfa | 540 | break; |
cjw851102 | 2:f427089e2bfa | 541 | } else if (lcd.getPixel(i,j)&&lcd.getPixel(i,j+1)) { |
cjw851102 | 2:f427089e2bfa | 542 | count++; |
cjw851102 | 2:f427089e2bfa | 543 | } |
cjw851102 | 2:f427089e2bfa | 544 | } |
cjw851102 | 2:f427089e2bfa | 545 | if(count==30) { // one line is filled |
cjw851102 | 2:f427089e2bfa | 546 | count=0; |
cjw851102 | 2:f427089e2bfa | 547 | lcd.drawRect(0,j,29,1,2); //clear the line |
cjw851102 | 2:f427089e2bfa | 548 | score+=10; // add the score |
cjw851102 | 2:f427089e2bfa | 549 | //print the score |
cjw851102 | 2:f427089e2bfa | 550 | char scoreBuffer[14]; |
cjw851102 | 2:f427089e2bfa | 551 | sprintf(scoreBuffer,"%d",score); |
cjw851102 | 2:f427089e2bfa | 552 | lcd.printString(scoreBuffer,42,3); |
cjw851102 | 2:f427089e2bfa | 553 | scan(); |
cjw851102 | 2:f427089e2bfa | 554 | // move the patterns upon the line down for 2 pixels' hight |
cjw851102 | 2:f427089e2bfa | 555 | for (int x=0; x<=29; x++) { |
cjw851102 | 2:f427089e2bfa | 556 | for (int y=j; y>=0; y--) { |
cjw851102 | 2:f427089e2bfa | 557 | if (buffer[x][y]) { |
cjw851102 | 2:f427089e2bfa | 558 | lcd.clearPixel(x,y); |
cjw851102 | 2:f427089e2bfa | 559 | lcd.setPixel(x,y+2); |
cjw851102 | 2:f427089e2bfa | 560 | } |
cjw851102 | 2:f427089e2bfa | 561 | } |
cjw851102 | 2:f427089e2bfa | 562 | } |
cjw851102 | 2:f427089e2bfa | 563 | } |
cjw851102 | 2:f427089e2bfa | 564 | } |
cjw851102 | 2:f427089e2bfa | 565 | } |
cjw851102 | 2:f427089e2bfa | 566 | |
cjw851102 | 2:f427089e2bfa | 567 | void finishAnimation() |
cjw851102 | 2:f427089e2bfa | 568 | { |
cjw851102 | 2:f427089e2bfa | 569 | for (int j=47; j>=0; j--) { |
cjw851102 | 2:f427089e2bfa | 570 | lcd.drawRect(0,j,29,1,1); |
cjw851102 | 2:f427089e2bfa | 571 | wait(0.05); |
cjw851102 | 2:f427089e2bfa | 572 | lcd.refresh(); |
cjw851102 | 2:f427089e2bfa | 573 | } |
cjw851102 | 2:f427089e2bfa | 574 | } |
cjw851102 | 2:f427089e2bfa | 575 | |
cjw851102 | 2:f427089e2bfa | 576 | |
cjw851102 | 2:f427089e2bfa | 577 |