My ELEC2645 joystick project Tetris Game NAME: JIANWEI CHEN SID: 200879849

Dependencies:   N5110 SDFileSystem mbed

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?

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