92f7925256891c6a5ceb984ba2ac403b89b008fe
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 move time call logic to gam...

Stefan Schuermans authored 5 years ago

22) #include "Time.h"
23) #include "TimeCallee.h"
Stefan Schuermans pong: configurable speed

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 5 years ago

25) 
26) namespace Blinker {
27) 
28) /// base class for games
Stefan Schuermans move time call logic to gam...

Stefan Schuermans authored 5 years ago

29) class Game: public Module, public TimeCallee
Stefan Schuermans base class for games

Stefan Schuermans authored 5 years ago

30) {
31) protected:
32)   /// raw color data matching image buffer
33)   typedef std::vector<unsigned char> ColorData;
34) 
Stefan Schuermans pong: configurable speed

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 5 years ago

67) 
Stefan Schuermans move time call logic to gam...

Stefan Schuermans authored 5 years ago

68)   /// callback when requested time reached
69)   virtual void timeCall();
70) 
Stefan Schuermans base class for games

Stefan Schuermans authored 5 years ago

71) protected:
72)   /// re-initialize game (e.g. due to config change)
73)   virtual void reinitialize() = 0;
74) 
75)   /// redraw current game image, expected to call sendFrame() at end
76)   virtual void redraw() = 0;
77) 
Stefan Schuermans move time call logic to gam...

Stefan Schuermans authored 5 years ago

78)   /// process next time step of game
79)   virtual void timeStep() = 0;
80) 
Stefan Schuermans base class for games

Stefan Schuermans authored 5 years ago

81)   /// activate game: set up image buffer, call redraw()
82)   void activate();
83) 
84)   /// deactivate game: tear down image buffer, deactivate output
85)   void deactivate();
86) 
Stefan Schuermans pong: activate when player...

Stefan Schuermans authored 5 years ago

87)   /// check if game is active
88)   bool isActive() const;
89) 
Stefan Schuermans base class for games

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 5 years ago

169) 
Stefan Schuermans pong: configurable speed

Stefan Schuermans authored 5 years ago

170)   /// process update of value file, return true on update
171)   static bool valueUpdate(UIntFile &valueFile, ValueDescr const &descr,
172)                           unsigned int &value);
173) 
174)   /// get value from value file
175)   static void valueFromFile(UIntFile &valueFile, ValueDescr const &descr,
176)                             unsigned int &value);
177) 
Stefan Schuermans base class for games

Stefan Schuermans authored 5 years ago

178)   /// send current image buffer as frame to output stream
179)   void sendFrame();
180) 
Stefan Schuermans move time call logic to gam...

Stefan Schuermans authored 5 years ago

181)   /// set next game time step - plan timed action of game
182)   void setTimeStep(const Time& timeStepTime);
183) 
184)   /// unset game time step - do timed action for game
185)   void unsetTimeStep();
186) 
Stefan Schuermans base class for games

Stefan Schuermans authored 5 years ago

187) private:
188)   /// (re-)create image buffer
189)   void createImgBuf();
190) 
191)   /// tear down image buffer
192)   void destroyImgBuf();
193) 
Stefan Schuermans move time call logic to gam...

Stefan Schuermans authored 5 years ago

194)   /// request next time call - or cancel request if not needed
195)   void planTimeCall();
196) 
Stefan Schuermans base class for games

Stefan Schuermans authored 5 years ago

197) protected:
198)   FormatFile    m_fileFormat;          ///< format file for output
199)   ColorFile     m_fileBackgroundColor; ///< color file for background color
200)   OutStreamFile m_fileOutStream;       ///< output stream name file
201)   int           m_height;              ///< height of image buffer
202)   int           m_width;               ///< width of image buffer
203)   int           m_channels;            ///< number of channels of image buffer
204)   ColorData     m_imgBuf;              ///< image buffer (empty if none)
205)   ColorData     m_backgroundColor;     ///< background color
Stefan Schuermans move time call logic to gam...

Stefan Schuermans authored 5 years ago

206) 
207) private:
208)   bool m_haveTimeStep; ///< if a time step is pending
209)   Time m_timeStepTime; ///< time of next time step