Stefan Schuermans commited on 2019-06-15 21:44:37
Showing 4 changed files, with 44 additions and 42 deletions.
... | ... |
@@ -93,6 +93,12 @@ void Game::deactivate() |
93 | 93 |
sendFrame(); |
94 | 94 |
} |
95 | 95 |
|
96 |
+/// check if game is active |
|
97 |
+bool Game::isActive() const |
|
98 |
+{ |
|
99 |
+ return ! m_imgBuf.empty(); // game is active if there is an image buffer |
|
100 |
+} |
|
101 |
+ |
|
96 | 102 |
/// set pixel in image buffer |
97 | 103 |
void Game::pixel(int y, int x, ColorData const &cd) |
98 | 104 |
{ |
... | ... |
@@ -68,6 +68,9 @@ protected: |
68 | 68 |
/// deactivate game: tear down image buffer, deactivate output |
69 | 69 |
void deactivate(); |
70 | 70 |
|
71 |
+ /// check if game is active |
|
72 |
+ bool isActive() const; |
|
73 |
+ |
|
71 | 74 |
/// check if integer is between minimum and maximum values |
72 | 75 |
static bool checkLimitInt(int i, int min, int max) |
73 | 76 |
{ |
... | ... |
@@ -52,9 +52,6 @@ Pong::Pong(const std::string &name, Mgrs &mgrs, const Directory &dirBase): |
52 | 52 |
// open operator connection interfaces for left and right player |
53 | 53 |
m_mgrs.m_opMgr.open(m_name + OpConnSuffixLeft, this); |
54 | 54 |
m_mgrs.m_opMgr.open(m_name + OpConnSuffixRight, this); |
55 |
- |
|
56 |
- // FIXME: activate at begin for initial development only |
|
57 |
- activate(); |
|
58 | 55 |
} |
59 | 56 |
|
60 | 57 |
/// virtual destructor |
... | ... |
@@ -125,15 +122,24 @@ void Pong::newOpConn(const std::string &name, OpConn *pConn) |
125 | 122 |
// left player joins if none there yet |
126 | 123 |
if (name == m_name + OpConnSuffixLeft && ! m_pConnLeft) { |
127 | 124 |
m_pConnLeft = pConn; |
128 |
- redraw(); // player color is different for phone / computer |
|
129 |
- return; |
|
130 | 125 |
} |
131 | 126 |
// right player joins if none there yet |
132 |
- if (name == m_name + OpConnSuffixRight && ! m_pConnRight) { |
|
127 |
+ else if (name == m_name + OpConnSuffixRight && ! m_pConnRight) { |
|
133 | 128 |
m_pConnRight = pConn; |
134 |
- redraw(); // player color is different for phone / computer |
|
129 |
+ } |
|
130 |
+ // nothing happens |
|
131 |
+ else { |
|
135 | 132 |
return; |
136 | 133 |
} |
134 |
+ |
|
135 |
+ // already active |
|
136 |
+ if (isActive()) { |
|
137 |
+ redraw(); // player color is different for phone / computer |
|
138 |
+ } |
|
139 |
+ // first player joined |
|
140 |
+ else { |
|
141 |
+ activate(); |
|
142 |
+ } |
|
137 | 143 |
} |
138 | 144 |
|
139 | 145 |
/** |
... | ... |
@@ -146,12 +152,10 @@ void Pong::opConnRecvKey(OpConn *pConn, char key) |
146 | 152 |
// left player |
147 | 153 |
if (pConn == m_pConnLeft) { |
148 | 154 |
processKey(key, m_leftPosY); |
149 |
- return; |
|
150 | 155 |
} |
151 | 156 |
// right player |
152 |
- if (pConn == m_pConnRight) { |
|
157 |
+ else if (pConn == m_pConnRight) { |
|
153 | 158 |
processKey(key, m_rightPosY); |
154 |
- return; |
|
155 | 159 |
} |
156 | 160 |
} |
157 | 161 |
|
... | ... |
@@ -177,15 +181,24 @@ void Pong::opConnClose(OpConn *pConn) |
177 | 181 |
// left player leaves |
178 | 182 |
if (pConn == m_pConnLeft) { |
179 | 183 |
m_pConnLeft = NULL; |
180 |
- redraw(); // player color is different for phone / computer |
|
181 |
- return; |
|
182 | 184 |
} |
183 | 185 |
// right player leaves |
184 |
- if (pConn == m_pConnRight) { |
|
186 |
+ else if (pConn == m_pConnRight) { |
|
185 | 187 |
m_pConnRight = NULL; |
186 |
- redraw(); // player color is different for phone / computer |
|
188 |
+ } |
|
189 |
+ // nothing happens |
|
190 |
+ else { |
|
187 | 191 |
return; |
188 | 192 |
} |
193 |
+ |
|
194 |
+ // still a phone player there |
|
195 |
+ if (m_pConnLeft || m_pConnRight) { |
|
196 |
+ redraw(); // player color is different for phone / computer |
|
197 |
+ } |
|
198 |
+ // no phone players left |
|
199 |
+ else { |
|
200 |
+ deactivate(); |
|
201 |
+ } |
|
189 | 202 |
} |
190 | 203 |
|
191 | 204 |
/// re-initialize game (e.g. due to config change) |
... | ... |
@@ -204,7 +217,11 @@ void Pong::reinitialize() |
204 | 217 |
color2data(m_filePadColor, m_padColor); |
205 | 218 |
color2data(m_fileComputerColor, m_computerColor); |
206 | 219 |
|
207 |
- // FIXME: start ball for development |
|
220 |
+ // reset scores |
|
221 |
+ m_scoreLeft = 0; |
|
222 |
+ m_scoreRight = 0; |
|
223 |
+ |
|
224 |
+ // start first ball |
|
208 | 225 |
startBall(); |
209 | 226 |
} |
210 | 227 |
|
... | ... |
@@ -241,7 +258,7 @@ void Pong::redraw() |
241 | 258 |
void Pong::timeCall() |
242 | 259 |
{ |
243 | 260 |
// game is running |
244 |
- if (m_goalDelay <= 0 && m_ballPosX >= 0 && m_ballPosY >= 0) { |
|
261 |
+ if (m_goalDelay <= 0) { |
|
245 | 262 |
|
246 | 263 |
// computer player: move pads |
247 | 264 |
if (! m_pConnLeft) { |
... | ... |
@@ -528,8 +545,8 @@ void Pong::detectGoal() |
528 | 545 |
/// request next time call - or cancel request if not needed |
529 | 546 |
void Pong::planTimeCall() |
530 | 547 |
{ |
531 |
- // no time call needed if game is not running |
|
532 |
- if (m_ballPosX < 0 || m_ballPosY < 0) { |
|
548 |
+ // no time call needed if not active |
|
549 |
+ if (! isActive()) { |
|
533 | 550 |
m_mgrs.m_callMgr.cancelTimeCall(this); |
534 | 551 |
return; |
535 | 552 |
} |
... | ... |
@@ -544,27 +561,6 @@ void Pong::planTimeCall() |
544 | 561 |
m_mgrs.m_callMgr.requestTimeCall(this, Time::now() + stepTime); |
545 | 562 |
} |
546 | 563 |
|
547 |
-/// move ball out of the field and halt it |
|
548 |
-void Pong::hideBall() |
|
549 |
-{ |
|
550 |
- m_ballPosX = -1; |
|
551 |
- m_ballPosY = -1; |
|
552 |
- m_ballDirX = 0; |
|
553 |
- m_ballDirY = 0; |
|
554 |
- |
|
555 |
- // no delays, ball has not bounced at pad |
|
556 |
- m_leftDelay = 0; |
|
557 |
- m_rightDelay = 0; |
|
558 |
- m_goalDelay = 0; |
|
559 |
- m_bounceCnt = 0; |
|
560 |
- |
|
561 |
- // draw and send frame |
|
562 |
- redraw(); |
|
563 |
- |
|
564 |
- // update time call request |
|
565 |
- planTimeCall(); |
|
566 |
-} |
|
567 |
- |
|
568 | 564 |
/// start ball |
569 | 565 |
void Pong::startBall() |
570 | 566 |
{ |