After decimating the enemy forces that have attacked your ship, you are charged with taking out as many of the remaining enemy fighters as possible. 3d space fighter game was initially written while I was testing some 3d routines I was implementing for a flight simulator, but my daughter started playing it and seemed to enjoy it so I added a few sound effects, explosions etc. and so this little game was born.
LCD_ST7735/Canvas.h@4:b857db213f10, 2015-02-08 (annotated)
- Committer:
- taylorza
- Date:
- Sun Feb 08 01:38:18 2015 +0000
- Revision:
- 4:b857db213f10
- Parent:
- 0:01829868570e
Removed duty lookup table
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
taylorza | 0:01829868570e | 1 | #ifndef __CANVAS_H__ |
taylorza | 0:01829868570e | 2 | #define __CANVAS_H__ |
taylorza | 0:01829868570e | 3 | |
taylorza | 0:01829868570e | 4 | template <typename T> |
taylorza | 0:01829868570e | 5 | class Canvas |
taylorza | 0:01829868570e | 6 | { |
taylorza | 0:01829868570e | 7 | public: |
taylorza | 0:01829868570e | 8 | Canvas(T *pSurface) |
taylorza | 0:01829868570e | 9 | { |
taylorza | 0:01829868570e | 10 | _pSurface = pSurface; |
taylorza | 0:01829868570e | 11 | } |
taylorza | 0:01829868570e | 12 | |
taylorza | 0:01829868570e | 13 | inline void clear() |
taylorza | 0:01829868570e | 14 | { |
taylorza | 0:01829868570e | 15 | _pSurface->clear(); |
taylorza | 0:01829868570e | 16 | } |
taylorza | 0:01829868570e | 17 | |
taylorza | 0:01829868570e | 18 | inline void setPixel(int x, int y, uint16_t color) |
taylorza | 0:01829868570e | 19 | { |
taylorza | 0:01829868570e | 20 | _pSurface->setPixel(x, y, color); |
taylorza | 0:01829868570e | 21 | } |
taylorza | 0:01829868570e | 22 | |
taylorza | 0:01829868570e | 23 | static inline void swap(int &a, int &b) |
taylorza | 0:01829868570e | 24 | { |
taylorza | 0:01829868570e | 25 | int t = a; |
taylorza | 0:01829868570e | 26 | a = b; |
taylorza | 0:01829868570e | 27 | b = t; |
taylorza | 0:01829868570e | 28 | } |
taylorza | 0:01829868570e | 29 | |
taylorza | 0:01829868570e | 30 | void drawLine(int x1, int y1, int x2, int y2, uint16_t color) |
taylorza | 0:01829868570e | 31 | { |
taylorza | 0:01829868570e | 32 | int dx = abs(x2 - x1); |
taylorza | 0:01829868570e | 33 | int dy = abs(y2 - y1); |
taylorza | 0:01829868570e | 34 | |
taylorza | 0:01829868570e | 35 | if (dx == 0) |
taylorza | 0:01829868570e | 36 | { |
taylorza | 0:01829868570e | 37 | if (y1 > y2) swap(y1, y2); |
taylorza | 0:01829868570e | 38 | drawVertLine(x1, y1, y2, color); |
taylorza | 0:01829868570e | 39 | return; |
taylorza | 0:01829868570e | 40 | } |
taylorza | 0:01829868570e | 41 | else if(dy == 0) |
taylorza | 0:01829868570e | 42 | { |
taylorza | 0:01829868570e | 43 | if (x1 > x2) swap(x1, x2); |
taylorza | 0:01829868570e | 44 | drawHorizLine(x1, y1, x2, color); |
taylorza | 0:01829868570e | 45 | return; |
taylorza | 0:01829868570e | 46 | } |
taylorza | 0:01829868570e | 47 | |
taylorza | 0:01829868570e | 48 | int sx = (x1 < x2) ? 1 : -1; |
taylorza | 0:01829868570e | 49 | int sy = (y1 < y2) ? 1 : -1; |
taylorza | 0:01829868570e | 50 | int err = dx - dy; |
taylorza | 0:01829868570e | 51 | while(x1 != x2 || y1 != y2) |
taylorza | 0:01829868570e | 52 | { |
taylorza | 0:01829868570e | 53 | setPixel(x1, y1, color); |
taylorza | 0:01829868570e | 54 | int e2 = err << 1; |
taylorza | 0:01829868570e | 55 | if (e2 > -dy) |
taylorza | 0:01829868570e | 56 | { |
taylorza | 0:01829868570e | 57 | err -= dy; |
taylorza | 0:01829868570e | 58 | x1 += sx; |
taylorza | 0:01829868570e | 59 | } |
taylorza | 0:01829868570e | 60 | if (e2 < dx) |
taylorza | 0:01829868570e | 61 | { |
taylorza | 0:01829868570e | 62 | err += dx; |
taylorza | 0:01829868570e | 63 | y1 += sy; |
taylorza | 0:01829868570e | 64 | } |
taylorza | 0:01829868570e | 65 | } |
taylorza | 0:01829868570e | 66 | setPixel(x2, y2, color); |
taylorza | 0:01829868570e | 67 | } |
taylorza | 0:01829868570e | 68 | |
taylorza | 0:01829868570e | 69 | void drawRect(int x1, int y1, int x2, int y2, uint16_t color) |
taylorza | 0:01829868570e | 70 | { |
taylorza | 0:01829868570e | 71 | if (x1 > x2) swap(x1, x2); |
taylorza | 0:01829868570e | 72 | if (y1 > y2) swap(y1, y2); |
taylorza | 0:01829868570e | 73 | |
taylorza | 0:01829868570e | 74 | drawHorizLine(x1, y1, x2, color); |
taylorza | 0:01829868570e | 75 | drawHorizLine(x1, y2, x2, color); |
taylorza | 0:01829868570e | 76 | drawVertLine(x1, y1, y2, color); |
taylorza | 0:01829868570e | 77 | drawVertLine(x2, y1, y2, color); |
taylorza | 0:01829868570e | 78 | } |
taylorza | 0:01829868570e | 79 | |
taylorza | 0:01829868570e | 80 | private: |
taylorza | 0:01829868570e | 81 | void drawHorizLine(int x1, int y1, int x2, uint16_t color) |
taylorza | 0:01829868570e | 82 | { |
taylorza | 0:01829868570e | 83 | for(int x = x1; x < x2; ++x) setPixel(x, y1, color); |
taylorza | 0:01829868570e | 84 | } |
taylorza | 0:01829868570e | 85 | |
taylorza | 0:01829868570e | 86 | void drawVertLine(int x1, int y1, int y2, uint16_t color) |
taylorza | 0:01829868570e | 87 | { |
taylorza | 0:01829868570e | 88 | for(int y = y1; y < y2; ++y) setPixel(x1, y, color); |
taylorza | 0:01829868570e | 89 | } |
taylorza | 0:01829868570e | 90 | |
taylorza | 0:01829868570e | 91 | private: |
taylorza | 0:01829868570e | 92 | T *_pSurface; |
taylorza | 0:01829868570e | 93 | }; |
taylorza | 0:01829868570e | 94 | |
taylorza | 0:01829868570e | 95 | #endif // __CANVAS_H__ |