From 54b9eb14f0af4b6963310340789ba22393b46eb2 Mon Sep 17 00:00:00 2001 From: Joe Date: Sun, 10 Dec 2017 20:24:28 +0000 Subject: [PATCH] Modified paddle to move in non-integer steps, created a ball with a function for updating based off of position relative to walls and paddle plus function to draw the ball --- breakout/breakout.c | 66 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 61 insertions(+), 5 deletions(-) diff --git a/breakout/breakout.c b/breakout/breakout.c index 156aeae..0bc1736 100644 --- a/breakout/breakout.c +++ b/breakout/breakout.c @@ -17,8 +17,11 @@ typedef struct colour { double a; } colour; +void updateBall(double *ballX, double *ballY, double *ballVX, double *ballVY, double paddleX, int paddleWidth, int winWidth, int winHeight); + +void drawPaddle(double paddleX, int paddleWidth, int paddleHeight, colour *c); +void drawBall(double ballX, double ballY, colour *c); void drawBg(int winWidth, int winHeight, colour *c1, colour *c2); -void drawPaddle(int paddleX, int paddleWidth, int paddleHeight, colour *c); int main(void) { @@ -121,7 +124,11 @@ int main(void) { char moveX=0; int paddleWidth=50; - int paddleX=(winWidth/2)-(paddleWidth/2); + double paddleX=(winWidth/2)-(paddleWidth/2); + double ballX = 0; + double ballY = 0; + double ballVX = 0.2; + double ballVY = -0.3; /* * ---------------- @@ -170,7 +177,11 @@ int main(void) { } } - paddleX+=moveX*1; + paddleX += moveX*0.1; + + updateBall(&ballX, &ballY, &ballVX, &ballVY, paddleX, paddleWidth, winWidth, winHeight); + ballX += ballVX*0.1; + ballY += ballVY*0.1; /* * ---------------- @@ -197,6 +208,7 @@ int main(void) { bgcol1.a = 1.0000; /*255*/ bgcol2.a = 1.0000; /*255*/ drawPaddle(paddleX, paddleWidth, winWidth, winHeight, &paddleCol); + drawBall(ballX, ballY, &paddleCol); drawBg(winWidth, winHeight, &bgcol1, &bgcol2); glFlush(); @@ -221,6 +233,32 @@ int main(void) { return 0; } +void updateBall(double *ballX, double *ballY, double *ballVX, double *ballVY, double paddleX, int paddleWidth, int winWidth, int winHeight) { + double ballNX = *ballX + *ballVX; + double ballNY = *ballY + *ballVY; + double paddleRX = paddleX - (double)(winWidth / 2); + double paddleRY = 20 - (double)(winHeight / 2); + + if (ballNX > paddleRX && ballNY winWidth / 2 || ballNX < (-1.0*winWidth/2)) { + *ballVX *= -1.0; + } + if (ballNY > winHeight / 2) { + *ballVY *= -1.0; + } + if (ballNY < (-1.0*winHeight/2)) { + *ballX = 0; + *ballY = 0; + *ballVX = -0.1; + *ballVY = -0.5; + } +} + void drawBg(int winWidth, int winHeight, colour *c1, colour *c2) { GLint matrixmode = 0; glGetIntegerv(GL_MATRIX_MODE, &matrixmode); @@ -239,14 +277,14 @@ void drawBg(int winWidth, int winHeight, colour *c1, colour *c2) { glEnd(); } -void drawPaddle(int paddleX, int paddleWidth, int winWidth, int winHeight, colour *c) { +void drawPaddle(double paddleX, int paddleWidth, int winWidth, int winHeight, colour *c) { GLint matrixmode = 0; glGetIntegerv(GL_MATRIX_MODE, &matrixmode); glPushMatrix(); glTranslated((GLdouble)(paddleX)-winWidth/2, (GLdouble)(20-winHeight/2), 0.0); glBegin(GL_QUADS); - glColor3f(c->r, c->g, c->b); //#666666 + glColor3f(c->r, c->g, c->b); glVertex3d(0.0, 0.0, 0.0); glVertex3d(0.0, 10.0, 0.0); glVertex3d((double)paddleWidth, 10.0, 0.0); @@ -256,3 +294,21 @@ void drawPaddle(int paddleX, int paddleWidth, int winWidth, int winHeight, colou glPopMatrix(); glMatrixMode(matrixmode); } + +void drawBall(double ballX, double ballY, colour *c) { + GLint matrixmode = 0; + glGetIntegerv(GL_MATRIX_MODE, &matrixmode); + glPushMatrix(); + glTranslated(ballX, ballY, 0.0); + + glBegin(GL_QUADS); + glColor3f(c->r, c->g, c->b); + glVertex3d(0.0, 0.0, 0.0); + glVertex3d(0.0, 8.0, 0.0); + glVertex3d(8.0, 8.0, 0.0); + glVertex3d(8.0, 0.0, 0.0); + glEnd(); + + glPopMatrix(); + glMatrixMode(matrixmode); +}