ELEC2645 (2018/19) / Mbed 2 deprecated el17ajf

Dependencies:   mbed

Fork of el17ajf by Angus Findlay

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?

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