Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Fork of el17ajf by
Graphics/Graphics.cpp@28:e09b7ac11dea, 2019-04-12 (annotated)
- Committer:
- el17ajf
- Date:
- Fri Apr 12 20:53:00 2019 +0000
- Revision:
- 28:e09b7ac11dea
- Parent:
- 26:baa7077449e7
- Child:
- 29:d59fbe128d1f
added screen shake
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
el17ajf | 5:3efbdcb3efaf | 1 | #include "Graphics.h" |
el17ajf | 17:cc448ab7266f | 2 | #include "Grid.h" |
el17ajf | 5:3efbdcb3efaf | 3 | |
el17ajf | 14:53d2167d7c9a | 4 | namespace Graphics { |
el17ajf | 14:53d2167d7c9a | 5 | |
el17ajf | 28:e09b7ac11dea | 6 | // "private" methods |
el17ajf | 28:e09b7ac11dea | 7 | void drawPoint(int x, int y); |
el17ajf | 28:e09b7ac11dea | 8 | void drawLine(int x1, int y1, int x2, int y2); |
el17ajf | 28:e09b7ac11dea | 9 | void drawBox(int x1, int y1, int x2, int y2); |
el17ajf | 28:e09b7ac11dea | 10 | void drawDottedLine(int x1, int y1, int x2, int y2); |
el17ajf | 28:e09b7ac11dea | 11 | bool lightOn; |
el17ajf | 28:e09b7ac11dea | 12 | |
el17ajf | 28:e09b7ac11dea | 13 | int shake_frames; |
el17ajf | 28:e09b7ac11dea | 14 | int offsetX = 0, offsetY = 0; |
el17ajf | 28:e09b7ac11dea | 15 | |
el17ajf | 17:cc448ab7266f | 16 | namespace LCD { |
el17ajf | 17:cc448ab7266f | 17 | const int MAX_Y = 47; |
el17ajf | 17:cc448ab7266f | 18 | |
el17ajf | 17:cc448ab7266f | 19 | N5110 * lcd; |
el17ajf | 17:cc448ab7266f | 20 | |
el17ajf | 17:cc448ab7266f | 21 | int YToLcdX(int y) { |
el17ajf | 28:e09b7ac11dea | 22 | return y + offsetX; |
el17ajf | 17:cc448ab7266f | 23 | } |
el17ajf | 17:cc448ab7266f | 24 | |
el17ajf | 17:cc448ab7266f | 25 | int XToLcdY(int x) { |
el17ajf | 28:e09b7ac11dea | 26 | return MAX_Y - x + offsetY; |
el17ajf | 17:cc448ab7266f | 27 | } |
el17ajf | 17:cc448ab7266f | 28 | }; |
el17ajf | 14:53d2167d7c9a | 29 | |
el17ajf | 14:53d2167d7c9a | 30 | void init() { |
el17ajf | 17:cc448ab7266f | 31 | LCD::lcd = new N5110(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11); |
el17ajf | 17:cc448ab7266f | 32 | LCD::lcd->init(); |
el17ajf | 17:cc448ab7266f | 33 | LCD::lcd->setContrast(0.5); |
el17ajf | 17:cc448ab7266f | 34 | LCD::lcd->setBrightness(0); |
el17ajf | 26:baa7077449e7 | 35 | lightOn = false; |
el17ajf | 14:53d2167d7c9a | 36 | } |
el17ajf | 14:53d2167d7c9a | 37 | |
el17ajf | 14:53d2167d7c9a | 38 | void deinit() { |
el17ajf | 17:cc448ab7266f | 39 | delete LCD::lcd; |
el17ajf | 14:53d2167d7c9a | 40 | } |
el17ajf | 14:53d2167d7c9a | 41 | |
el17ajf | 14:53d2167d7c9a | 42 | void clear() { |
el17ajf | 17:cc448ab7266f | 43 | LCD::lcd->clear(); |
el17ajf | 14:53d2167d7c9a | 44 | } |
el17ajf | 14:53d2167d7c9a | 45 | |
el17ajf | 14:53d2167d7c9a | 46 | void render() { |
el17ajf | 28:e09b7ac11dea | 47 | if (shake_frames > 0) { |
el17ajf | 28:e09b7ac11dea | 48 | offsetX = (rand() % 8) - 4; |
el17ajf | 28:e09b7ac11dea | 49 | offsetY = (rand() % 8) - 4; |
el17ajf | 28:e09b7ac11dea | 50 | } else { |
el17ajf | 28:e09b7ac11dea | 51 | offsetX = 0; |
el17ajf | 28:e09b7ac11dea | 52 | offsetY = 0; |
el17ajf | 28:e09b7ac11dea | 53 | } |
el17ajf | 28:e09b7ac11dea | 54 | shake_frames = shake_frames > 0 ? shake_frames - 1 : shake_frames; |
el17ajf | 17:cc448ab7266f | 55 | LCD::lcd->refresh(); |
el17ajf | 14:53d2167d7c9a | 56 | } |
el17ajf | 14:53d2167d7c9a | 57 | |
el17ajf | 26:baa7077449e7 | 58 | void toggleLight() { |
el17ajf | 26:baa7077449e7 | 59 | lightOn = !lightOn; |
el17ajf | 26:baa7077449e7 | 60 | LCD::lcd->setBrightness(lightOn ? 1 : 0); |
el17ajf | 26:baa7077449e7 | 61 | } |
el17ajf | 26:baa7077449e7 | 62 | |
el17ajf | 14:53d2167d7c9a | 63 | void drawPoint(int x, int y) { |
el17ajf | 17:cc448ab7266f | 64 | LCD::lcd->setPixel( |
el17ajf | 17:cc448ab7266f | 65 | LCD::YToLcdX(y), |
el17ajf | 17:cc448ab7266f | 66 | LCD::XToLcdY(x), |
el17ajf | 17:cc448ab7266f | 67 | true |
el17ajf | 17:cc448ab7266f | 68 | ); |
el17ajf | 14:53d2167d7c9a | 69 | } |
el17ajf | 14:53d2167d7c9a | 70 | |
el17ajf | 14:53d2167d7c9a | 71 | void drawLine(int x1, int y1, int x2, int y2) { |
el17ajf | 17:cc448ab7266f | 72 | LCD::lcd->drawLine( |
el17ajf | 17:cc448ab7266f | 73 | LCD::YToLcdX(y1), |
el17ajf | 17:cc448ab7266f | 74 | LCD::XToLcdY(x1), |
el17ajf | 17:cc448ab7266f | 75 | LCD::YToLcdX(y2), |
el17ajf | 17:cc448ab7266f | 76 | LCD::XToLcdY(x2), |
el17ajf | 17:cc448ab7266f | 77 | 1 // not dotted |
el17ajf | 17:cc448ab7266f | 78 | ); |
el17ajf | 14:53d2167d7c9a | 79 | } |
el17ajf | 5:3efbdcb3efaf | 80 | |
el17ajf | 14:53d2167d7c9a | 81 | void drawDottedLine(int x1, int y1, int x2, int y2) { |
el17ajf | 17:cc448ab7266f | 82 | LCD::lcd->drawLine( |
el17ajf | 17:cc448ab7266f | 83 | LCD::YToLcdX(y1), |
el17ajf | 17:cc448ab7266f | 84 | LCD::XToLcdY(x1), |
el17ajf | 17:cc448ab7266f | 85 | LCD::YToLcdX(y2), |
el17ajf | 17:cc448ab7266f | 86 | LCD::XToLcdY(x2), |
el17ajf | 14:53d2167d7c9a | 87 | 2 // dotted |
el17ajf | 14:53d2167d7c9a | 88 | ); |
el17ajf | 14:53d2167d7c9a | 89 | } |
el17ajf | 14:53d2167d7c9a | 90 | |
el17ajf | 14:53d2167d7c9a | 91 | void drawBox(int x1, int y1, int x2, int y2) { |
el17ajf | 14:53d2167d7c9a | 92 | drawLine(x1, y1, x2, y1); |
el17ajf | 14:53d2167d7c9a | 93 | drawLine(x2, y1, x2, y2); |
el17ajf | 14:53d2167d7c9a | 94 | drawLine(x2, y2, x1, y2); |
el17ajf | 14:53d2167d7c9a | 95 | drawLine(x1, y2, x1, y1); |
el17ajf | 14:53d2167d7c9a | 96 | } |
el17ajf | 8:5066ce13a430 | 97 | |
el17ajf | 17:cc448ab7266f | 98 | namespace Game { |
el17ajf | 17:cc448ab7266f | 99 | int getBlockSize() { |
el17ajf | 17:cc448ab7266f | 100 | int blockWidth = SCREEN_WIDTH / Grid::GRID_WIDTH; |
el17ajf | 17:cc448ab7266f | 101 | int blockHeight = SCREEN_HEIGHT / Grid::GRID_HEIGHT; |
el17ajf | 17:cc448ab7266f | 102 | return blockWidth < blockHeight ? blockWidth : blockHeight; |
el17ajf | 17:cc448ab7266f | 103 | } |
el17ajf | 17:cc448ab7266f | 104 | |
el17ajf | 17:cc448ab7266f | 105 | int getBorderSizeX(int blockSize) { |
el17ajf | 18:24ce897024d0 | 106 | return (SCREEN_WIDTH - Grid::GRID_WIDTH * blockSize) / 2; |
el17ajf | 17:cc448ab7266f | 107 | } |
el17ajf | 17:cc448ab7266f | 108 | |
el17ajf | 17:cc448ab7266f | 109 | int getBorderSizeY(int blockSize) { |
el17ajf | 18:24ce897024d0 | 110 | return (SCREEN_HEIGHT - Grid::GRID_HEIGHT * blockSize) / 2; |
el17ajf | 17:cc448ab7266f | 111 | } |
el17ajf | 17:cc448ab7266f | 112 | |
el17ajf | 17:cc448ab7266f | 113 | int BLOCK_SIZE = getBlockSize(); |
el17ajf | 17:cc448ab7266f | 114 | int BORDER_SIZE_X = getBorderSizeX(BLOCK_SIZE); |
el17ajf | 17:cc448ab7266f | 115 | int BORDER_SIZE_Y = getBorderSizeY(BLOCK_SIZE); |
el17ajf | 17:cc448ab7266f | 116 | |
el17ajf | 17:cc448ab7266f | 117 | int gridYToY(int grid_y) { |
el17ajf | 17:cc448ab7266f | 118 | return grid_y * BLOCK_SIZE + BORDER_SIZE_Y; |
el17ajf | 17:cc448ab7266f | 119 | } |
el17ajf | 17:cc448ab7266f | 120 | |
el17ajf | 17:cc448ab7266f | 121 | int gridXToX(int grid_x) { |
el17ajf | 17:cc448ab7266f | 122 | return grid_x * BLOCK_SIZE + BORDER_SIZE_X; |
el17ajf | 17:cc448ab7266f | 123 | } |
el17ajf | 17:cc448ab7266f | 124 | |
el17ajf | 17:cc448ab7266f | 125 | void drawBlock(int grid_x, int grid_y) { |
el17ajf | 17:cc448ab7266f | 126 | // screen coords |
el17ajf | 17:cc448ab7266f | 127 | int x = gridXToX(grid_x); |
el17ajf | 17:cc448ab7266f | 128 | int y = gridYToY(grid_y); |
el17ajf | 17:cc448ab7266f | 129 | drawBox(x, y, x + BLOCK_SIZE - 1, y + BLOCK_SIZE - 1); |
el17ajf | 25:bf47fe41883a | 130 | } |
el17ajf | 25:bf47fe41883a | 131 | |
el17ajf | 25:bf47fe41883a | 132 | void drawStripedBlock(int grid_x, int grid_y) { |
el17ajf | 25:bf47fe41883a | 133 | // screen coords |
el17ajf | 25:bf47fe41883a | 134 | int x = gridXToX(grid_x); |
el17ajf | 25:bf47fe41883a | 135 | int y = gridYToY(grid_y); |
el17ajf | 25:bf47fe41883a | 136 | drawBox(x, y, x + BLOCK_SIZE - 1, y + BLOCK_SIZE - 1); |
el17ajf | 25:bf47fe41883a | 137 | drawLine(x, y, x + BLOCK_SIZE - 1, y + BLOCK_SIZE - 1); |
el17ajf | 17:cc448ab7266f | 138 | } |
el17ajf | 17:cc448ab7266f | 139 | |
el17ajf | 17:cc448ab7266f | 140 | void drawBorder() { |
el17ajf | 22:0a474f074553 | 141 | int minX = gridXToX(0) - 1; |
el17ajf | 22:0a474f074553 | 142 | int maxX = gridXToX(Grid::GRID_WIDTH - 1) + BLOCK_SIZE - 1 + 1; |
el17ajf | 22:0a474f074553 | 143 | int minY = gridYToY(0) - 1; |
el17ajf | 22:0a474f074553 | 144 | int maxY = gridYToY(Grid::GRID_HEIGHT - 1) + BLOCK_SIZE - 1 + 1; |
el17ajf | 17:cc448ab7266f | 145 | |
el17ajf | 17:cc448ab7266f | 146 | drawDottedLine(minX, minY, minX, maxY); |
el17ajf | 17:cc448ab7266f | 147 | drawDottedLine(minX, maxY, maxX, maxY); |
el17ajf | 17:cc448ab7266f | 148 | drawDottedLine(maxX, maxY, maxX, minY); |
el17ajf | 17:cc448ab7266f | 149 | } |
el17ajf | 28:e09b7ac11dea | 150 | |
el17ajf | 28:e09b7ac11dea | 151 | void shake(int frames) { |
el17ajf | 28:e09b7ac11dea | 152 | if (frames > shake_frames) { |
el17ajf | 28:e09b7ac11dea | 153 | shake_frames = frames; |
el17ajf | 28:e09b7ac11dea | 154 | } |
el17ajf | 28:e09b7ac11dea | 155 | } |
el17ajf | 17:cc448ab7266f | 156 | }; |
el17ajf | 17:cc448ab7266f | 157 | |
el17ajf | 17:cc448ab7266f | 158 | namespace UI { |
el17ajf | 17:cc448ab7266f | 159 | void drawBorder(int x1, int y1, int x2, int y2) { |
el17ajf | 17:cc448ab7266f | 160 | drawBox(x1, y1, x2, y2); |
el17ajf | 17:cc448ab7266f | 161 | } |
el17ajf | 16:3f84f2d7b910 | 162 | |
el17ajf | 17:cc448ab7266f | 163 | void drawChar(int x, int y, char c); |
el17ajf | 17:cc448ab7266f | 164 | |
el17ajf | 17:cc448ab7266f | 165 | void drawText(int x, int y, const char * text) { |
el17ajf | 17:cc448ab7266f | 166 | for (int i = 0; text[i] != '\0'; i++) { |
el17ajf | 17:cc448ab7266f | 167 | drawChar(x + i * (CHAR_WIDTH + CHAR_SPACE), y, text[i]); |
el17ajf | 17:cc448ab7266f | 168 | } |
el17ajf | 17:cc448ab7266f | 169 | } |
el17ajf | 14:53d2167d7c9a | 170 | |
el17ajf | 17:cc448ab7266f | 171 | void drawChar(int x, int y, char c) { |
el17ajf | 17:cc448ab7266f | 172 | int binc = 0b1111111111111111111111111111; |
el17ajf | 17:cc448ab7266f | 173 | |
el17ajf | 17:cc448ab7266f | 174 | switch (c) { |
el17ajf | 17:cc448ab7266f | 175 | case 'a': case 'A': binc = 0b0000011010011001011100000000; break; |
el17ajf | 17:cc448ab7266f | 176 | case 'b': case 'B': binc = 0b1000111010011001111100000000; break; |
el17ajf | 17:cc448ab7266f | 177 | case 'c': case 'C': binc = 0b0000011110001000111100000000; break; |
el17ajf | 17:cc448ab7266f | 178 | case 'd': case 'D': binc = 0b0001011110011001111100000000; break; |
el17ajf | 17:cc448ab7266f | 179 | case 'e': case 'E': binc = 0b0000111110011000011000000000; break; |
el17ajf | 17:cc448ab7266f | 180 | case 'f': case 'F': binc = 0b0000001101000100011101000000; break; |
el17ajf | 17:cc448ab7266f | 181 | case 'g': case 'G': binc = 0b0000011110011001111100010110; break; |
el17ajf | 17:cc448ab7266f | 182 | case 'h': case 'H': binc = 0b1000111010011001100100000000; break; |
el17ajf | 17:cc448ab7266f | 183 | case 'i': case 'I': binc = 0b0100000001000100001000000000; break; |
el17ajf | 17:cc448ab7266f | 184 | case 'j': case 'J': binc = 0b0010000000100010001001000000; break; |
el17ajf | 17:cc448ab7266f | 185 | case 'k': case 'K': binc = 0b1000101011001010101000000000; break; |
el17ajf | 17:cc448ab7266f | 186 | case 'l': case 'L': binc = 0b0100010001000100001000000000; break; |
el17ajf | 17:cc448ab7266f | 187 | case 'm': case 'M': binc = 0b0000111110111001100100000000; break; |
el17ajf | 17:cc448ab7266f | 188 | case 'n': case 'N': binc = 0b0000111010011001100100000000; break; |
el17ajf | 17:cc448ab7266f | 189 | case 'o': case 'O': binc = 0b0000111110011001111100000000; break; |
el17ajf | 17:cc448ab7266f | 190 | case 'p': case 'P': binc = 0b0000111010011001111110000000; break; |
el17ajf | 17:cc448ab7266f | 191 | case 'q': case 'Q': binc = 0b0000011110011001111100010001; break; |
el17ajf | 17:cc448ab7266f | 192 | case 'r': case 'R': binc = 0b0000001001000100010000000000; break; |
el17ajf | 17:cc448ab7266f | 193 | case 's': case 'S': binc = 0b0000011111000011111000000000; break; |
el17ajf | 17:cc448ab7266f | 194 | case 't': case 'T': binc = 0b0100111001000100001000000000; break; |
el17ajf | 17:cc448ab7266f | 195 | case 'u': case 'U': binc = 0b0000100110011001011100000000; break; |
el17ajf | 17:cc448ab7266f | 196 | case 'v': case 'V': binc = 0b0000100110011001011000000000; break; |
el17ajf | 17:cc448ab7266f | 197 | case 'w': case 'W': binc = 0b0000100110011011111100000000; break; |
el17ajf | 17:cc448ab7266f | 198 | case 'x': case 'X': binc = 0b0000100101000010100100000000; break; |
el17ajf | 17:cc448ab7266f | 199 | case 'y': case 'Y': binc = 0b0000100110011001011100010110; break; |
el17ajf | 17:cc448ab7266f | 200 | case 'z': case 'Z': binc = 0b0000111000111100011100000000; break; |
el17ajf | 19:370d83a8dc33 | 201 | case '0': binc = 0b0111100110011001111000000000; break; |
el17ajf | 19:370d83a8dc33 | 202 | case '1': binc = 0b0010011000100010011100000000; break; |
el17ajf | 19:370d83a8dc33 | 203 | case '2': binc = 0b1110000100100100111100000000; break; |
el17ajf | 19:370d83a8dc33 | 204 | case '3': binc = 0b1110000101100001111000000000; break; |
el17ajf | 20:cd96f98f5f79 | 205 | case '4': binc = 0b1001100101110001000100000000; break; |
el17ajf | 20:cd96f98f5f79 | 206 | case '5': binc = 0b1111100001100001111000000000; break; |
el17ajf | 19:370d83a8dc33 | 207 | case '6': binc = 0b0110100011101001011100000000; break; |
el17ajf | 20:cd96f98f5f79 | 208 | case '7': binc = 0b1111000100100010001000000000; break; |
el17ajf | 20:cd96f98f5f79 | 209 | case '8': binc = 0b0110100101101001011000000000; break; |
el17ajf | 19:370d83a8dc33 | 210 | case '9': binc = 0b0111100101110001000100000000; break; |
el17ajf | 19:370d83a8dc33 | 211 | case '-': binc = 0b0000000011110000000000000000; break; |
el17ajf | 20:cd96f98f5f79 | 212 | case '+': binc = 0b0000001001110010000000000000; break; |
el17ajf | 17:cc448ab7266f | 213 | case '!': binc = 0b0010001000100000001000000000; break; |
el17ajf | 20:cd96f98f5f79 | 214 | case '.': binc = 0b0000000000000000100000000000; break; |
el17ajf | 17:cc448ab7266f | 215 | case ' ': binc = 0b0000000000000000000000000000; break; |
el17ajf | 17:cc448ab7266f | 216 | default: break; |
el17ajf | 17:cc448ab7266f | 217 | } |
el17ajf | 17:cc448ab7266f | 218 | |
el17ajf | 17:cc448ab7266f | 219 | for (int n = 0; n <= 27; n++) { |
el17ajf | 17:cc448ab7266f | 220 | if (binc & 0b1000000000000000000000000000 >> n) { |
el17ajf | 17:cc448ab7266f | 221 | int dx = n % CHAR_WIDTH; |
el17ajf | 17:cc448ab7266f | 222 | int dy = n / CHAR_WIDTH; |
el17ajf | 17:cc448ab7266f | 223 | drawPoint(x + dx, y + dy); |
el17ajf | 17:cc448ab7266f | 224 | } |
el17ajf | 17:cc448ab7266f | 225 | } |
el17ajf | 17:cc448ab7266f | 226 | } |
el17ajf | 17:cc448ab7266f | 227 | }; |
el17ajf | 14:53d2167d7c9a | 228 | }; |