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

This commit is contained in:
Joe Adams 2017-12-10 20:24:28 +00:00
parent 2f7a81dd9f
commit 54b9eb14f0

View File

@ -17,8 +17,11 @@ typedef struct colour {
double a; double a;
} colour; } 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 drawBg(int winWidth, int winHeight, colour *c1, colour *c2);
void drawPaddle(int paddleX, int paddleWidth, int paddleHeight, colour *c);
int main(void) { int main(void) {
@ -121,7 +124,11 @@ int main(void) {
char moveX=0; char moveX=0;
int paddleWidth=50; 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*/ bgcol1.a = 1.0000; /*255*/ bgcol2.a = 1.0000; /*255*/
drawPaddle(paddleX, paddleWidth, winWidth, winHeight, &paddleCol); drawPaddle(paddleX, paddleWidth, winWidth, winHeight, &paddleCol);
drawBall(ballX, ballY, &paddleCol);
drawBg(winWidth, winHeight, &bgcol1, &bgcol2); drawBg(winWidth, winHeight, &bgcol1, &bgcol2);
glFlush(); glFlush();
@ -221,6 +233,32 @@ int main(void) {
return 0; 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<paddleRY) {
if (ballNX < paddleRX + paddleWidth) {
*ballVY *= -1.0;
}
}
if (ballNX > 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) { void drawBg(int winWidth, int winHeight, colour *c1, colour *c2) {
GLint matrixmode = 0; GLint matrixmode = 0;
glGetIntegerv(GL_MATRIX_MODE, &matrixmode); glGetIntegerv(GL_MATRIX_MODE, &matrixmode);
@ -239,14 +277,14 @@ void drawBg(int winWidth, int winHeight, colour *c1, colour *c2) {
glEnd(); 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; GLint matrixmode = 0;
glGetIntegerv(GL_MATRIX_MODE, &matrixmode); glGetIntegerv(GL_MATRIX_MODE, &matrixmode);
glPushMatrix(); glPushMatrix();
glTranslated((GLdouble)(paddleX)-winWidth/2, (GLdouble)(20-winHeight/2), 0.0); glTranslated((GLdouble)(paddleX)-winWidth/2, (GLdouble)(20-winHeight/2), 0.0);
glBegin(GL_QUADS); 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, 0.0, 0.0);
glVertex3d(0.0, 10.0, 0.0); glVertex3d(0.0, 10.0, 0.0);
glVertex3d((double)paddleWidth, 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(); glPopMatrix();
glMatrixMode(matrixmode); 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);
}