fb06c1c4fd5890e8d48b110fbcbe7b43adaf90c4
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) 
Stefan Schuermans add playing sounds to game...

Stefan Schuermans authored 5 years ago

9) #include <map>
Stefan Schuermans add op conn close requests

Stefan Schuermans authored 5 years ago

10) #include <set>
Stefan Schuermans base class for games

Stefan Schuermans authored 5 years ago

11) #include <string>
12) #include <vector>
13) 
14) #include <BlinkenLib/BlinkenFrame.h>
15) 
16) #include "Color.h"
17) #include "ColorFile.h"
18) #include "File.h"
19) #include "Format.h"
20) #include "FormatFile.h"
21) #include "Mgrs.h"
22) #include "Module.h"
Stefan Schuermans add playing sounds to game...

Stefan Schuermans authored 5 years ago

23) #include "NameFile.h"
Stefan Schuermans add op conn close requests

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 5 years ago

25) #include "OutStreamFile.h"
Stefan Schuermans move time call logic to gam...

Stefan Schuermans authored 5 years ago

26) #include "Time.h"
27) #include "TimeCallee.h"
Stefan Schuermans pong: configurable speed

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 5 years ago

29) 
30) namespace Blinker {
31) 
32) /// base class for games
Stefan Schuermans move time call logic to gam...

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 5 years ago

34) {
35) protected:
36)   /// raw color data matching image buffer
37)   typedef std::vector<unsigned char> ColorData;
38) 
Stefan Schuermans pong: configurable speed

Stefan Schuermans authored 5 years ago

39)   /// descriptor of value (e.g. a setting for the game)
40)   struct ValueDescr {
41)     unsigned int default_;
42)     unsigned int minimum;
43)     unsigned int maximum;
44)   };
45) 
Stefan Schuermans add op conn close requests

Stefan Schuermans authored 5 years ago

46) private:
47)   /// set of operator connections
48)   typedef std::set<OpConn *> OpConnSet;
49) 
Stefan Schuermans add playing sounds to game...

Stefan Schuermans authored 5 years ago

50)   /// sound (via sound name file) to play on operator connections
51)   typedef std::map<OpConn *, NameFile const *> OpConnSounds;
52) 
Stefan Schuermans base class for games

Stefan Schuermans authored 5 years ago

53) public:
54)   /**
55)    * @brief constructor
56)    * @param[in] name module name
57)    * @param[in] mgrs managers
58)    * @param[in] dirBase base directory
59)    */
60)   Game(const std::string &name, Mgrs &mgrs, const Directory &dirBase);
61) 
62)   /// virtual destructor
63)   virtual ~Game();
64) 
65) private:
66)   /// copy constructor disabled
67)   Game(const Game &that);
68) 
69)   /// assignment operator disabled
70)   const Game & operator=(const Game &that);
71) 
72) public:
73)   /// check for update of configuration
Stefan Schuermans begin of Pong game

Stefan Schuermans authored 5 years ago

74)   virtual void updateConfig() final;
75) 
76)   /// check for update of configuration (derived game), return true on update
77)   virtual bool updateConfigGame() = 0;
Stefan Schuermans base class for games

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 5 years ago

79)   /// callback when requested time reached
80)   virtual void timeCall();
81) 
Stefan Schuermans base class for games

Stefan Schuermans authored 5 years ago

82) protected:
83)   /// re-initialize game (e.g. due to config change)
84)   virtual void reinitialize() = 0;
85) 
86)   /// redraw current game image, expected to call sendFrame() at end
87)   virtual void redraw() = 0;
88) 
Stefan Schuermans move time call logic to gam...

Stefan Schuermans authored 5 years ago

89)   /// process next time step of game
90)   virtual void timeStep() = 0;
91) 
Stefan Schuermans base class for games

Stefan Schuermans authored 5 years ago

92)   /// activate game: set up image buffer, call redraw()
93)   void activate();
94) 
95)   /// deactivate game: tear down image buffer, deactivate output
96)   void deactivate();
97) 
Stefan Schuermans pong: activate when player...

Stefan Schuermans authored 5 years ago

98)   /// check if game is active
99)   bool isActive() const;
100) 
Stefan Schuermans base class for games

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 5 years ago

180) 
Stefan Schuermans pong: configurable speed

Stefan Schuermans authored 5 years ago

181)   /// process update of value file, return true on update
182)   static bool valueUpdate(UIntFile &valueFile, ValueDescr const &descr,
183)                           unsigned int &value);
184) 
185)   /// get value from value file
186)   static void valueFromFile(UIntFile &valueFile, ValueDescr const &descr,
187)                             unsigned int &value);
188) 
Stefan Schuermans sound support for pong game

Stefan Schuermans authored 5 years ago

189)   /// process update of sound name file
190)   static void soundUpdate(NameFile &soundFile);
191) 
Stefan Schuermans base class for games

Stefan Schuermans authored 5 years ago

192)   /// send current image buffer as frame to output stream
193)   void sendFrame();
194) 
Stefan Schuermans move time call logic to gam...

Stefan Schuermans authored 5 years ago

195)   /// set next game time step - plan timed action of game
196)   void setTimeStep(const Time& timeStepTime);
197) 
198)   /// unset game time step - do timed action for game
199)   void unsetTimeStep();
200) 
Stefan Schuermans add playing sounds to game...

Stefan Schuermans authored 5 years ago

201)   /// play a sound on operator connection (NULL ok) (direct)
202)   void playOpConnSound(OpConn *pConn, NameFile const &soundFile);
203) 
204)   //// request playing a sound on operator connection (NULL ok) (via time call)
205)   void requestOpConnSound(OpConn *pConn, NameFile const &soundFile);
206) 
Stefan Schuermans add op conn close requests

Stefan Schuermans authored 5 years ago

207)   /// request closing operator connection (NULL ok) (closed via time call)
208)   void requestOpConnClose(OpConn *pConn);
209) 
210)   /// remove operator connection from requests (call when op conn is closed)
211)   void forgetOpConn(OpConn *pConn);
212) 
Stefan Schuermans base class for games

Stefan Schuermans authored 5 years ago

213) private:
214)   /// (re-)create image buffer
215)   void createImgBuf();
216) 
217)   /// tear down image buffer
218)   void destroyImgBuf();
219) 
Stefan Schuermans move time call logic to gam...

Stefan Schuermans authored 5 years ago

220)   /// request next time call - or cancel request if not needed
221)   void planTimeCall();
222) 
Stefan Schuermans base class for games

Stefan Schuermans authored 5 years ago

223) protected:
224)   FormatFile    m_fileFormat;          ///< format file for output
225)   ColorFile     m_fileBackgroundColor; ///< color file for background color
226)   OutStreamFile m_fileOutStream;       ///< output stream name file
227)   int           m_height;              ///< height of image buffer
228)   int           m_width;               ///< width of image buffer
229)   int           m_channels;            ///< number of channels of image buffer
230)   ColorData     m_imgBuf;              ///< image buffer (empty if none)
231)   ColorData     m_backgroundColor;     ///< background color
Stefan Schuermans move time call logic to gam...

Stefan Schuermans authored 5 years ago

232) 
233) private:
Stefan Schuermans add playing sounds to game...

Stefan Schuermans authored 5 years ago

234)   bool         m_haveTimeStep; ///< if a time step is pending
235)   Time         m_timeStepTime; ///< time of next time step
236)   OpConnSounds m_opConnSounds; ///< sound to play on operator connections
237)   OpConnSet    m_opConnsClose; ///< operator connections to be closed