Stefan Schuermans commited on 2019-06-15 14:37:52
Showing 2 changed files, with 38 additions and 1 deletions.
... | ... |
@@ -35,7 +35,7 @@ Pong::Pong(const std::string &name, Mgrs &mgrs, const Directory &dirBase): |
35 | 35 |
m_filePadColor(dirBase.getFile("padColor")), |
36 | 36 |
m_ballColor(), m_lineColor(), m_padColor(), |
37 | 37 |
m_ballPosX(-1), m_ballPosY(-1), m_ballDirX(0), m_ballDirY(0), |
38 |
- m_padSize(0), m_leftPosY(0), m_rightPosY(0) |
|
38 |
+ m_padSize(0), m_leftPosY(0), m_rightPosY(0), m_leftDelay(0), m_rightDelay(0) |
|
39 | 39 |
{ |
40 | 40 |
// FIXME: activate at begin for initial development only |
41 | 41 |
activate(); |
... | ... |
@@ -70,6 +70,8 @@ void Pong::reinitialize() |
70 | 70 |
m_padSize = (m_height + 1) / 3; |
71 | 71 |
m_leftPosY = (m_height - m_padSize) / 2; |
72 | 72 |
m_rightPosY = (m_height - m_padSize) / 2; |
73 |
+ m_leftDelay = 0; |
|
74 |
+ m_rightDelay = 0; |
|
73 | 75 |
|
74 | 76 |
// convert colors |
75 | 77 |
color2data(m_fileBallColor, m_ballColor); |
... | ... |
@@ -126,6 +128,28 @@ void Pong::timeCall() |
126 | 128 |
planTimeCall(); |
127 | 129 |
} |
128 | 130 |
|
131 |
+/** |
|
132 |
+ * @brief delay processing for computer players |
|
133 |
+ * @param[in,out] delay delay variable of computer player |
|
134 |
+ * @return whether computer player is allowed to move |
|
135 |
+ */ |
|
136 |
+bool Pong::computerDelay(int &delay) const |
|
137 |
+ |
|
138 |
+{ |
|
139 |
+ // zero delay: generate new delay |
|
140 |
+ if (delay <= 0) { |
|
141 |
+ int avg_steps = (m_height - m_padSize) / 2; |
|
142 |
+ int delay_range = avg_steps > 1 ? m_width / avg_steps: m_width; |
|
143 |
+ delay = rand() % delay_range + delay_range; |
|
144 |
+ } |
|
145 |
+ |
|
146 |
+ // count down delay |
|
147 |
+ --delay; |
|
148 |
+ |
|
149 |
+ // moving allowd if delay expired |
|
150 |
+ return delay <= 0; |
|
151 |
+} |
|
152 |
+ |
|
129 | 153 |
/** |
130 | 154 |
* @brief computation of ideal pad position for computer players |
131 | 155 |
* @param[in] padBallX x coordinate of position of ball when hitting the pad |
... | ... |
@@ -199,18 +223,22 @@ void Pong::computerMovePad(int padYmin, int padYmax, int &padPosY) const |
199 | 223 |
/// computer player for left pad |
200 | 224 |
void Pong::computerLeft() |
201 | 225 |
{ |
226 |
+ if (computerDelay(m_leftDelay)) { |
|
202 | 227 |
int padYmin, padYmax; |
203 | 228 |
computerComputePadPos(1, m_leftPosY, padYmin, padYmax); |
204 | 229 |
computerMovePad(padYmin, padYmax, m_leftPosY); |
205 | 230 |
} |
231 |
+} |
|
206 | 232 |
|
207 | 233 |
/// computer player for right pad |
208 | 234 |
void Pong::computerRight() |
209 | 235 |
{ |
236 |
+ if (computerDelay(m_rightDelay)) { |
|
210 | 237 |
int padYmin, padYmax; |
211 | 238 |
computerComputePadPos(m_width - 2, m_rightPosY, padYmin, padYmax); |
212 | 239 |
computerMovePad(padYmin, padYmax, m_rightPosY); |
213 | 240 |
} |
241 |
+} |
|
214 | 242 |
|
215 | 243 |
/// bounce ball |
216 | 244 |
void Pong::bounceBall() |
... | ... |
@@ -61,6 +61,13 @@ protected: |
61 | 61 |
/// callback when requested time reached |
62 | 62 |
virtual void timeCall(); |
63 | 63 |
|
64 |
+ /** |
|
65 |
+ * @brief delay processing for computer players |
|
66 |
+ * @param[in,out] delay delay variable of computer player |
|
67 |
+ * @return whether computer player is allowed to move |
|
68 |
+ */ |
|
69 |
+ bool computerDelay(int &delay) const; |
|
70 |
+ |
|
64 | 71 |
/** |
65 | 72 |
* @brief computation of ideal pad position for computer players |
66 | 73 |
* @param[in] padBallX x coordinate of position of ball when hitting the pad |
... | ... |
@@ -120,6 +127,8 @@ protected: |
120 | 127 |
int m_padSize; ///< size of player pads |
121 | 128 |
int m_leftPosY; ///< position of top pixel of left pad |
122 | 129 |
int m_rightPosY; ///< position of top pixel of left pad |
130 |
+ int m_leftDelay; ///< delay for coputer moving left pad |
|
131 |
+ int m_rightDelay; ///< delay for coputer moving left pad |
|
123 | 132 |
}; // class Canvas |
124 | 133 |
|
125 | 134 |
} // namespace Blinker |
126 | 135 |