Stefan Schuermans commited on 2019-07-14 17:51:57
Showing 2 changed files, with 29 additions and 7 deletions.
... | ... |
@@ -38,11 +38,14 @@ Tetris::Tetris(const std::string &name, Mgrs &mgrs, const Directory &dirBase): |
38 | 38 |
Game(name, mgrs, dirBase), |
39 | 39 |
m_fileStoneColor(dirBase.getFile("stoneColor")), |
40 | 40 |
m_fileDelay(dirBase.getFile("delay")), |
41 |
+ m_fileDropDelay(dirBase.getFile("dropDelay")), |
|
41 | 42 |
m_fileStartSound(dirBase.getFile("startSound")), |
42 | 43 |
m_stoneColor(), |
43 | 44 |
m_delay(c_delayDescr.default_), |
45 |
+ m_dropDelay(c_dropDelayDescr.default_), |
|
44 | 46 |
m_pConn(NULL), |
45 |
- m_stone(-1), m_rot(-1), m_posX(-1), m_posY(-1), m_field() |
|
47 |
+ m_stone(-1), m_rot(-1), m_posX(-1), m_posY(-1), m_dropping(false), |
|
48 |
+ m_field() |
|
46 | 49 |
{ |
47 | 50 |
// open operator connection interfaces for player |
48 | 51 |
m_mgrs.m_opMgr.open(m_name, this); |
... | ... |
@@ -69,7 +72,8 @@ bool Tetris::updateConfigGame() |
69 | 72 |
// color file was modified -> convert color, return true for update |
70 | 73 |
// cfg value file was updated -> read new cfg value, return true for update |
71 | 74 |
if (colorUpdate(m_fileStoneColor, m_stoneColor) || |
72 |
- valueUpdate(m_fileDelay, c_delayDescr, m_delay)) { |
|
75 |
+ valueUpdate(m_fileDelay, c_delayDescr, m_delay) || |
|
76 |
+ valueUpdate(m_fileDropDelay, c_dropDelayDescr, m_dropDelay)) { |
|
73 | 77 |
ret = true; |
74 | 78 |
} |
75 | 79 |
|
... | ... |
@@ -136,7 +140,11 @@ void Tetris::opConnRecvKey(OpConn *pConn, char key) |
136 | 140 |
return; |
137 | 141 |
} |
138 | 142 |
|
139 |
- // normal keys for controlling game |
|
143 |
+ /** normal keys for controlling game, |
|
144 |
+ deactivated if dropping stone */ |
|
145 |
+ if (m_dropping) { |
|
146 |
+ return; |
|
147 |
+ } |
|
140 | 148 |
|
141 | 149 |
// move left |
142 | 150 |
if (key == '4') { |
... | ... |
@@ -192,7 +200,8 @@ void Tetris::opConnRecvKey(OpConn *pConn, char key) |
192 | 200 |
|
193 | 201 |
// drop stone |
194 | 202 |
if (key == '8') { |
195 |
- // TODO |
|
203 |
+ m_dropping = true; |
|
204 |
+ planTimeStep(); // stone falls fater now -> update time callback |
|
196 | 205 |
return; |
197 | 206 |
} |
198 | 207 |
} |
... | ... |
@@ -307,6 +316,9 @@ void Tetris::newStone() |
307 | 316 |
// postion: two pixels above top middle |
308 | 317 |
m_posX = (m_width - 1) / 2; |
309 | 318 |
m_posY = -2; |
319 |
+ |
|
320 |
+ // stone is not being dropped yet |
|
321 |
+ m_dropping = false; |
|
310 | 322 |
} |
311 | 323 |
|
312 | 324 |
/// set time for next time step of game - or unset if not needed |
... | ... |
@@ -318,8 +330,9 @@ void Tetris::planTimeStep() |
318 | 330 |
return; |
319 | 331 |
} |
320 | 332 |
|
321 |
- // compute interval based on score and bounce count |
|
322 |
- float interval = 1e-3f * m_delay; |
|
333 |
+ // compute interval based on game state |
|
334 |
+ int interval_ms = m_dropping ? m_dropDelay : m_delay; |
|
335 |
+ float interval = 1e-3f * interval_ms; |
|
323 | 336 |
|
324 | 337 |
// request next time call |
325 | 338 |
Time stepTime; |
... | ... |
@@ -480,5 +493,8 @@ int const Tetris::c_pixelCnt = sizeof(Tetris::RotStone::pixels) / |
480 | 493 |
/// descriptor for delay value |
481 | 494 |
Tetris::ValueDescr const Tetris::c_delayDescr = { 400, 200, 1000 }; |
482 | 495 |
|
496 |
+/// descriptor for delay value during dropping a stone |
|
497 |
+Tetris::ValueDescr const Tetris::c_dropDelayDescr = { 100, 50, 250 }; |
|
498 |
+ |
|
483 | 499 |
} // namespace Blinker |
484 | 500 |
|
... | ... |
@@ -156,13 +156,18 @@ protected: |
156 | 156 |
/// descriptor for delay value |
157 | 157 |
static ValueDescr const c_delayDescr; |
158 | 158 |
|
159 |
+ /// descriptor for delay value during dropping a stone |
|
160 |
+ static ValueDescr const c_dropDelayDescr; |
|
161 |
+ |
|
159 | 162 |
ColorFile m_fileStoneColor; ///< color file for stone color |
160 | 163 |
UIntFile m_fileDelay; ///< file for initial delay in ms per frame |
164 |
+ UIntFile m_fileDropDelay; ///< file for delay while dropping (ms / frame) |
|
161 | 165 |
|
162 | 166 |
NameFile m_fileStartSound; ///< "start game" sound name file |
163 | 167 |
|
164 | 168 |
ColorData m_stoneColor; ///< stone color |
165 |
- unsigned int m_delay; ///< initial delay in ms per frame (ball speed) |
|
169 |
+ unsigned int m_delay; ///< initial delay in ms per frame |
|
170 |
+ unsigned int m_dropDelay; ///< delay while dropping in ms per frame |
|
166 | 171 |
|
167 | 172 |
OpConn *m_pConn; ///< operator connection of player (or NULL) |
168 | 173 |
|
... | ... |
@@ -170,6 +175,7 @@ protected: |
170 | 175 |
int m_rot; ///< rotation of current stone |
171 | 176 |
int m_posX; ///< x position of current stone |
172 | 177 |
int m_posY; ///< y position of current stone |
178 |
+ bool m_dropping; ///< whether currently dropping a stone |
|
173 | 179 |
|
174 | 180 |
/// tetris field (y * m_width + x), -1 for free, >= 0 for pixel from stone |
175 | 181 |
std::vector<int> m_field; |
176 | 182 |