Stefan Schuermans commited on 2019-06-16 11:28:22
Showing 5 changed files, with 84 additions and 17 deletions.
... | ... |
@@ -0,0 +1 @@ |
1 |
+200 |
... | ... |
@@ -16,6 +16,7 @@ |
16 | 16 |
#include "Mgrs.h" |
17 | 17 |
#include "Module.h" |
18 | 18 |
#include "OutStreamFile.h" |
19 |
+#include "UIntFile.h" |
|
19 | 20 |
|
20 | 21 |
namespace Blinker { |
21 | 22 |
|
... | ... |
@@ -277,7 +278,7 @@ bool Game::colorUpdate(ColorFile &colorFile, ColorData &data) const |
277 | 278 |
/// convert color to raw color data |
278 | 279 |
void Game::color2data(ColorFile const &colorFile, ColorData &data) const |
279 | 280 |
{ |
280 |
- if (! m_fileFormat.m_valid) { |
|
281 |
+ if (! m_fileFormat.m_valid || ! colorFile.m_valid) { |
|
281 | 282 |
data.clear(); |
282 | 283 |
} else { |
283 | 284 |
unsigned int channels = m_fileFormat.m_obj.m_channels; |
... | ... |
@@ -306,6 +307,36 @@ void Game::color2data(ColorFile const &colorFile, ColorData &data) const |
306 | 307 |
} |
307 | 308 |
} |
308 | 309 |
|
310 |
+/// process update of value file, return true on update |
|
311 |
+bool Game::valueUpdate(UIntFile &valueFile, ValueDescr const &descr, |
|
312 |
+ unsigned int &value) |
|
313 |
+{ |
|
314 |
+ if (valueFile.checkModified()) { |
|
315 |
+ valueFile.update(); |
|
316 |
+ valueFromFile(valueFile, descr, value); |
|
317 |
+ return true; |
|
318 |
+ } else { |
|
319 |
+ return false; |
|
320 |
+ } |
|
321 |
+} |
|
322 |
+ |
|
323 |
+/// get value from value file |
|
324 |
+void Game::valueFromFile(UIntFile &valueFile, ValueDescr const &descr, |
|
325 |
+ unsigned int &value) |
|
326 |
+{ |
|
327 |
+ if (! valueFile.m_valid) { |
|
328 |
+ value = descr.default_; |
|
329 |
+ } else { |
|
330 |
+ value = valueFile.m_obj.m_uint; |
|
331 |
+ if (value < descr.minimum) { |
|
332 |
+ value = descr.minimum; |
|
333 |
+ } |
|
334 |
+ else if (value > descr.maximum) { |
|
335 |
+ value = descr.maximum; |
|
336 |
+ } |
|
337 |
+ } |
|
338 |
+} |
|
339 |
+ |
|
309 | 340 |
/// send current image buffer as frame to output stream |
310 | 341 |
void Game::sendFrame() |
311 | 342 |
{ |
... | ... |
@@ -19,6 +19,7 @@ |
19 | 19 |
#include "Mgrs.h" |
20 | 20 |
#include "Module.h" |
21 | 21 |
#include "OutStreamFile.h" |
22 |
+#include "UIntFile.h" |
|
22 | 23 |
|
23 | 24 |
namespace Blinker { |
24 | 25 |
|
... | ... |
@@ -29,6 +30,13 @@ protected: |
29 | 30 |
/// raw color data matching image buffer |
30 | 31 |
typedef std::vector<unsigned char> ColorData; |
31 | 32 |
|
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 |
+ |
|
32 | 40 |
public: |
33 | 41 |
/** |
34 | 42 |
* @brief constructor |
... | ... |
@@ -151,6 +159,14 @@ protected: |
151 | 159 |
/// convert color to raw color data |
152 | 160 |
void color2data(ColorFile const &colorFile, ColorData &data) const; |
153 | 161 |
|
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 |
+ |
|
154 | 170 |
/// send current image buffer as frame to output stream |
155 | 171 |
void sendFrame(); |
156 | 172 |
|
... | ... |
@@ -23,13 +23,17 @@ |
23 | 23 |
#include "Pong.h" |
24 | 24 |
#include "Time.h" |
25 | 25 |
#include "TimeCallee.h" |
26 |
+#include "UIntFile.h" |
|
26 | 27 |
|
27 | 28 |
namespace Blinker { |
28 | 29 |
|
30 |
+/// descriptor for delay value |
|
31 |
+Pong::ValueDescr const Pong::c_delayDescr = { 200, 100, 500 }; |
|
32 |
+ |
|
29 | 33 |
/// operator connection name suffix for left player's connection |
30 |
-std::string const Pong::OpConnSuffixLeft = "/left"; |
|
34 |
+std::string const Pong::c_opConnSuffixLeft = "/left"; |
|
31 | 35 |
/// operator connection name suffix for right player's connection |
32 |
-std::string const Pong::OpConnSuffixRight = "/right"; |
|
36 |
+std::string const Pong::c_opConnSuffixRight = "/right"; |
|
33 | 37 |
|
34 | 38 |
/** |
35 | 39 |
* @brief constructor |
... | ... |
@@ -45,24 +49,26 @@ Pong::Pong(const std::string &name, Mgrs &mgrs, const Directory &dirBase): |
45 | 49 |
m_fileComputerColor(dirBase.getFile("computerColor")), |
46 | 50 |
m_fileScoreColor(dirBase.getFile("scoreColor")), |
47 | 51 |
m_fileGoalColor(dirBase.getFile("goalColor")), |
52 |
+ m_fileDelay(dirBase.getFile("delay")), |
|
48 | 53 |
m_ballColor(), m_lineColor(), m_padColor(), m_computerColor(), |
49 | 54 |
m_scoreColor(), m_goalColor(), |
55 |
+ m_delay(c_delayDescr.default_), |
|
50 | 56 |
m_pConnLeft(NULL), m_pConnRight(NULL), |
51 | 57 |
m_ballPosX(-1), m_ballPosY(-1), m_ballDirX(0), m_ballDirY(0), |
52 | 58 |
m_padSize(0), m_leftPosY(0), m_rightPosY(0), m_leftDelay(0), m_rightDelay(0), |
53 | 59 |
m_goalDelay(0), m_bounceCnt(0), m_scoreLeft(0), m_scoreRight(0) |
54 | 60 |
{ |
55 | 61 |
// open operator connection interfaces for left and right player |
56 |
- m_mgrs.m_opMgr.open(m_name + OpConnSuffixLeft, this); |
|
57 |
- m_mgrs.m_opMgr.open(m_name + OpConnSuffixRight, this); |
|
62 |
+ m_mgrs.m_opMgr.open(m_name + c_opConnSuffixLeft, this); |
|
63 |
+ m_mgrs.m_opMgr.open(m_name + c_opConnSuffixRight, this); |
|
58 | 64 |
} |
59 | 65 |
|
60 | 66 |
/// virtual destructor |
61 | 67 |
Pong::~Pong() |
62 | 68 |
{ |
63 | 69 |
// close operator connection interfaces |
64 |
- m_mgrs.m_opMgr.close(m_name + OpConnSuffixLeft); |
|
65 |
- m_mgrs.m_opMgr.close(m_name + OpConnSuffixRight); |
|
70 |
+ m_mgrs.m_opMgr.close(m_name + c_opConnSuffixLeft); |
|
71 |
+ m_mgrs.m_opMgr.close(m_name + c_opConnSuffixRight); |
|
66 | 72 |
|
67 | 73 |
// close open operator connections |
68 | 74 |
if (m_pConnLeft) { |
... | ... |
@@ -89,7 +95,8 @@ bool Pong::updateConfigGame() |
89 | 95 |
colorUpdate(m_filePadColor, m_padColor) || |
90 | 96 |
colorUpdate(m_fileComputerColor, m_computerColor) || |
91 | 97 |
colorUpdate(m_fileScoreColor, m_scoreColor) || |
92 |
- colorUpdate(m_fileGoalColor, m_goalColor)) { |
|
98 |
+ colorUpdate(m_fileGoalColor, m_goalColor) || |
|
99 |
+ valueUpdate(m_fileDelay, c_delayDescr, m_delay)) { |
|
93 | 100 |
ret = true; |
94 | 101 |
} |
95 | 102 |
|
... | ... |
@@ -104,11 +111,11 @@ bool Pong::updateConfigGame() |
104 | 111 |
bool Pong::acceptNewOpConn(const std::string &name) |
105 | 112 |
{ |
106 | 113 |
// left player can join if none there yet |
107 |
- if (name == m_name + OpConnSuffixLeft && ! m_pConnLeft) { |
|
114 |
+ if (name == m_name + c_opConnSuffixLeft && ! m_pConnLeft) { |
|
108 | 115 |
return true; |
109 | 116 |
} |
110 | 117 |
// right player can join if none there yet |
111 |
- if (name == m_name + OpConnSuffixRight && ! m_pConnRight) { |
|
118 |
+ if (name == m_name + c_opConnSuffixRight && ! m_pConnRight) { |
|
112 | 119 |
return true; |
113 | 120 |
} |
114 | 121 |
// default: reject connection |
... | ... |
@@ -125,11 +132,11 @@ bool Pong::acceptNewOpConn(const std::string &name) |
125 | 132 |
void Pong::newOpConn(const std::string &name, OpConn *pConn) |
126 | 133 |
{ |
127 | 134 |
// left player joins if none there yet |
128 |
- if (name == m_name + OpConnSuffixLeft && ! m_pConnLeft) { |
|
135 |
+ if (name == m_name + c_opConnSuffixLeft && ! m_pConnLeft) { |
|
129 | 136 |
m_pConnLeft = pConn; |
130 | 137 |
} |
131 | 138 |
// right player joins if none there yet |
132 |
- else if (name == m_name + OpConnSuffixRight && ! m_pConnRight) { |
|
139 |
+ else if (name == m_name + c_opConnSuffixRight && ! m_pConnRight) { |
|
133 | 140 |
m_pConnRight = pConn; |
134 | 141 |
} |
135 | 142 |
// nothing happens |
... | ... |
@@ -223,6 +230,8 @@ void Pong::reinitialize() |
223 | 230 |
color2data(m_fileComputerColor, m_computerColor); |
224 | 231 |
color2data(m_fileScoreColor, m_scoreColor); |
225 | 232 |
color2data(m_fileGoalColor, m_goalColor); |
233 |
+ // get values |
|
234 |
+ valueFromFile(m_fileDelay, c_delayDescr, m_delay); |
|
226 | 235 |
|
227 | 236 |
// reset scores |
228 | 237 |
m_scoreLeft = 0; |
... | ... |
@@ -566,8 +575,9 @@ void Pong::planTimeCall() |
566 | 575 |
} |
567 | 576 |
|
568 | 577 |
// compute interval based on score and bounce count |
569 |
- float speedup = 10 * (m_scoreLeft + m_scoreRight) + m_bounceCnt; |
|
570 |
- float interval = 0.05f + 0.1f * expf(-0.03f * speedup); |
|
578 |
+ int speedup = 10 * (m_scoreLeft + m_scoreRight) + m_bounceCnt; |
|
579 |
+ float scale = 0.3f + 0.7f * expf(-0.03f * speedup); |
|
580 |
+ float interval = 1e-3f * m_delay * scale; |
|
571 | 581 |
|
572 | 582 |
// request next time call |
573 | 583 |
Time stepTime; |
... | ... |
@@ -25,6 +25,7 @@ |
25 | 25 |
#include "OutStreamFile.h" |
26 | 26 |
#include "Time.h" |
27 | 27 |
#include "TimeCallee.h" |
28 |
+#include "UIntFile.h" |
|
28 | 29 |
|
29 | 30 |
namespace Blinker { |
30 | 31 |
|
... | ... |
@@ -163,10 +164,13 @@ protected: |
163 | 164 |
|
164 | 165 |
protected: |
165 | 166 |
|
167 |
+ /// descriptor for delay value |
|
168 |
+ static ValueDescr const c_delayDescr; |
|
169 |
+ |
|
166 | 170 |
/// operator connection name suffix for left player's connection |
167 |
- static std::string const OpConnSuffixLeft; |
|
171 |
+ static std::string const c_opConnSuffixLeft; |
|
168 | 172 |
/// operator connection name suffix for right player's connection |
169 |
- static std::string const OpConnSuffixRight; |
|
173 |
+ static std::string const c_opConnSuffixRight; |
|
170 | 174 |
|
171 | 175 |
ColorFile m_fileBallColor; ///< color file for ball color |
172 | 176 |
ColorFile m_fileLineColor; ///< color file for center line |
... | ... |
@@ -174,14 +178,19 @@ protected: |
174 | 178 |
ColorFile m_fileComputerColor; ///< color file for computer player pad |
175 | 179 |
ColorFile m_fileScoreColor; ///< color file for score when ball is moving |
176 | 180 |
ColorFile m_fileGoalColor; ///< color file for score during goal |
181 |
+ UIntFile m_fileDelay; ///< file for initial delay in ms per frame |
|
182 |
+ |
|
177 | 183 |
ColorData m_ballColor; ///< ball color |
178 | 184 |
ColorData m_lineColor; ///< center line color |
179 | 185 |
ColorData m_padColor; ///< phone player pad color |
180 | 186 |
ColorData m_computerColor; ///< computer player pad color |
181 | 187 |
ColorData m_scoreColor; ///< score color when ball is moving |
182 | 188 |
ColorData m_goalColor; ///< score color during goal |
189 |
+ unsigned int m_delay; ///< initial delay in ms per frame (ball speed) |
|
190 |
+ |
|
183 | 191 |
OpConn *m_pConnLeft; ///< operator connection left player (or NULL) |
184 |
- OpConn *m_pConnRight; ///< operator connection right player (o NULL) |
|
192 |
+ OpConn *m_pConnRight; ///< operator connection right player (or NULL) |
|
193 |
+ |
|
185 | 194 |
int m_ballPosX; ///< ball position X |
186 | 195 |
int m_ballPosY; ///< ball position Y |
187 | 196 |
int m_ballDirX; ///< ball direction X |
188 | 197 |