tetris game WIP
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_TETRIS_H
7) #define BLINKER_TETRIS_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 "Game.h"
20) #include "Mgrs.h"
21) #include "Module.h"
22) #include "NameFile.h"
23) #include "OpConn.h"
24) #include "OpConnIf.h"
25) #include "OpReqIf.h"
26) #include "OutStreamFile.h"
27) #include "Time.h"
28) #include "TimeCallee.h"
29) #include "UIntFile.h"
30)
31) namespace Blinker {
32)
33) /// tetris game
34) class Tetris: public Game, public OpReqIf
35) {
36) protected:
37) /// coordinates of a pixel part of a stone
38) struct Coord {
39) int x;
40) int y;
41) };
42)
43) /// descriptor of a certain rotation of a stone
44) struct RotStone {
45) Coord pixels[4]; ///< coordinates of the 4 pixels
46) };
47)
48) /// descriptor of a stone
49) struct Stone {
50) RotStone rot[4]; ///< rotations of the stone
51) };
52)
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) Tetris(const std::string &name, Mgrs &mgrs, const Directory &dirBase);
61)
62) /// virtual destructor
63) virtual ~Tetris();
64)
65) private:
66) /// copy constructor disabled
67) Tetris(const Tetris &that);
68)
69) /// assignment operator disabled
70) const Tetris & operator=(const Tetris &that);
71)
72) public:
73) /// check for update of configuration (derived game), return true on update
74) virtual bool updateConfigGame();
75)
76) /**
77) * @brief check if accepting new operator connection is possible
78) * @param[in] name operator interface name
79) * @return if accepting new connection is possible
80) */
81) virtual bool acceptNewOpConn(const std::string &name);
82)
83) /**
84) * @brief new operator connection
85) * @param[in] name operator interface name
86) * @param[in] pConn operator connection object
87) *
88) * The new connection may not yet be used for sending inside this callback.
89) */
90) virtual void newOpConn(const std::string &name, OpConn *pConn);
91)
92) /**
93) * @brief key command received on operator connection
94) * @param[in] pConn operator connection object
95) * @param[in] key key that was pressed
96) */
97) virtual void opConnRecvKey(OpConn *pConn, char key);
98)
99) /**
100) * @brief play command received on operator connection
101) * @param[in] pConn operator connection object
102) * @param[in] sound name of sound to play
103) */
104) virtual void opConnRecvPlay(OpConn *pConn, const std::string &sound);
105)
106) /**
107) * @brief operator connection is closed
108) * @param[in] pConn operator connection object
109) *
110) * The connection may not be used for sending any more in this callback.
111) */
112) virtual void opConnClose(OpConn *pConn);
113)
114) protected:
115) /// re-initialize game (e.g. due to config change)
116) virtual void reinitialize();
117)
118) /// redraw current game image, expected to call sendFrame() at end
119) virtual void redraw();
120)
121) /// process next time step of game
122) virtual void timeStep();
123)
124) /// set up a new stone
125) void newStone();
126)
127) /// set time for next time step of game - or unset if not needed
128) void planTimeStep();
129)
|
tetris WIP: move/freeze stones
Stefan Schuermans authored 5 years ago
|
130) /// get rotatation of stone from stone/rotation index (or NULL in invalid)
131) static RotStone const * getRotStone(int stone, int rot);
132)
|
tetris game WIP
Stefan Schuermans authored 5 years ago
|
133) /// check if stone fits at position
134) bool checkStoneFit(int stone, int rot, int y, int x) const;
135)
|
tetris WIP: move/freeze stones
Stefan Schuermans authored 5 years ago
|
136) /// freeze stone to field at position
137) void freezeStone(int stone, int rot, int y, int x);
138)
|
tetris game WIP
Stefan Schuermans authored 5 years ago
|
139) /// draw a stone to image buffer
140) void drawStone(int stone, int rot, int y, int x);
141)
142) /// wipe a stone from image buffer (i.e. replace it with background color)
143) void wipeStone(int stone, int rot, int y, int x);
144)
145) /// set shape of stone to color in image buffer
146) void colorStone(int stone, int rot, int y, int x, ColorData const &color);
147)
148) protected:
149) /// stone data
150) static Stone const c_stones[7];
151)
152) static int const c_stoneCnt; ///< number of stones
153) static int const c_rotCnt; ///< number of rotations per stone
154) static int const c_pixelCnt; ///< number of pixels per stone
155)
156) /// descriptor for delay value
157) static ValueDescr const c_delayDescr;
158)
|
tetris: dropping stones
Stefan Schuermans authored 5 years ago
|
159) /// descriptor for delay value during dropping a stone
160) static ValueDescr const c_dropDelayDescr;
161)
|
tetris game WIP
Stefan Schuermans authored 5 years ago
|
162) ColorFile m_fileStoneColor; ///< color file for stone color
163) UIntFile m_fileDelay; ///< file for initial delay in ms per frame
|
tetris: dropping stones
Stefan Schuermans authored 5 years ago
|
164) UIntFile m_fileDropDelay; ///< file for delay while dropping (ms / frame)
|
tetris game WIP
Stefan Schuermans authored 5 years ago
|
165)
166) NameFile m_fileStartSound; ///< "start game" sound name file
167)
168) ColorData m_stoneColor; ///< stone color
|
tetris: dropping stones
Stefan Schuermans authored 5 years ago
|
169) unsigned int m_delay; ///< initial delay in ms per frame
170) unsigned int m_dropDelay; ///< delay while dropping in ms per frame
|
tetris game WIP
Stefan Schuermans authored 5 years ago
|
171)
172) OpConn *m_pConn; ///< operator connection of player (or NULL)
173)
|
tetris: dropping stones
Stefan Schuermans authored 5 years ago
|
174) int m_stone; ///< index of current stone
175) int m_rot; ///< rotation of current stone
176) int m_posX; ///< x position of current stone
177) int m_posY; ///< y position of current stone
178) bool m_dropping; ///< whether currently dropping a stone
|