Przemek Wirkus
/
MBEDtetris
Simple tetris game to show usage of C12832 LCD.
mtrix.h@3:dbd1976e4add, 2014-03-18 (annotated)
- Committer:
- PrzemekWirkus
- Date:
- Tue Mar 18 16:55:43 2014 +0000
- Revision:
- 3:dbd1976e4add
- Parent:
- 1:cdd5880742fc
Working version. No game features implemented yet. Next: full line cut.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
PrzemekWirkus | 0:644f70b470b5 | 1 | #ifndef MBED_MTRIS_MAIN_HEADER_H |
PrzemekWirkus | 0:644f70b470b5 | 2 | #define MBED_MTRIS_MAIN_HEADER_H |
PrzemekWirkus | 0:644f70b470b5 | 3 | |
PrzemekWirkus | 0:644f70b470b5 | 4 | #include <string> |
PrzemekWirkus | 0:644f70b470b5 | 5 | #include <utility> |
PrzemekWirkus | 0:644f70b470b5 | 6 | |
PrzemekWirkus | 3:dbd1976e4add | 7 | #define LCD_W 8 |
PrzemekWirkus | 3:dbd1976e4add | 8 | #define LCD_H 24 |
PrzemekWirkus | 0:644f70b470b5 | 9 | #define BRICK_SIZE_X 4 |
PrzemekWirkus | 0:644f70b470b5 | 10 | #define BRICK_SIZE_Y 4 |
PrzemekWirkus | 0:644f70b470b5 | 11 | |
PrzemekWirkus | 0:644f70b470b5 | 12 | /* QUBE |
PrzemekWirkus | 0:644f70b470b5 | 13 | .... .... .... .... |
PrzemekWirkus | 0:644f70b470b5 | 14 | .##. .##. .##. .##. |
PrzemekWirkus | 0:644f70b470b5 | 15 | .##. .##. .##. .##. |
PrzemekWirkus | 0:644f70b470b5 | 16 | .... .... .... .... |
PrzemekWirkus | 0:644f70b470b5 | 17 | */ |
PrzemekWirkus | 0:644f70b470b5 | 18 | #define BRICK_QUBE_1 {0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 19 | #define BRICK_QUBE_2 {0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 20 | #define BRICK_QUBE_3 {0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 21 | #define BRICK_QUBE_4 {0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 22 | |
PrzemekWirkus | 0:644f70b470b5 | 23 | /* T-agon |
PrzemekWirkus | 0:644f70b470b5 | 24 | .... .... .... .... |
PrzemekWirkus | 0:644f70b470b5 | 25 | .#.. #... .... .#.. |
PrzemekWirkus | 0:644f70b470b5 | 26 | ###. ##.. ###. ##.. |
PrzemekWirkus | 0:644f70b470b5 | 27 | .... #... .#.. .#.. |
PrzemekWirkus | 0:644f70b470b5 | 28 | */ |
PrzemekWirkus | 0:644f70b470b5 | 29 | #define BRICK_T_1 {0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 30 | #define BRICK_T_2 {0,0,0,0,1,0,0,0,1,1,0,0,1,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 31 | #define BRICK_T_3 {0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 32 | #define BRICK_T_4 {0,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 33 | |
PrzemekWirkus | 0:644f70b470b5 | 34 | /* L-agon |
PrzemekWirkus | 0:644f70b470b5 | 35 | #... .... .... .... |
PrzemekWirkus | 0:644f70b470b5 | 36 | #... ###. ##.. ..#. |
PrzemekWirkus | 0:644f70b470b5 | 37 | ##.. #... .#.. ###. |
PrzemekWirkus | 0:644f70b470b5 | 38 | .... .... .#.. .... |
PrzemekWirkus | 0:644f70b470b5 | 39 | */ |
PrzemekWirkus | 0:644f70b470b5 | 40 | #define BRICK_L_1 {1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 41 | #define BRICK_L_2 {0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 42 | #define BRICK_L_3 {0,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 43 | #define BRICK_L_4 {0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 44 | |
PrzemekWirkus | 0:644f70b470b5 | 45 | /* I-agon |
PrzemekWirkus | 0:644f70b470b5 | 46 | .#.. .... .#.. .... |
PrzemekWirkus | 0:644f70b470b5 | 47 | .#.. #### .#.. #### |
PrzemekWirkus | 0:644f70b470b5 | 48 | .#.. .... .#.. .... |
PrzemekWirkus | 0:644f70b470b5 | 49 | .#.. .... .#.. .... |
PrzemekWirkus | 0:644f70b470b5 | 50 | */ |
PrzemekWirkus | 0:644f70b470b5 | 51 | #define BRICK_I_1 {0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 52 | #define BRICK_I_2 {0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 53 | #define BRICK_I_3 {0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 54 | #define BRICK_I_4 {0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 55 | |
PrzemekWirkus | 0:644f70b470b5 | 56 | |
PrzemekWirkus | 0:644f70b470b5 | 57 | /* +-agon |
PrzemekWirkus | 0:644f70b470b5 | 58 | .#.. .#.. .#.. .#.. |
PrzemekWirkus | 0:644f70b470b5 | 59 | ###. ###. ###. ###. |
PrzemekWirkus | 0:644f70b470b5 | 60 | .#.. .#.. .#.. .#.. |
PrzemekWirkus | 0:644f70b470b5 | 61 | .... .... .... .... |
PrzemekWirkus | 0:644f70b470b5 | 62 | */ |
PrzemekWirkus | 0:644f70b470b5 | 63 | #define BRICK_P_1 {0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 64 | #define BRICK_P_2 {0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 65 | #define BRICK_P_3 {0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 66 | #define BRICK_P_4 {0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 67 | |
PrzemekWirkus | 0:644f70b470b5 | 68 | /* *-agon |
PrzemekWirkus | 0:644f70b470b5 | 69 | .... .... .... .... |
PrzemekWirkus | 0:644f70b470b5 | 70 | .#.. .#.. .#.. .#.. |
PrzemekWirkus | 0:644f70b470b5 | 71 | .... .... .... .... |
PrzemekWirkus | 0:644f70b470b5 | 72 | .... .... .... .... |
PrzemekWirkus | 0:644f70b470b5 | 73 | */ |
PrzemekWirkus | 0:644f70b470b5 | 74 | #define BRICK_S_1 {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 75 | #define BRICK_S_2 {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 76 | #define BRICK_S_3 {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 77 | #define BRICK_S_4 {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 78 | |
PrzemekWirkus | 0:644f70b470b5 | 79 | /* 4-agon |
PrzemekWirkus | 0:644f70b470b5 | 80 | #... .... #... .... |
PrzemekWirkus | 0:644f70b470b5 | 81 | ##.. .##. ##.. .##. |
PrzemekWirkus | 0:644f70b470b5 | 82 | .#.. ##.. .#.. ##.. |
PrzemekWirkus | 0:644f70b470b5 | 83 | .... .... .... .... |
PrzemekWirkus | 0:644f70b470b5 | 84 | */ |
PrzemekWirkus | 0:644f70b470b5 | 85 | #define BRICK_4_1 {1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 86 | #define BRICK_4_2 {0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 87 | #define BRICK_4_3 {1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 88 | #define BRICK_4_4 {0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0} |
PrzemekWirkus | 0:644f70b470b5 | 89 | |
PrzemekWirkus | 0:644f70b470b5 | 90 | #define MTRIX_BRICOK_COUNT 7 |
PrzemekWirkus | 0:644f70b470b5 | 91 | |
PrzemekWirkus | 0:644f70b470b5 | 92 | template <class T> |
PrzemekWirkus | 0:644f70b470b5 | 93 | class MBEDtrisBrick |
PrzemekWirkus | 0:644f70b470b5 | 94 | { |
PrzemekWirkus | 0:644f70b470b5 | 95 | public: |
PrzemekWirkus | 0:644f70b470b5 | 96 | typedef T brick_pattern[BRICK_SIZE_X][BRICK_SIZE_Y]; |
PrzemekWirkus | 0:644f70b470b5 | 97 | |
PrzemekWirkus | 0:644f70b470b5 | 98 | MBEDtrisBrick::MBEDtrisBrick() |
PrzemekWirkus | 0:644f70b470b5 | 99 | { |
PrzemekWirkus | 0:644f70b470b5 | 100 | brick_index = 0; |
PrzemekWirkus | 0:644f70b470b5 | 101 | brick_rotate_index = 0; |
PrzemekWirkus | 0:644f70b470b5 | 102 | } |
PrzemekWirkus | 0:644f70b470b5 | 103 | |
PrzemekWirkus | 0:644f70b470b5 | 104 | char getcell(int posx, int posy) |
PrzemekWirkus | 0:644f70b470b5 | 105 | { |
PrzemekWirkus | 0:644f70b470b5 | 106 | static T brick[MTRIX_BRICOK_COUNT][4][BRICK_SIZE_X][BRICK_SIZE_Y] = |
PrzemekWirkus | 0:644f70b470b5 | 107 | { |
PrzemekWirkus | 0:644f70b470b5 | 108 | {BRICK_QUBE_1, BRICK_QUBE_2, BRICK_QUBE_3, BRICK_QUBE_4}, |
PrzemekWirkus | 0:644f70b470b5 | 109 | {BRICK_T_1, BRICK_T_2, BRICK_T_3, BRICK_T_4}, |
PrzemekWirkus | 0:644f70b470b5 | 110 | {BRICK_L_1, BRICK_L_2, BRICK_L_3, BRICK_L_4}, |
PrzemekWirkus | 0:644f70b470b5 | 111 | {BRICK_I_1, BRICK_I_2, BRICK_I_3, BRICK_I_4}, |
PrzemekWirkus | 0:644f70b470b5 | 112 | {BRICK_P_1, BRICK_P_2, BRICK_P_3, BRICK_P_4}, |
PrzemekWirkus | 0:644f70b470b5 | 113 | {BRICK_S_1, BRICK_S_2, BRICK_S_3, BRICK_S_4}, |
PrzemekWirkus | 0:644f70b470b5 | 114 | {BRICK_4_1, BRICK_4_2, BRICK_4_3, BRICK_4_4} |
PrzemekWirkus | 0:644f70b470b5 | 115 | }; |
PrzemekWirkus | 0:644f70b470b5 | 116 | |
PrzemekWirkus | 0:644f70b470b5 | 117 | return brick[brick_index][brick_rotate_index][posx][posy]; |
PrzemekWirkus | 0:644f70b470b5 | 118 | } |
PrzemekWirkus | 0:644f70b470b5 | 119 | |
PrzemekWirkus | 0:644f70b470b5 | 120 | int rotate_next() { return brick_rotate_index = (brick_rotate_index + 1) % 4; } |
PrzemekWirkus | 0:644f70b470b5 | 121 | int rotate_prev() { return brick_rotate_index = (brick_rotate_index == 0) ? 3 : brick_rotate_index - 1; } |
PrzemekWirkus | 0:644f70b470b5 | 122 | |
PrzemekWirkus | 0:644f70b470b5 | 123 | int brick_next() { return brick_index = (brick_index + 1) % MTRIX_BRICOK_COUNT; } |
PrzemekWirkus | 0:644f70b470b5 | 124 | int brick_prev() { return brick_index = (brick_index == 0) ? (MTRIX_BRICOK_COUNT - 1) : brick_rotate_index - 1; } |
PrzemekWirkus | 0:644f70b470b5 | 125 | |
PrzemekWirkus | 0:644f70b470b5 | 126 | protected: |
PrzemekWirkus | 0:644f70b470b5 | 127 | int brick_index; |
PrzemekWirkus | 0:644f70b470b5 | 128 | int brick_rotate_index; |
PrzemekWirkus | 0:644f70b470b5 | 129 | }; |
PrzemekWirkus | 0:644f70b470b5 | 130 | |
PrzemekWirkus | 0:644f70b470b5 | 131 | |
PrzemekWirkus | 0:644f70b470b5 | 132 | template <class T> |
PrzemekWirkus | 0:644f70b470b5 | 133 | class MBEDtrisTheGame |
PrzemekWirkus | 0:644f70b470b5 | 134 | { |
PrzemekWirkus | 0:644f70b470b5 | 135 | public: |
PrzemekWirkus | 0:644f70b470b5 | 136 | MBEDtrisTheGame::MBEDtrisTheGame() |
PrzemekWirkus | 0:644f70b470b5 | 137 | { |
PrzemekWirkus | 0:644f70b470b5 | 138 | fill_matrix(0); |
PrzemekWirkus | 0:644f70b470b5 | 139 | } |
PrzemekWirkus | 0:644f70b470b5 | 140 | |
PrzemekWirkus | 0:644f70b470b5 | 141 | void set_new_brick_pos() |
PrzemekWirkus | 0:644f70b470b5 | 142 | { |
PrzemekWirkus | 0:644f70b470b5 | 143 | int g_brick_pos_x = (LCD_W) / 2; |
PrzemekWirkus | 0:644f70b470b5 | 144 | int g_brick_pos_y = 0; |
PrzemekWirkus | 0:644f70b470b5 | 145 | } |
PrzemekWirkus | 0:644f70b470b5 | 146 | |
PrzemekWirkus | 0:644f70b470b5 | 147 | void fill_matrix(char pattern) |
PrzemekWirkus | 0:644f70b470b5 | 148 | { |
PrzemekWirkus | 0:644f70b470b5 | 149 | for (int x = 0; x < LCD_W; x++) |
PrzemekWirkus | 0:644f70b470b5 | 150 | { |
PrzemekWirkus | 0:644f70b470b5 | 151 | for (int y = 0; y < LCD_H; y++) |
PrzemekWirkus | 0:644f70b470b5 | 152 | { |
PrzemekWirkus | 0:644f70b470b5 | 153 | lcd_matrix[x][y] = pattern; |
PrzemekWirkus | 0:644f70b470b5 | 154 | } |
PrzemekWirkus | 0:644f70b470b5 | 155 | } |
PrzemekWirkus | 0:644f70b470b5 | 156 | } |
PrzemekWirkus | 0:644f70b470b5 | 157 | |
PrzemekWirkus | 0:644f70b470b5 | 158 | public: |
PrzemekWirkus | 0:644f70b470b5 | 159 | bool detect_brick_bottom_collision(int offset_x, int offset_y); |
PrzemekWirkus | 0:644f70b470b5 | 160 | bool detect_brick_collision(int offset_x, int offset_y); |
PrzemekWirkus | 0:644f70b470b5 | 161 | bool detect_brick_side_collision(int offset_x, int offset_y); |
PrzemekWirkus | 0:644f70b470b5 | 162 | bool append_brick_to_matrix(); |
PrzemekWirkus | 0:644f70b470b5 | 163 | |
PrzemekWirkus | 0:644f70b470b5 | 164 | bool try_move_left(); |
PrzemekWirkus | 0:644f70b470b5 | 165 | bool try_move_right(); |
PrzemekWirkus | 0:644f70b470b5 | 166 | bool try_move_down(); |
PrzemekWirkus | 0:644f70b470b5 | 167 | bool try_rotate(); |
PrzemekWirkus | 0:644f70b470b5 | 168 | |
PrzemekWirkus | 0:644f70b470b5 | 169 | void move_brick_left(int offset = 1) { g_brick_pos_x -= offset; } |
PrzemekWirkus | 0:644f70b470b5 | 170 | void move_brick_right(int offset = 1) { g_brick_pos_x += offset; } |
PrzemekWirkus | 0:644f70b470b5 | 171 | void move_brick_up(int offset = 1) { g_brick_pos_y -= offset; } |
PrzemekWirkus | 0:644f70b470b5 | 172 | void move_brick_down(int offset = 1) { try_move_down(); } |
PrzemekWirkus | 0:644f70b470b5 | 173 | |
PrzemekWirkus | 0:644f70b470b5 | 174 | T get_matrix_cell(int pos_x, int pos_y) { return lcd_matrix[pos_x][pos_y]; } |
PrzemekWirkus | 0:644f70b470b5 | 175 | T get_brick_cell(int pos_x, int pos_y) { return brick.getcell(pos_x, pos_y); } |
PrzemekWirkus | 0:644f70b470b5 | 176 | std::pair<int, int> get_brick_pos() { return std::make_pair(g_brick_pos_x, g_brick_pos_y); } |
PrzemekWirkus | 0:644f70b470b5 | 177 | |
PrzemekWirkus | 0:644f70b470b5 | 178 | protected: |
PrzemekWirkus | 0:644f70b470b5 | 179 | // Brick in use |
PrzemekWirkus | 0:644f70b470b5 | 180 | MBEDtrisBrick<T> brick; |
PrzemekWirkus | 0:644f70b470b5 | 181 | |
PrzemekWirkus | 0:644f70b470b5 | 182 | // Display with solid elements |
PrzemekWirkus | 0:644f70b470b5 | 183 | T lcd_matrix[LCD_W][LCD_H]; |
PrzemekWirkus | 0:644f70b470b5 | 184 | |
PrzemekWirkus | 0:644f70b470b5 | 185 | // Curent brick screen posiotion |
PrzemekWirkus | 0:644f70b470b5 | 186 | int g_brick_pos_x; |
PrzemekWirkus | 0:644f70b470b5 | 187 | int g_brick_pos_y; |
PrzemekWirkus | 0:644f70b470b5 | 188 | }; |
PrzemekWirkus | 0:644f70b470b5 | 189 | |
PrzemekWirkus | 0:644f70b470b5 | 190 | template <class T> |
PrzemekWirkus | 0:644f70b470b5 | 191 | bool MBEDtrisTheGame<T>::detect_brick_bottom_collision(int offset_x, int offset_y) |
PrzemekWirkus | 0:644f70b470b5 | 192 | { |
PrzemekWirkus | 0:644f70b470b5 | 193 | for (int x = 0; x < BRICK_SIZE_X; x++) |
PrzemekWirkus | 0:644f70b470b5 | 194 | { |
PrzemekWirkus | 0:644f70b470b5 | 195 | for (int y = 0; y < BRICK_SIZE_Y; y++) |
PrzemekWirkus | 0:644f70b470b5 | 196 | { |
PrzemekWirkus | 0:644f70b470b5 | 197 | if (brick.getcell(x, y) && (g_brick_pos_y + offset_y + y >= LCD_H)) |
PrzemekWirkus | 0:644f70b470b5 | 198 | { |
PrzemekWirkus | 0:644f70b470b5 | 199 | return true; |
PrzemekWirkus | 0:644f70b470b5 | 200 | } |
PrzemekWirkus | 0:644f70b470b5 | 201 | } |
PrzemekWirkus | 0:644f70b470b5 | 202 | } |
PrzemekWirkus | 0:644f70b470b5 | 203 | return false; |
PrzemekWirkus | 0:644f70b470b5 | 204 | } |
PrzemekWirkus | 0:644f70b470b5 | 205 | |
PrzemekWirkus | 0:644f70b470b5 | 206 | template <class T> |
PrzemekWirkus | 0:644f70b470b5 | 207 | bool MBEDtrisTheGame<T>::detect_brick_collision(int offset_x, int offset_y) |
PrzemekWirkus | 0:644f70b470b5 | 208 | { |
PrzemekWirkus | 0:644f70b470b5 | 209 | for (int x = 0; x < BRICK_SIZE_X; x++) |
PrzemekWirkus | 0:644f70b470b5 | 210 | { |
PrzemekWirkus | 0:644f70b470b5 | 211 | for (int y = 0; y < BRICK_SIZE_Y; y++) |
PrzemekWirkus | 0:644f70b470b5 | 212 | { |
PrzemekWirkus | 0:644f70b470b5 | 213 | if (brick.getcell(x, y) && lcd_matrix[g_brick_pos_x + offset_x + x][g_brick_pos_y + offset_y + y]) |
PrzemekWirkus | 0:644f70b470b5 | 214 | { |
PrzemekWirkus | 0:644f70b470b5 | 215 | return true; |
PrzemekWirkus | 0:644f70b470b5 | 216 | } |
PrzemekWirkus | 0:644f70b470b5 | 217 | } |
PrzemekWirkus | 0:644f70b470b5 | 218 | } |
PrzemekWirkus | 0:644f70b470b5 | 219 | return false; |
PrzemekWirkus | 0:644f70b470b5 | 220 | } |
PrzemekWirkus | 0:644f70b470b5 | 221 | |
PrzemekWirkus | 0:644f70b470b5 | 222 | template <class T> |
PrzemekWirkus | 0:644f70b470b5 | 223 | bool MBEDtrisTheGame<T>::detect_brick_side_collision(int offset_x, int offset_y) |
PrzemekWirkus | 0:644f70b470b5 | 224 | { |
PrzemekWirkus | 0:644f70b470b5 | 225 | for (int x = 0; x < BRICK_SIZE_X; x++) |
PrzemekWirkus | 0:644f70b470b5 | 226 | { |
PrzemekWirkus | 0:644f70b470b5 | 227 | for (int y = 0; y < BRICK_SIZE_Y; y++) |
PrzemekWirkus | 0:644f70b470b5 | 228 | { |
PrzemekWirkus | 0:644f70b470b5 | 229 | if (brick.getcell(x, y) && g_brick_pos_x + offset_x + x < 0) |
PrzemekWirkus | 0:644f70b470b5 | 230 | { |
PrzemekWirkus | 0:644f70b470b5 | 231 | return true; |
PrzemekWirkus | 0:644f70b470b5 | 232 | } |
PrzemekWirkus | 0:644f70b470b5 | 233 | if (brick.getcell(x, y) && (g_brick_pos_x + offset_x + x >= LCD_W)) |
PrzemekWirkus | 0:644f70b470b5 | 234 | { |
PrzemekWirkus | 0:644f70b470b5 | 235 | return true; |
PrzemekWirkus | 0:644f70b470b5 | 236 | } |
PrzemekWirkus | 0:644f70b470b5 | 237 | } |
PrzemekWirkus | 0:644f70b470b5 | 238 | } |
PrzemekWirkus | 0:644f70b470b5 | 239 | return false; |
PrzemekWirkus | 0:644f70b470b5 | 240 | } |
PrzemekWirkus | 0:644f70b470b5 | 241 | |
PrzemekWirkus | 0:644f70b470b5 | 242 | template <class T> |
PrzemekWirkus | 0:644f70b470b5 | 243 | bool MBEDtrisTheGame<T>::append_brick_to_matrix() |
PrzemekWirkus | 0:644f70b470b5 | 244 | { |
PrzemekWirkus | 0:644f70b470b5 | 245 | for (int x = 0; x < BRICK_SIZE_X; x++) |
PrzemekWirkus | 0:644f70b470b5 | 246 | { |
PrzemekWirkus | 0:644f70b470b5 | 247 | for (int y = 0; y < BRICK_SIZE_Y; y++) |
PrzemekWirkus | 0:644f70b470b5 | 248 | { |
PrzemekWirkus | 0:644f70b470b5 | 249 | if (brick.getcell(x, y)) |
PrzemekWirkus | 0:644f70b470b5 | 250 | { |
PrzemekWirkus | 0:644f70b470b5 | 251 | lcd_matrix[g_brick_pos_x + x][g_brick_pos_y + y] = brick.getcell(x, y); |
PrzemekWirkus | 0:644f70b470b5 | 252 | } |
PrzemekWirkus | 0:644f70b470b5 | 253 | } |
PrzemekWirkus | 0:644f70b470b5 | 254 | } |
PrzemekWirkus | 0:644f70b470b5 | 255 | return true; |
PrzemekWirkus | 0:644f70b470b5 | 256 | } |
PrzemekWirkus | 0:644f70b470b5 | 257 | |
PrzemekWirkus | 0:644f70b470b5 | 258 | template <class T> |
PrzemekWirkus | 0:644f70b470b5 | 259 | bool MBEDtrisTheGame<T>::try_move_left() |
PrzemekWirkus | 0:644f70b470b5 | 260 | { |
PrzemekWirkus | 0:644f70b470b5 | 261 | bool collision_size = detect_brick_side_collision(-1, 0); |
PrzemekWirkus | 0:644f70b470b5 | 262 | bool collision_brick = detect_brick_collision(-1, 0); |
PrzemekWirkus | 0:644f70b470b5 | 263 | if (!collision_size && !collision_brick) |
PrzemekWirkus | 0:644f70b470b5 | 264 | { |
PrzemekWirkus | 0:644f70b470b5 | 265 | g_brick_pos_x--; |
PrzemekWirkus | 0:644f70b470b5 | 266 | return true; |
PrzemekWirkus | 0:644f70b470b5 | 267 | } |
PrzemekWirkus | 0:644f70b470b5 | 268 | return false; |
PrzemekWirkus | 0:644f70b470b5 | 269 | } |
PrzemekWirkus | 0:644f70b470b5 | 270 | |
PrzemekWirkus | 0:644f70b470b5 | 271 | template <class T> |
PrzemekWirkus | 0:644f70b470b5 | 272 | bool MBEDtrisTheGame<T>::try_move_right() |
PrzemekWirkus | 0:644f70b470b5 | 273 | { |
PrzemekWirkus | 0:644f70b470b5 | 274 | bool collision_size = detect_brick_side_collision(1, 0); |
PrzemekWirkus | 0:644f70b470b5 | 275 | bool collision_brick = detect_brick_collision(1, 0); |
PrzemekWirkus | 0:644f70b470b5 | 276 | if (!collision_size && !collision_brick) |
PrzemekWirkus | 0:644f70b470b5 | 277 | { |
PrzemekWirkus | 0:644f70b470b5 | 278 | g_brick_pos_x++; |
PrzemekWirkus | 0:644f70b470b5 | 279 | return true; |
PrzemekWirkus | 0:644f70b470b5 | 280 | } |
PrzemekWirkus | 0:644f70b470b5 | 281 | return false; |
PrzemekWirkus | 0:644f70b470b5 | 282 | } |
PrzemekWirkus | 0:644f70b470b5 | 283 | |
PrzemekWirkus | 0:644f70b470b5 | 284 | template <class T> |
PrzemekWirkus | 0:644f70b470b5 | 285 | bool MBEDtrisTheGame<T>::try_move_down() |
PrzemekWirkus | 0:644f70b470b5 | 286 | { |
PrzemekWirkus | 0:644f70b470b5 | 287 | bool brick_collision = detect_brick_collision(0, 1); |
PrzemekWirkus | 0:644f70b470b5 | 288 | bool brick_bottom_collision = detect_brick_bottom_collision(0, 1); |
PrzemekWirkus | 0:644f70b470b5 | 289 | |
PrzemekWirkus | 0:644f70b470b5 | 290 | if (brick_collision || brick_bottom_collision) |
PrzemekWirkus | 0:644f70b470b5 | 291 | { |
PrzemekWirkus | 0:644f70b470b5 | 292 | append_brick_to_matrix(); |
PrzemekWirkus | 0:644f70b470b5 | 293 | // Create new brick |
PrzemekWirkus | 0:644f70b470b5 | 294 | brick.brick_next(); |
PrzemekWirkus | 0:644f70b470b5 | 295 | g_brick_pos_x = (LCD_W - BRICK_SIZE_X) / 2; |
PrzemekWirkus | 0:644f70b470b5 | 296 | g_brick_pos_y = 0; |
PrzemekWirkus | 0:644f70b470b5 | 297 | return false; |
PrzemekWirkus | 0:644f70b470b5 | 298 | } |
PrzemekWirkus | 0:644f70b470b5 | 299 | g_brick_pos_y++; |
PrzemekWirkus | 0:644f70b470b5 | 300 | return true; |
PrzemekWirkus | 0:644f70b470b5 | 301 | } |
PrzemekWirkus | 0:644f70b470b5 | 302 | |
PrzemekWirkus | 0:644f70b470b5 | 303 | template <class T> |
PrzemekWirkus | 0:644f70b470b5 | 304 | bool MBEDtrisTheGame<T>::try_rotate() |
PrzemekWirkus | 0:644f70b470b5 | 305 | { |
PrzemekWirkus | 0:644f70b470b5 | 306 | brick.rotate_next(); |
PrzemekWirkus | 0:644f70b470b5 | 307 | bool brick_collision = detect_brick_collision(0, 1); |
PrzemekWirkus | 0:644f70b470b5 | 308 | bool brick_bottom_collision = detect_brick_bottom_collision(0, 1); |
PrzemekWirkus | 0:644f70b470b5 | 309 | bool brick_side_collision = detect_brick_side_collision(0, 0); |
PrzemekWirkus | 0:644f70b470b5 | 310 | |
PrzemekWirkus | 0:644f70b470b5 | 311 | if (brick_collision || brick_bottom_collision || brick_side_collision) |
PrzemekWirkus | 0:644f70b470b5 | 312 | { |
PrzemekWirkus | 0:644f70b470b5 | 313 | brick.rotate_prev(); |
PrzemekWirkus | 0:644f70b470b5 | 314 | return false; |
PrzemekWirkus | 0:644f70b470b5 | 315 | } |
PrzemekWirkus | 0:644f70b470b5 | 316 | return true; |
PrzemekWirkus | 0:644f70b470b5 | 317 | } |
PrzemekWirkus | 0:644f70b470b5 | 318 | |
PrzemekWirkus | 0:644f70b470b5 | 319 | #endif |