Stefan Schuermans commited on 2019-06-10 12:32:31
Showing 5 changed files, with 106 additions and 7 deletions.
... | ... |
@@ -0,0 +1 @@ |
1 |
+808080 |
... | ... |
@@ -3,6 +3,7 @@ |
3 | 3 |
Copyleft GNU public license - http://www.gnu.org/copyleft/gpl.html |
4 | 4 |
a blinkenarea.org project */ |
5 | 5 |
|
6 |
+#include <stdlib.h> |
|
6 | 7 |
#include <string> |
7 | 8 |
#include <vector> |
8 | 9 |
|
... | ... |
@@ -16,6 +17,8 @@ |
16 | 17 |
#include "Module.h" |
17 | 18 |
#include "OutStreamFile.h" |
18 | 19 |
#include "Pong.h" |
20 |
+#include "Time.h" |
|
21 |
+#include "TimeCallee.h" |
|
19 | 22 |
|
20 | 23 |
namespace Blinker { |
21 | 24 |
|
... | ... |
@@ -28,7 +31,9 @@ namespace Blinker { |
28 | 31 |
Pong::Pong(const std::string &name, Mgrs &mgrs, const Directory &dirBase): |
29 | 32 |
Game(name, mgrs, dirBase), |
30 | 33 |
m_fileBallColor(dirBase.getFile("ballColor")), |
31 |
- m_ballColor() |
|
34 |
+ m_fileLineColor(dirBase.getFile("lineColor")), |
|
35 |
+ m_ballColor(), m_lineColor(), |
|
36 |
+ m_ballPosX(-1), m_ballPosY(-1), m_ballDirX(0), m_ballDirY(0) |
|
32 | 37 |
{ |
33 | 38 |
// FIXME: activate at begin for initial development only |
34 | 39 |
activate(); |
... | ... |
@@ -37,6 +42,8 @@ Pong::Pong(const std::string &name, Mgrs &mgrs, const Directory &dirBase): |
37 | 42 |
/// virtual destructor |
38 | 43 |
Pong::~Pong() |
39 | 44 |
{ |
45 |
+ // cancel time callback request |
|
46 |
+ m_mgrs.m_callMgr.cancelTimeCall(this); |
|
40 | 47 |
} |
41 | 48 |
|
42 | 49 |
/// check for update of configuration (derived game), return true on update |
... | ... |
@@ -45,7 +52,8 @@ bool Pong::updateConfigGame() |
45 | 52 |
bool ret = false; |
46 | 53 |
|
47 | 54 |
// color file was modified -> convert color, return true for update |
48 |
- if (colorUpdate(m_fileBallColor, m_ballColor)) { |
|
55 |
+ if (colorUpdate(m_fileBallColor, m_ballColor) || |
|
56 |
+ colorUpdate(m_fileLineColor, m_lineColor)) { |
|
49 | 57 |
ret = true; |
50 | 58 |
} |
51 | 59 |
|
... | ... |
@@ -59,20 +67,90 @@ void Pong::reinitialize() |
59 | 67 |
|
60 | 68 |
// convert colors |
61 | 69 |
color2data(m_fileBallColor, m_ballColor); |
70 |
+ color2data(m_fileLineColor, m_lineColor); |
|
71 |
+ |
|
72 |
+ // FIXME: start ball for development |
|
73 |
+ startBall(); |
|
62 | 74 |
} |
63 | 75 |
|
64 | 76 |
/// redraw current game image, expected to call sendFrame() at end |
65 | 77 |
void Pong::redraw() |
66 | 78 |
{ |
67 |
- // set image buffer to background color |
|
79 |
+ int y, x; |
|
80 |
+ |
|
81 |
+ // draw background |
|
68 | 82 |
rectFill(0, m_height, 0, m_width, m_backgroundColor); |
69 | 83 |
|
70 |
- // FIXME: draw ball |
|
71 |
- pixel(m_height / 2, m_width / 2, m_ballColor); |
|
84 |
+ // draw middle line: single line on odd width, two dashed lines at even width |
|
85 |
+ for (y = 0; y < m_height; ++y) { |
|
86 |
+ x = (m_width - (y & 1)) / 2; |
|
87 |
+ pixel(y, x, m_lineColor); |
|
88 |
+ } |
|
89 |
+ |
|
90 |
+ // draw ball |
|
91 |
+ pixel(m_ballPosY, m_ballPosX, m_ballColor); |
|
72 | 92 |
|
73 | 93 |
// send updated image buffer as frame |
74 | 94 |
sendFrame(); |
75 | 95 |
} |
76 | 96 |
|
97 |
+/// callback when requested time reached |
|
98 |
+void Pong::timeCall() |
|
99 |
+{ |
|
100 |
+ // bounce ball |
|
101 |
+ if (m_ballPosY <= 0 && m_ballDirY < 0) { |
|
102 |
+ m_ballDirY = 1; |
|
103 |
+ } |
|
104 |
+ if (m_ballPosY >= m_height - 1 && m_ballDirY > 0) { |
|
105 |
+ m_ballDirY = -1; |
|
106 |
+ } |
|
107 |
+ if (m_ballPosX <= 0 && m_ballDirX < 0) { |
|
108 |
+ m_ballDirX = 1; |
|
109 |
+ } |
|
110 |
+ if (m_ballPosX >= m_width - 1 && m_ballDirX > 0) { |
|
111 |
+ m_ballDirX = -1; |
|
112 |
+ } |
|
113 |
+ |
|
114 |
+ // move ball |
|
115 |
+ m_ballPosX += m_ballDirX; |
|
116 |
+ m_ballPosY += m_ballDirY; |
|
117 |
+ |
|
118 |
+ // draw and send frame |
|
119 |
+ redraw(); |
|
120 |
+ |
|
121 |
+ // request next call |
|
122 |
+ Time stepTime; |
|
123 |
+ stepTime.fromMs(100); |
|
124 |
+ m_mgrs.m_callMgr.requestTimeCall(this, Time::now() + stepTime); |
|
125 |
+} |
|
126 |
+ |
|
127 |
+/// move ball out of the field and halt it |
|
128 |
+void Pong::hideBall() |
|
129 |
+{ |
|
130 |
+ m_ballPosX = -1; |
|
131 |
+ m_ballPosY = -1; |
|
132 |
+ m_ballDirX = 0; |
|
133 |
+ m_ballDirY = 0; |
|
134 |
+ |
|
135 |
+ // cancel time callback request |
|
136 |
+ m_mgrs.m_callMgr.cancelTimeCall(this); |
|
137 |
+} |
|
138 |
+ |
|
139 |
+/// start ball |
|
140 |
+void Pong::startBall() |
|
141 |
+{ |
|
142 |
+ // ball starts horizontally at middle of field, vertically random |
|
143 |
+ m_ballPosX = (m_width - (rand() & 1)) / 2; |
|
144 |
+ m_ballPosY = rand() % m_height; |
|
145 |
+ // random diagonal direction |
|
146 |
+ m_ballDirX = (rand() & 1) * 2 - 1; |
|
147 |
+ m_ballDirY = (rand() & 1) * 2 - 1; |
|
148 |
+ |
|
149 |
+ // request first time call |
|
150 |
+ Time stepTime; |
|
151 |
+ stepTime.fromMs(100); |
|
152 |
+ m_mgrs.m_callMgr.requestTimeCall(this, Time::now() + stepTime); |
|
153 |
+} |
|
154 |
+ |
|
77 | 155 |
} // namespace Blinker |
78 | 156 |
|
... | ... |
@@ -20,11 +20,13 @@ |
20 | 20 |
#include "Mgrs.h" |
21 | 21 |
#include "Module.h" |
22 | 22 |
#include "OutStreamFile.h" |
23 |
+#include "Time.h" |
|
24 |
+#include "TimeCallee.h" |
|
23 | 25 |
|
24 | 26 |
namespace Blinker { |
25 | 27 |
|
26 | 28 |
/// pong game |
27 |
-class Pong: public Game |
|
29 |
+class Pong: public Game, public TimeCallee |
|
28 | 30 |
{ |
29 | 31 |
public: |
30 | 32 |
/** |
... | ... |
@@ -56,9 +58,24 @@ protected: |
56 | 58 |
/// redraw current game image, expected to call sendFrame() at end |
57 | 59 |
virtual void redraw(); |
58 | 60 |
|
61 |
+ /// callback when requested time reached |
|
62 |
+ virtual void timeCall(); |
|
63 |
+ |
|
64 |
+ /// move ball out of the field and halt it |
|
65 |
+ void hideBall(); |
|
66 |
+ |
|
67 |
+ /// start ball |
|
68 |
+ void startBall(); |
|
69 |
+ |
|
59 | 70 |
protected: |
60 | 71 |
ColorFile m_fileBallColor; ///< color file for ball color |
72 |
+ ColorFile m_fileLineColor; ///< color file for center line |
|
61 | 73 |
ColorData m_ballColor; ///< ball color |
74 |
+ ColorData m_lineColor; ///< center line color |
|
75 |
+ int m_ballPosX; ///< ball position X |
|
76 |
+ int m_ballPosY; ///< ball position Y |
|
77 |
+ int m_ballDirX; ///< ball direction X |
|
78 |
+ int m_ballDirY; ///< ball direction Y |
|
62 | 79 |
}; // class Canvas |
63 | 80 |
|
64 | 81 |
} // namespace Blinker |
... | ... |
@@ -4,7 +4,9 @@ |
4 | 4 |
a blinkenarea.org project */ |
5 | 5 |
|
6 | 6 |
#include <iostream> |
7 |
+#include <stdlib.h> |
|
7 | 8 |
#include <string> |
9 |
+#include <time.h> |
|
8 | 10 |
|
9 | 11 |
#include "Canvas.h" |
10 | 12 |
#include "Directory.h" |
... | ... |
@@ -95,6 +97,7 @@ int main(int argc, const char *argv[]) |
95 | 97 |
} |
96 | 98 |
dirConfig = argv[1]; |
97 | 99 |
|
100 |
+ srand(time(NULL)); |
|
98 | 101 |
PlatformInit pfInit; |
99 | 102 |
|
100 | 103 |
run(dirConfig); |
101 | 104 |