Stefan Schuermans commited on 2019-06-10 16:51:39
Showing 3 changed files, with 60 additions and 5 deletions.
| ... | ... |
@@ -0,0 +1 @@ |
| 1 |
+C0C0C0 |
| ... | ... |
@@ -32,8 +32,10 @@ Pong::Pong(const std::string &name, Mgrs &mgrs, const Directory &dirBase): |
| 32 | 32 |
Game(name, mgrs, dirBase), |
| 33 | 33 |
m_fileBallColor(dirBase.getFile("ballColor")),
|
| 34 | 34 |
m_fileLineColor(dirBase.getFile("lineColor")),
|
| 35 |
- m_ballColor(), m_lineColor(), |
|
| 36 |
- m_ballPosX(-1), m_ballPosY(-1), m_ballDirX(0), m_ballDirY(0) |
|
| 35 |
+ m_filePadColor(dirBase.getFile("padColor")),
|
|
| 36 |
+ m_ballColor(), m_lineColor(), m_padColor(), |
|
| 37 |
+ m_ballPosX(-1), m_ballPosY(-1), m_ballDirX(0), m_ballDirY(0), |
|
| 38 |
+ m_padSize(0), m_leftPosY(0), m_rightPosY(0) |
|
| 37 | 39 |
{
|
| 38 | 40 |
// FIXME: activate at begin for initial development only |
| 39 | 41 |
activate(); |
| ... | ... |
@@ -53,7 +55,8 @@ bool Pong::updateConfigGame() |
| 53 | 55 |
|
| 54 | 56 |
// color file was modified -> convert color, return true for update |
| 55 | 57 |
if (colorUpdate(m_fileBallColor, m_ballColor) || |
| 56 |
- colorUpdate(m_fileLineColor, m_lineColor)) {
|
|
| 58 |
+ colorUpdate(m_fileLineColor, m_lineColor) || |
|
| 59 |
+ colorUpdate(m_filePadColor, m_padColor)) {
|
|
| 57 | 60 |
ret = true; |
| 58 | 61 |
} |
| 59 | 62 |
|
| ... | ... |
@@ -63,11 +66,15 @@ bool Pong::updateConfigGame() |
| 63 | 66 |
/// re-initialize game (e.g. due to config change) |
| 64 | 67 |
void Pong::reinitialize() |
| 65 | 68 |
{
|
| 66 |
- // TODO |
|
| 69 |
+ // compute parameters |
|
| 70 |
+ m_padSize = (m_height + 1) / 3; |
|
| 71 |
+ m_leftPosY = (m_height - m_padSize) / 2; |
|
| 72 |
+ m_rightPosY = (m_height - m_padSize) / 2; |
|
| 67 | 73 |
|
| 68 | 74 |
// convert colors |
| 69 | 75 |
color2data(m_fileBallColor, m_ballColor); |
| 70 | 76 |
color2data(m_fileLineColor, m_lineColor); |
| 77 |
+ color2data(m_filePadColor, m_padColor); |
|
| 71 | 78 |
|
| 72 | 79 |
// FIXME: start ball for development |
| 73 | 80 |
startBall(); |
| ... | ... |
@@ -87,6 +94,10 @@ void Pong::redraw() |
| 87 | 94 |
pixel(y, x, m_lineColor); |
| 88 | 95 |
} |
| 89 | 96 |
|
| 97 |
+ // draw pads |
|
| 98 |
+ lineVert(m_leftPosY, m_leftPosY + m_padSize - 1, 0, m_padColor); |
|
| 99 |
+ lineVert(m_rightPosY, m_rightPosY + m_padSize - 1, m_width - 1, m_padColor); |
|
| 100 |
+ |
|
| 90 | 101 |
// draw ball |
| 91 | 102 |
pixel(m_ballPosY, m_ballPosX, m_ballColor); |
| 92 | 103 |
|
| ... | ... |
@@ -97,7 +108,7 @@ void Pong::redraw() |
| 97 | 108 |
/// callback when requested time reached |
| 98 | 109 |
void Pong::timeCall() |
| 99 | 110 |
{
|
| 100 |
- // bounce ball |
|
| 111 |
+ // bounce ball at sides |
|
| 101 | 112 |
if (m_ballPosY <= 0 && m_ballDirY < 0) {
|
| 102 | 113 |
m_ballDirY = 1; |
| 103 | 114 |
} |
| ... | ... |
@@ -111,6 +122,44 @@ void Pong::timeCall() |
| 111 | 122 |
m_ballDirX = -1; |
| 112 | 123 |
} |
| 113 | 124 |
|
| 125 |
+ // bounce ball at left player |
|
| 126 |
+ if (m_ballPosX == 1 && m_ballDirX < 0) {
|
|
| 127 |
+ // top corner |
|
| 128 |
+ if (m_ballPosY == m_leftPosY - 1 && m_ballDirY > 0) {
|
|
| 129 |
+ m_ballDirX = 1; |
|
| 130 |
+ m_ballDirY = -1; |
|
| 131 |
+ } |
|
| 132 |
+ // bottom corner |
|
| 133 |
+ else if (m_ballPosY == m_leftPosY + m_padSize && m_ballDirY < 0) {
|
|
| 134 |
+ m_ballDirX = 1; |
|
| 135 |
+ m_ballDirY = 1; |
|
| 136 |
+ } |
|
| 137 |
+ // pad edge |
|
| 138 |
+ else if (m_ballPosY >= m_leftPosY && |
|
| 139 |
+ m_ballPosY < m_leftPosY + m_padSize) {
|
|
| 140 |
+ m_ballDirX = 1; |
|
| 141 |
+ } |
|
| 142 |
+ } |
|
| 143 |
+ |
|
| 144 |
+ // bounce ball at right player |
|
| 145 |
+ if (m_ballPosX == m_width - 2 && m_ballDirX > 0) {
|
|
| 146 |
+ // top corner |
|
| 147 |
+ if (m_ballPosY == m_rightPosY - 1 && m_ballDirY > 0) {
|
|
| 148 |
+ m_ballDirX = -1; |
|
| 149 |
+ m_ballDirY = -1; |
|
| 150 |
+ } |
|
| 151 |
+ // bottom corner |
|
| 152 |
+ else if (m_ballPosY == m_rightPosY + m_padSize && m_ballDirY < 0) {
|
|
| 153 |
+ m_ballDirX = -1; |
|
| 154 |
+ m_ballDirY = 1; |
|
| 155 |
+ } |
|
| 156 |
+ // pad edge |
|
| 157 |
+ else if (m_ballPosY >= m_rightPosY && |
|
| 158 |
+ m_ballPosY < m_rightPosY + m_padSize) {
|
|
| 159 |
+ m_ballDirX = -1; |
|
| 160 |
+ } |
|
| 161 |
+ } |
|
| 162 |
+ |
|
| 114 | 163 |
// move ball |
| 115 | 164 |
m_ballPosX += m_ballDirX; |
| 116 | 165 |
m_ballPosY += m_ballDirY; |
| ... | ... |
@@ -70,12 +70,17 @@ protected: |
| 70 | 70 |
protected: |
| 71 | 71 |
ColorFile m_fileBallColor; ///< color file for ball color |
| 72 | 72 |
ColorFile m_fileLineColor; ///< color file for center line |
| 73 |
+ ColorFile m_filePadColor; ///< color file for player pad |
|
| 73 | 74 |
ColorData m_ballColor; ///< ball color |
| 74 | 75 |
ColorData m_lineColor; ///< center line color |
| 76 |
+ ColorData m_padColor; ///< player pad color |
|
| 75 | 77 |
int m_ballPosX; ///< ball position X |
| 76 | 78 |
int m_ballPosY; ///< ball position Y |
| 77 | 79 |
int m_ballDirX; ///< ball direction X |
| 78 | 80 |
int m_ballDirY; ///< ball direction Y |
| 81 |
+ int m_padSize; ///< size of player pads |
|
| 82 |
+ int m_leftPosY; ///< position of top pixel of left pad |
|
| 83 |
+ int m_rightPosY; ///< position of top pixel of left pad |
|
| 79 | 84 |
}; // class Canvas |
| 80 | 85 |
|
| 81 | 86 |
} // namespace Blinker |
| 82 | 87 |