base class for games
Stefan Schuermans authored 5 years ago
|
1) /* Blinker
2) Copyright 2011-2019 Stefan Schuermans <stefan@blinkenarea.org>
3) Copyleft GNU public license - http://www.gnu.org/copyleft/gpl.html
4) a blinkenarea.org project */
5)
6) #ifndef BLINKER_GAME_H
7) #define BLINKER_GAME_H
8)
9) #include <string>
10) #include <vector>
11)
12) #include <BlinkenLib/BlinkenFrame.h>
13)
14) #include "Color.h"
15) #include "ColorFile.h"
16) #include "File.h"
17) #include "Format.h"
18) #include "FormatFile.h"
19) #include "Mgrs.h"
20) #include "Module.h"
21) #include "OutStreamFile.h"
22)
23) namespace Blinker {
24)
25) /// base class for games
26) class Game: public Module
27) {
28) protected:
29) /// raw color data matching image buffer
30) typedef std::vector<unsigned char> ColorData;
31)
32) public:
33) /**
34) * @brief constructor
35) * @param[in] name module name
36) * @param[in] mgrs managers
37) * @param[in] dirBase base directory
38) */
39) Game(const std::string &name, Mgrs &mgrs, const Directory &dirBase);
40)
41) /// virtual destructor
42) virtual ~Game();
43)
44) private:
45) /// copy constructor disabled
46) Game(const Game &that);
47)
48) /// assignment operator disabled
49) const Game & operator=(const Game &that);
50)
51) public:
52) /// check for update of configuration
|
begin of Pong game
Stefan Schuermans authored 5 years ago
|
53) virtual void updateConfig() final;
54)
55) /// check for update of configuration (derived game), return true on update
56) virtual bool updateConfigGame() = 0;
|
base class for games
Stefan Schuermans authored 5 years ago
|
57)
58) protected:
59) /// re-initialize game (e.g. due to config change)
60) virtual void reinitialize() = 0;
61)
62) /// redraw current game image, expected to call sendFrame() at end
63) virtual void redraw() = 0;
64)
65) /// activate game: set up image buffer, call redraw()
66) void activate();
67)
68) /// deactivate game: tear down image buffer, deactivate output
69) void deactivate();
70)
|
pong: activate when player...
Stefan Schuermans authored 5 years ago
|
71) /// check if game is active
72) bool isActive() const;
73)
|
base class for games
Stefan Schuermans authored 5 years ago
|
74) /// check if integer is between minimum and maximum values
75) static bool checkLimitInt(int i, int min, int max)
76) {
77) return i >= min && i <= max;
78) }
79)
80) /// limit integer to minimum and maximum values
81) static void limitInt(int &i, int min, int max)
82) {
83) if (i < min) {
84) i = min;
85) }
86) if (i > max) {
87) i = max;
88) }
89) }
90)
91) /// check if range of two integers is nonEmpty and limit the integers
92) static bool checkIntRangeLimit(int &i1, int &i2, int min, int max)
93) {
94) if (i1 > i2) {
95) return false;
96) }
97) limitInt(i1, min, max);
98) limitInt(i2, min, max);
99) return true;
100) }
101)
102) /// set pixel in image buffer
103) void pixel(int y, int x, ColorData const &cd);
104)
105) /// draw horizontal line to image buffer
106) void lineHor(int y, int x1, int x2, ColorData const &cd);
107)
108) /// draw vertical line to image buffer
109) void lineVert(int y1, int y2, int x, ColorData const &cd);
110)
111) /// draw non-filled rectangle to image buffer
112) void rect(int y1, int y2, int x1, int x2, ColorData const &cd);
113)
114) /// draw filled rectangle to image buffer
115) void rectFill(int y1, int y2, int x1, int x2, ColorData const &cd);
116)
|
pong: display score
Stefan Schuermans authored 5 years ago
|
117) /**
118) * @brief draw a small digit (3x5 pixels) to image buffer
119) * @param[in] topY y coordinate of top of digit
120) * @param[in] leftX x coordinate of left of digit
121) * @param[in] digit to draw ('0'..'9')
122) * @param[in] cd color to use for drawing
123) */
124) void digit3x5(int topY, int leftX, char digit, ColorData const &cd);
125)
126) /**
127) * @brief draw small digits (3x5 each, 1 pixel gap) to image buffer
128) * @param[in] topY y coordinate of top of digits
129) * @param[in] leftX x coordinate of left of digits
130) * @param[in] digits to draw (string of '0'..'9')
131) * @param[in] cd color to use for drawing
132) */
133) void digits3x5(int topY, int leftX, std::string const &digits,
134) ColorData const &cd);
135)
136) /**
137) * @brief draw number using 3x5 digits to image buffer
138) * @param[in] anchorY y coordinate of anchor point
139) * @param[in] anchorX x coordinate of anchor point
140) * @param[in] alignY y alignment, -1 for top, 0 for center, 1 for bottom
141) * @param[in] alignX x alignment, -1 for left, 0 for center, 1 for right
142) * @param[in] number non-negative number to draw
143) * @param[in] cd color to use for drawing
144) */
145) void number3x5(int anchorY, int anchorX, int alignY, int alignX,
146) int number, ColorData const &cd);
147)
|
begin of Pong game
Stefan Schuermans authored 5 years ago
|
148) /// process update of color file, return true on update
149) bool colorUpdate(ColorFile &colorFile, ColorData &data) const;
150)
|
base class for games
Stefan Schuermans authored 5 years ago
|
151) /// convert color to raw color data
|
begin of Pong game
Stefan Schuermans authored 5 years ago
|
152) void color2data(ColorFile const &colorFile, ColorData &data) const;
|