8c6f3b863a06de3973b3a9e585956a7001c68a43
Stefan Schuermans 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"
Stefan Schuermans pong: configurable speed

Stefan Schuermans authored 5 years ago

22) #include "UIntFile.h"
Stefan Schuermans base class for games

Stefan Schuermans authored 5 years ago

23) 
24) namespace Blinker {
25) 
26) /// base class for games
27) class Game: public Module
28) {
29) protected:
30)   /// raw color data matching image buffer
31)   typedef std::vector<unsigned char> ColorData;
32) 
Stefan Schuermans pong: configurable speed

Stefan Schuermans authored 5 years ago

33)   /// descriptor of value (e.g. a setting for the game)
34)   struct ValueDescr {
35)     unsigned int default_;
36)     unsigned int minimum;
37)     unsigned int maximum;
38)   };
39) 
Stefan Schuermans base class for games

Stefan Schuermans authored 5 years ago

40) public:
41)   /**
42)    * @brief constructor
43)    * @param[in] name module name
44)    * @param[in] mgrs managers
45)    * @param[in] dirBase base directory
46)    */
47)   Game(const std::string &name, Mgrs &mgrs, const Directory &dirBase);
48) 
49)   /// virtual destructor
50)   virtual ~Game();
51) 
52) private:
53)   /// copy constructor disabled
54)   Game(const Game &that);
55) 
56)   /// assignment operator disabled
57)   const Game & operator=(const Game &that);
58) 
59) public:
60)   /// check for update of configuration
Stefan Schuermans begin of Pong game

Stefan Schuermans authored 5 years ago

61)   virtual void updateConfig() final;
62) 
63)   /// check for update of configuration (derived game), return true on update
64)   virtual bool updateConfigGame() = 0;
Stefan Schuermans base class for games

Stefan Schuermans authored 5 years ago

65) 
66) protected:
67)   /// re-initialize game (e.g. due to config change)
68)   virtual void reinitialize() = 0;
69) 
70)   /// redraw current game image, expected to call sendFrame() at end
71)   virtual void redraw() = 0;
72) 
73)   /// activate game: set up image buffer, call redraw()
74)   void activate();
75) 
76)   /// deactivate game: tear down image buffer, deactivate output
77)   void deactivate();
78) 
Stefan Schuermans pong: activate when player...

Stefan Schuermans authored 5 years ago

79)   /// check if game is active
80)   bool isActive() const;
81) 
Stefan Schuermans base class for games

Stefan Schuermans authored 5 years ago

82)   /// check if integer is between minimum and maximum values
83)   static bool checkLimitInt(int i, int min, int max)
84)   {
85)     return i >= min && i <= max;
86)   }
87) 
88)   /// limit integer to minimum and maximum values
89)   static void limitInt(int &i, int min, int max)
90)   {
91)     if (i < min) {
92)       i = min;
93)     }
94)     if (i > max) {
95)       i = max;
96)     }
97)   }
98) 
99)   /// check if range of two integers is nonEmpty and limit the integers
100)   static bool checkIntRangeLimit(int &i1, int &i2, int min, int max)
101)   {
102)     if (i1 > i2) {
103)       return false;
104)     }
105)     limitInt(i1, min, max);
106)     limitInt(i2, min, max);
107)     return true;
108)   }
109) 
110)   /// set pixel in image buffer
111)   void pixel(int y, int x, ColorData const &cd);
112) 
113)   /// draw horizontal line to image buffer
114)   void lineHor(int y, int x1, int x2, ColorData const &cd);
115) 
116)   /// draw vertical line to image buffer
117)   void lineVert(int y1, int y2, int x, ColorData const &cd);
118) 
119)   /// draw non-filled rectangle to image buffer
120)   void rect(int y1, int y2, int x1, int x2, ColorData const &cd);
121) 
122)   /// draw filled rectangle to image buffer
123)   void rectFill(int y1, int y2, int x1, int x2, ColorData const &cd);
124) 
Stefan Schuermans pong: display score

Stefan Schuermans authored 5 years ago

125)   /**
126)    * @brief draw a small digit (3x5 pixels) to image buffer
127)    * @param[in] topY y coordinate of top of digit
128)    * @param[in] leftX x coordinate of left of digit
129)    * @param[in] digit to draw ('0'..'9')
130)    * @param[in] cd color to use for drawing
131)    */
132)   void digit3x5(int topY, int leftX, char digit, ColorData const &cd);
133) 
134)   /**
135)    * @brief draw small digits (3x5 each, 1 pixel gap) to image buffer
136)    * @param[in] topY y coordinate of top of digits
137)    * @param[in] leftX x coordinate of left of digits
138)    * @param[in] digits to draw (string of '0'..'9')
139)    * @param[in] cd color to use for drawing
140)    */
141)   void digits3x5(int topY, int leftX, std::string const &digits,
142)                  ColorData const &cd);
143) 
144)   /**
145)    * @brief draw number using 3x5 digits to image buffer
146)    * @param[in] anchorY y coordinate of anchor point
147)    * @param[in] anchorX x coordinate of anchor point
148)    * @param[in] alignY y alignment, -1 for top, 0 for center, 1 for bottom
149)    * @param[in] alignX x alignment, -1 for left, 0 for center, 1 for right
150)    * @param[in] number non-negative number to draw
151)    * @param[in] cd color to use for drawing
152)    */
153)   void number3x5(int anchorY, int anchorX, int alignY, int alignX,
154)                  int number, ColorData const &cd);
155) 
Stefan Schuermans begin of Pong game

Stefan Schuermans authored 5 years ago

156)   /// process update of color file, return true on update
157)   bool colorUpdate(ColorFile &colorFile, ColorData &data) const;
158) 
Stefan Schuermans base class for games

Stefan Schuermans authored 5 years ago

159)   /// convert color to raw color data
Stefan Schuermans begin of Pong game

Stefan Schuermans authored 5 years ago

160)   void color2data(ColorFile const &colorFile, ColorData &data) const;
Stefan Schuermans base class for games

Stefan Schuermans authored 5 years ago

161) 
Stefan Schuermans pong: configurable speed

Stefan Schuermans authored 5 years ago

162)   /// process update of value file, return true on update
163)   static bool valueUpdate(UIntFile &valueFile, ValueDescr const &descr,
164)                           unsigned int &value);
165) 
166)   /// get value from value file
167)   static void valueFromFile(UIntFile &valueFile, ValueDescr const &descr,
168)                             unsigned int &value);
169)