ELEC2645 (2018/19) / Mbed 2 deprecated el17ajf

Dependencies:   mbed

Fork of el17ajf by Angus Findlay

Committer:
el17ajf
Date:
Sat Apr 13 10:05:10 2019 +0000
Revision:
33:0a5bc157bbf8
Parent:
31:69fedaa9b171
fixed border bug

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 29:d59fbe128d1f 3 #include "Math.h"
el17ajf 5:3efbdcb3efaf 4
el17ajf 14:53d2167d7c9a 5 namespace Graphics {
el17ajf 14:53d2167d7c9a 6
el17ajf 28:e09b7ac11dea 7 // "private" methods
el17ajf 28:e09b7ac11dea 8 void drawPoint(int x, int y);
el17ajf 28:e09b7ac11dea 9 void drawLine(int x1, int y1, int x2, int y2);
el17ajf 28:e09b7ac11dea 10 void drawBox(int x1, int y1, int x2, int y2);
el17ajf 28:e09b7ac11dea 11 void drawDottedLine(int x1, int y1, int x2, int y2);
el17ajf 31:69fedaa9b171 12 bool light_on;
el17ajf 28:e09b7ac11dea 13
el17ajf 31:69fedaa9b171 14 int offset_x = 0, offset_y = 0;
el17ajf 28:e09b7ac11dea 15
el17ajf 17:cc448ab7266f 16 namespace LCD {
el17ajf 29:d59fbe128d1f 17 const int MAX_X = 83;
el17ajf 17:cc448ab7266f 18 const int MAX_Y = 47;
el17ajf 17:cc448ab7266f 19
el17ajf 17:cc448ab7266f 20 N5110 * lcd;
el17ajf 17:cc448ab7266f 21
el17ajf 17:cc448ab7266f 22 int YToLcdX(int y) {
el17ajf 31:69fedaa9b171 23 int lcd_x = y + offset_y;
el17ajf 29:d59fbe128d1f 24
el17ajf 31:69fedaa9b171 25 if (lcd_x < 0)
el17ajf 29:d59fbe128d1f 26 return 0;
el17ajf 31:69fedaa9b171 27 else if (lcd_x > MAX_X)
el17ajf 29:d59fbe128d1f 28 return MAX_X;
el17ajf 29:d59fbe128d1f 29 else
el17ajf 31:69fedaa9b171 30 return lcd_x;
el17ajf 17:cc448ab7266f 31 }
el17ajf 17:cc448ab7266f 32
el17ajf 17:cc448ab7266f 33 int XToLcdY(int x) {
el17ajf 31:69fedaa9b171 34 int lcd_y = MAX_Y - x + offset_x;
el17ajf 29:d59fbe128d1f 35
el17ajf 31:69fedaa9b171 36 if (lcd_y < 0)
el17ajf 29:d59fbe128d1f 37 return 0;
el17ajf 31:69fedaa9b171 38 else if (lcd_y > MAX_Y)
el17ajf 29:d59fbe128d1f 39 return MAX_Y;
el17ajf 29:d59fbe128d1f 40 else
el17ajf 31:69fedaa9b171 41 return lcd_y;
el17ajf 17:cc448ab7266f 42 }
el17ajf 17:cc448ab7266f 43 };
el17ajf 14:53d2167d7c9a 44
el17ajf 14:53d2167d7c9a 45 void init() {
el17ajf 17:cc448ab7266f 46 LCD::lcd = new N5110(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);
el17ajf 17:cc448ab7266f 47 LCD::lcd->init();
el17ajf 17:cc448ab7266f 48 LCD::lcd->setContrast(0.5);
el17ajf 17:cc448ab7266f 49 LCD::lcd->setBrightness(0);
el17ajf 31:69fedaa9b171 50 light_on = false;
el17ajf 14:53d2167d7c9a 51 }
el17ajf 14:53d2167d7c9a 52
el17ajf 14:53d2167d7c9a 53 void deinit() {
el17ajf 17:cc448ab7266f 54 delete LCD::lcd;
el17ajf 14:53d2167d7c9a 55 }
el17ajf 14:53d2167d7c9a 56
el17ajf 14:53d2167d7c9a 57 void clear() {
el17ajf 17:cc448ab7266f 58 LCD::lcd->clear();
el17ajf 14:53d2167d7c9a 59 }
el17ajf 14:53d2167d7c9a 60
el17ajf 14:53d2167d7c9a 61 void render() {
el17ajf 31:69fedaa9b171 62 offset_x = Math::lerp(offset_x, 0, 0.1);
el17ajf 31:69fedaa9b171 63 offset_y = Math::lerp(offset_y, 0, 0.1);
el17ajf 17:cc448ab7266f 64 LCD::lcd->refresh();
el17ajf 14:53d2167d7c9a 65 }
el17ajf 14:53d2167d7c9a 66
el17ajf 26:baa7077449e7 67 void toggleLight() {
el17ajf 31:69fedaa9b171 68 light_on = !light_on;
el17ajf 31:69fedaa9b171 69 LCD::lcd->setBrightness(light_on ? 1 : 0);
el17ajf 26:baa7077449e7 70 }
el17ajf 26:baa7077449e7 71
el17ajf 14:53d2167d7c9a 72 void drawPoint(int x, int y) {
el17ajf 17:cc448ab7266f 73 LCD::lcd->setPixel(
el17ajf 17:cc448ab7266f 74 LCD::YToLcdX(y),
el17ajf 17:cc448ab7266f 75 LCD::XToLcdY(x),
el17ajf 17:cc448ab7266f 76 true
el17ajf 17:cc448ab7266f 77 );
el17ajf 14:53d2167d7c9a 78 }
el17ajf 14:53d2167d7c9a 79
el17ajf 14:53d2167d7c9a 80 void drawLine(int x1, int y1, int x2, int y2) {
el17ajf 17:cc448ab7266f 81 LCD::lcd->drawLine(
el17ajf 17:cc448ab7266f 82 LCD::YToLcdX(y1),
el17ajf 17:cc448ab7266f 83 LCD::XToLcdY(x1),
el17ajf 17:cc448ab7266f 84 LCD::YToLcdX(y2),
el17ajf 17:cc448ab7266f 85 LCD::XToLcdY(x2),
el17ajf 17:cc448ab7266f 86 1 // not dotted
el17ajf 17:cc448ab7266f 87 );
el17ajf 14:53d2167d7c9a 88 }
el17ajf 5:3efbdcb3efaf 89
el17ajf 14:53d2167d7c9a 90 void drawDottedLine(int x1, int y1, int x2, int y2) {
el17ajf 17:cc448ab7266f 91 LCD::lcd->drawLine(
el17ajf 17:cc448ab7266f 92 LCD::YToLcdX(y1),
el17ajf 17:cc448ab7266f 93 LCD::XToLcdY(x1),
el17ajf 17:cc448ab7266f 94 LCD::YToLcdX(y2),
el17ajf 17:cc448ab7266f 95 LCD::XToLcdY(x2),
el17ajf 14:53d2167d7c9a 96 2 // dotted
el17ajf 14:53d2167d7c9a 97 );
el17ajf 14:53d2167d7c9a 98 }
el17ajf 14:53d2167d7c9a 99
el17ajf 14:53d2167d7c9a 100 void drawBox(int x1, int y1, int x2, int y2) {
el17ajf 14:53d2167d7c9a 101 drawLine(x1, y1, x2, y1);
el17ajf 14:53d2167d7c9a 102 drawLine(x2, y1, x2, y2);
el17ajf 14:53d2167d7c9a 103 drawLine(x2, y2, x1, y2);
el17ajf 14:53d2167d7c9a 104 drawLine(x1, y2, x1, y1);
el17ajf 14:53d2167d7c9a 105 }
el17ajf 8:5066ce13a430 106
el17ajf 17:cc448ab7266f 107 namespace Game {
el17ajf 17:cc448ab7266f 108 int getBlockSize() {
el17ajf 31:69fedaa9b171 109 int block_width = SCREEN_WIDTH / Grid::GRID_WIDTH;
el17ajf 31:69fedaa9b171 110 int block_height = SCREEN_HEIGHT / (Grid::GRID_HEIGHT - Grid::HIDDEN_HEIGHT);
el17ajf 31:69fedaa9b171 111 return block_width < block_height ? block_width : block_height;
el17ajf 17:cc448ab7266f 112 }
el17ajf 17:cc448ab7266f 113
el17ajf 31:69fedaa9b171 114 int getBorderSizeX(int block_size) {
el17ajf 31:69fedaa9b171 115 return (SCREEN_WIDTH - Grid::GRID_WIDTH * block_size) / 2;
el17ajf 17:cc448ab7266f 116 }
el17ajf 17:cc448ab7266f 117
el17ajf 31:69fedaa9b171 118 int getBorderSizeY(int block_size) {
el17ajf 31:69fedaa9b171 119 return (SCREEN_HEIGHT - (Grid::GRID_HEIGHT - Grid::HIDDEN_HEIGHT) * block_size) / 2;
el17ajf 17:cc448ab7266f 120 }
el17ajf 17:cc448ab7266f 121
el17ajf 17:cc448ab7266f 122 int BLOCK_SIZE = getBlockSize();
el17ajf 17:cc448ab7266f 123 int BORDER_SIZE_X = getBorderSizeX(BLOCK_SIZE);
el17ajf 17:cc448ab7266f 124 int BORDER_SIZE_Y = getBorderSizeY(BLOCK_SIZE);
el17ajf 17:cc448ab7266f 125
el17ajf 17:cc448ab7266f 126 int gridYToY(int grid_y) {
el17ajf 29:d59fbe128d1f 127 return (grid_y - Grid::HIDDEN_HEIGHT) * BLOCK_SIZE + BORDER_SIZE_Y;
el17ajf 17:cc448ab7266f 128 }
el17ajf 17:cc448ab7266f 129
el17ajf 17:cc448ab7266f 130 int gridXToX(int grid_x) {
el17ajf 17:cc448ab7266f 131 return grid_x * BLOCK_SIZE + BORDER_SIZE_X;
el17ajf 17:cc448ab7266f 132 }
el17ajf 17:cc448ab7266f 133
el17ajf 17:cc448ab7266f 134 void drawBlock(int grid_x, int grid_y) {
el17ajf 17:cc448ab7266f 135 // screen coords
el17ajf 17:cc448ab7266f 136 int x = gridXToX(grid_x);
el17ajf 17:cc448ab7266f 137 int y = gridYToY(grid_y);
el17ajf 17:cc448ab7266f 138 drawBox(x, y, x + BLOCK_SIZE - 1, y + BLOCK_SIZE - 1);
el17ajf 25:bf47fe41883a 139 }
el17ajf 25:bf47fe41883a 140
el17ajf 25:bf47fe41883a 141 void drawStripedBlock(int grid_x, int grid_y) {
el17ajf 25:bf47fe41883a 142 // screen coords
el17ajf 25:bf47fe41883a 143 int x = gridXToX(grid_x);
el17ajf 25:bf47fe41883a 144 int y = gridYToY(grid_y);
el17ajf 25:bf47fe41883a 145 drawBox(x, y, x + BLOCK_SIZE - 1, y + BLOCK_SIZE - 1);
el17ajf 25:bf47fe41883a 146 drawLine(x, y, x + BLOCK_SIZE - 1, y + BLOCK_SIZE - 1);
el17ajf 17:cc448ab7266f 147 }
el17ajf 17:cc448ab7266f 148
el17ajf 17:cc448ab7266f 149 void drawBorder() {
el17ajf 31:69fedaa9b171 150 int min_x = gridXToX(0) - 1;
el17ajf 31:69fedaa9b171 151 int max_x = gridXToX(Grid::GRID_WIDTH - 1) + BLOCK_SIZE - 1 + 1;
el17ajf 31:69fedaa9b171 152 int min_y = gridYToY(0) - 1;
el17ajf 31:69fedaa9b171 153 int max_y = gridYToY(Grid::GRID_HEIGHT - 1) + BLOCK_SIZE - 1 + 1;
el17ajf 17:cc448ab7266f 154
el17ajf 33:0a5bc157bbf8 155 drawDottedLine(min_x, min_y, min_x, max_y);
el17ajf 33:0a5bc157bbf8 156 drawDottedLine(min_x, max_y, max_x, max_y);
el17ajf 31:69fedaa9b171 157 drawDottedLine(max_x, max_y, max_x, min_y);
el17ajf 17:cc448ab7266f 158 }
el17ajf 28:e09b7ac11dea 159
el17ajf 29:d59fbe128d1f 160 void shake(int dx, int dy) {
el17ajf 31:69fedaa9b171 161 offset_x += dx;
el17ajf 31:69fedaa9b171 162 offset_y += dy;
el17ajf 28:e09b7ac11dea 163 }
el17ajf 17:cc448ab7266f 164 };
el17ajf 17:cc448ab7266f 165
el17ajf 17:cc448ab7266f 166 namespace UI {
el17ajf 17:cc448ab7266f 167 void drawBorder(int x1, int y1, int x2, int y2) {
el17ajf 17:cc448ab7266f 168 drawBox(x1, y1, x2, y2);
el17ajf 17:cc448ab7266f 169 }
el17ajf 16:3f84f2d7b910 170
el17ajf 17:cc448ab7266f 171 void drawChar(int x, int y, char c);
el17ajf 17:cc448ab7266f 172
el17ajf 17:cc448ab7266f 173 void drawText(int x, int y, const char * text) {
el17ajf 17:cc448ab7266f 174 for (int i = 0; text[i] != '\0'; i++) {
el17ajf 17:cc448ab7266f 175 drawChar(x + i * (CHAR_WIDTH + CHAR_SPACE), y, text[i]);
el17ajf 17:cc448ab7266f 176 }
el17ajf 17:cc448ab7266f 177 }
el17ajf 14:53d2167d7c9a 178
el17ajf 30:11838cb6979f 179 void drawSprite(Bitmap * bitmap, int x, int y) {
el17ajf 30:11838cb6979f 180 (*bitmap).render(*LCD::lcd, x, y);
el17ajf 30:11838cb6979f 181 }
el17ajf 30:11838cb6979f 182
el17ajf 17:cc448ab7266f 183 void drawChar(int x, int y, char c) {
el17ajf 17:cc448ab7266f 184 int binc = 0b1111111111111111111111111111;
el17ajf 17:cc448ab7266f 185
el17ajf 17:cc448ab7266f 186 switch (c) {
el17ajf 17:cc448ab7266f 187 case 'a': case 'A': binc = 0b0000011010011001011100000000; break;
el17ajf 17:cc448ab7266f 188 case 'b': case 'B': binc = 0b1000111010011001111100000000; break;
el17ajf 17:cc448ab7266f 189 case 'c': case 'C': binc = 0b0000011110001000111100000000; break;
el17ajf 17:cc448ab7266f 190 case 'd': case 'D': binc = 0b0001011110011001111100000000; break;
el17ajf 17:cc448ab7266f 191 case 'e': case 'E': binc = 0b0000111110011000011000000000; break;
el17ajf 17:cc448ab7266f 192 case 'f': case 'F': binc = 0b0000001101000100011101000000; break;
el17ajf 17:cc448ab7266f 193 case 'g': case 'G': binc = 0b0000011110011001111100010110; break;
el17ajf 17:cc448ab7266f 194 case 'h': case 'H': binc = 0b1000111010011001100100000000; break;
el17ajf 17:cc448ab7266f 195 case 'i': case 'I': binc = 0b0100000001000100001000000000; break;
el17ajf 17:cc448ab7266f 196 case 'j': case 'J': binc = 0b0010000000100010001001000000; break;
el17ajf 17:cc448ab7266f 197 case 'k': case 'K': binc = 0b1000101011001010101000000000; break;
el17ajf 17:cc448ab7266f 198 case 'l': case 'L': binc = 0b0100010001000100001000000000; break;
el17ajf 17:cc448ab7266f 199 case 'm': case 'M': binc = 0b0000111110111001100100000000; break;
el17ajf 17:cc448ab7266f 200 case 'n': case 'N': binc = 0b0000111010011001100100000000; break;
el17ajf 17:cc448ab7266f 201 case 'o': case 'O': binc = 0b0000111110011001111100000000; break;
el17ajf 17:cc448ab7266f 202 case 'p': case 'P': binc = 0b0000111010011001111110000000; break;
el17ajf 17:cc448ab7266f 203 case 'q': case 'Q': binc = 0b0000011110011001111100010001; break;
el17ajf 17:cc448ab7266f 204 case 'r': case 'R': binc = 0b0000001001000100010000000000; break;
el17ajf 17:cc448ab7266f 205 case 's': case 'S': binc = 0b0000011111000011111000000000; break;
el17ajf 17:cc448ab7266f 206 case 't': case 'T': binc = 0b0100111001000100001000000000; break;
el17ajf 17:cc448ab7266f 207 case 'u': case 'U': binc = 0b0000100110011001011100000000; break;
el17ajf 17:cc448ab7266f 208 case 'v': case 'V': binc = 0b0000100110011001011000000000; break;
el17ajf 17:cc448ab7266f 209 case 'w': case 'W': binc = 0b0000100110011011111100000000; break;
el17ajf 17:cc448ab7266f 210 case 'x': case 'X': binc = 0b0000100101000010100100000000; break;
el17ajf 17:cc448ab7266f 211 case 'y': case 'Y': binc = 0b0000100110011001011100010110; break;
el17ajf 17:cc448ab7266f 212 case 'z': case 'Z': binc = 0b0000111000111100011100000000; break;
el17ajf 19:370d83a8dc33 213 case '0': binc = 0b0111100110011001111000000000; break;
el17ajf 19:370d83a8dc33 214 case '1': binc = 0b0010011000100010011100000000; break;
el17ajf 19:370d83a8dc33 215 case '2': binc = 0b1110000100100100111100000000; break;
el17ajf 19:370d83a8dc33 216 case '3': binc = 0b1110000101100001111000000000; break;
el17ajf 20:cd96f98f5f79 217 case '4': binc = 0b1001100101110001000100000000; break;
el17ajf 20:cd96f98f5f79 218 case '5': binc = 0b1111100001100001111000000000; break;
el17ajf 19:370d83a8dc33 219 case '6': binc = 0b0110100011101001011100000000; break;
el17ajf 20:cd96f98f5f79 220 case '7': binc = 0b1111000100100010001000000000; break;
el17ajf 20:cd96f98f5f79 221 case '8': binc = 0b0110100101101001011000000000; break;
el17ajf 19:370d83a8dc33 222 case '9': binc = 0b0111100101110001000100000000; break;
el17ajf 19:370d83a8dc33 223 case '-': binc = 0b0000000011110000000000000000; break;
el17ajf 20:cd96f98f5f79 224 case '+': binc = 0b0000001001110010000000000000; break;
el17ajf 17:cc448ab7266f 225 case '!': binc = 0b0010001000100000001000000000; break;
el17ajf 20:cd96f98f5f79 226 case '.': binc = 0b0000000000000000100000000000; break;
el17ajf 17:cc448ab7266f 227 case ' ': binc = 0b0000000000000000000000000000; break;
el17ajf 17:cc448ab7266f 228 default: break;
el17ajf 17:cc448ab7266f 229 }
el17ajf 17:cc448ab7266f 230
el17ajf 17:cc448ab7266f 231 for (int n = 0; n <= 27; n++) {
el17ajf 17:cc448ab7266f 232 if (binc & 0b1000000000000000000000000000 >> n) {
el17ajf 17:cc448ab7266f 233 int dx = n % CHAR_WIDTH;
el17ajf 17:cc448ab7266f 234 int dy = n / CHAR_WIDTH;
el17ajf 17:cc448ab7266f 235 drawPoint(x + dx, y + dy);
el17ajf 17:cc448ab7266f 236 }
el17ajf 17:cc448ab7266f 237 }
el17ajf 17:cc448ab7266f 238 }
el17ajf 17:cc448ab7266f 239 };
el17ajf 14:53d2167d7c9a 240 };