summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--glpong3d.c158
-rw-r--r--glpong3d.h16
2 files changed, 89 insertions, 85 deletions
diff --git a/glpong3d.c b/glpong3d.c
index 1c76beb..d6b2ed1 100644
--- a/glpong3d.c
+++ b/glpong3d.c
@@ -16,6 +16,7 @@ static int GLPong_HandleEvents(void);
static void GLPong_Draw(void);
static void GLPong_CleanUp(void);
static void GLPong_Move(void);
+static void SDL_GL_GetMouseState(Paddle_t * paddle);
GLuint box;
@@ -43,6 +44,7 @@ int main(int argc, char * argv[]) {
break;
}
+ SDL_GL_GetMouseState(&GLPong.Front);
GLPong_Move();
/* begin drawing */
@@ -73,9 +75,9 @@ GLPong_Init(GLPong_t * GLPong) {
GLPong->Ball.w = 0.5f;
GLPong->Ball.h = 0.5f;
- GLPong->Ball.x = -(GLPong->Ball.w / 2);
- GLPong->Ball.y = -(GLPong->Ball.h / 2);
- GLPong->Ball.z = -3.0f;
+ GLPong->Ball.coord.x = -(GLPong->Ball.w / 2);
+ GLPong->Ball.coord.y = -(GLPong->Ball.h / 2);
+ GLPong->Ball.coord.z = -3.0f;
GLPong->Ball.r = 1.0f;
GLPong->Ball.g = 0.0f;
GLPong->Ball.b = 0.0f;
@@ -85,18 +87,18 @@ GLPong_Init(GLPong_t * GLPong) {
GLPong->Front.w = 0.66f;
GLPong->Front.h = 0.5f;
- GLPong->Front.x = -1.0f;
- GLPong->Front.y = -1.0f;
- GLPong->Front.z = -3.0f;
+ GLPong->Front.coord.x = -1.0f;
+ GLPong->Front.coord.y = -1.0f;
+ GLPong->Front.coord.z = -3.0f;
GLPong->Front.r = 1.0f;
GLPong->Front.g = 1.0f;
GLPong->Front.b = 1.0f;
GLPong->Back.w = 0.66f;
GLPong->Back.h = 0.5f;
- GLPong->Back.x = -(GLPong->Front.w / 2);
- GLPong->Back.y = -(GLPong->Front.h / 2);
- GLPong->Back.z = -9.0f;
+ GLPong->Back.coord.x = -(GLPong->Front.w / 2);
+ GLPong->Back.coord.y = -(GLPong->Front.h / 2);
+ GLPong->Back.coord.z = -9.0f;
GLPong->Back.r = 1.0f;
GLPong->Back.g = 1.0f;
GLPong->Back.b = 1.0f;
@@ -108,7 +110,7 @@ GLPong_Init(GLPong_t * GLPong) {
atexit(SDL_Quit);
SDL_WM_SetCaption("glpong3d", "glpong3d");
- SDL_ShowCursor(SDL_DISABLE);
+/* SDL_ShowCursor(SDL_DISABLE);*/
temp = IMG_Load("ball.png");
if (!temp) {
@@ -186,8 +188,6 @@ GLPong_Init(GLPong_t * GLPong) {
static int
GLPong_HandleEvents(void) {
SDL_Event Event;
- Uint8 * key;
- int x = 0, y = 0;
if (SDL_PollEvent(&Event) != 0) {
if (Event.type == SDL_QUIT) {
@@ -215,59 +215,38 @@ GLPong_HandleEvents(void) {
}
}
- key = SDL_GetKeyState(NULL);
- SDL_GetMouseState(&x, &y);
-
- GLPong.Mouse.x = ((float) x / GLPONG_WIDTH) * 3.3f - 1.65f;
-
- if (GLPong.Mouse.x <= -1.5 + (GLPong.Front.w / 2)) {
- GLPong.Mouse.x = -1.5 + (GLPong.Front.w / 2);
- } else if (GLPong.Mouse.x >= 1.5 - (GLPong.Front.w / 2)) {
- GLPong.Mouse.x = 1.5 - (GLPong.Front.w / 2);
- }
-
- GLPong.Mouse.y = ((float) y / GLPONG_HEIGHT) * 2.5f - 1.25f;
-
- if (GLPong.Mouse.y <= -1.0 + (GLPong.Front.h / 2)) {
- GLPong.Mouse.y = -1.0 + (GLPong.Front.h / 2);
- } else if (GLPong.Mouse.y >= 1.0 - (GLPong.Front.h / 2)) {
- GLPong.Mouse.y = 1.0 - (GLPong.Front.h / 2);
- }
- GLPong.Front.x = GLPong.Mouse.x - GLPong.Front.w / 2;
- GLPong.Front.y = -(GLPong.Mouse.y + GLPong.Front.h / 2);
- /*printf("SDL x,y: %d,%d; OpenGL x,y: %f,%f\n", x, y, GLPong.Mouse.x, GLPong.Mouse.y);*/
return GLPONG_NOACTION;
}
void GLPong_Move(void) {
- GLPong.Ball.x += GLPong.Ball.xv;
- if (GLPong.Ball.x > 1.0f) {
- GLPong.Ball.x = 1.0f;
+ GLPong.Ball.coord.x += GLPong.Ball.xv;
+ if (GLPong.Ball.coord.x > 1.0f) {
+ GLPong.Ball.coord.x = 1.0f;
GLPong.Ball.xv = -GLPong.Ball.xv;
- } else if (GLPong.Ball.x + GLPong.Ball.w < -1.0f) {
- GLPong.Ball.x = -1.0f - GLPong.Ball.w;
+ } else if (GLPong.Ball.coord.x + GLPong.Ball.w < -1.0f) {
+ GLPong.Ball.coord.x = -1.0f - GLPong.Ball.w;
GLPong.Ball.xv = -GLPong.Ball.xv;
}
- GLPong.Ball.y += GLPong.Ball.yv;
- if (GLPong.Ball.y > 0.5f) {
- GLPong.Ball.y = 0.5f;
+ GLPong.Ball.coord.y += GLPong.Ball.yv;
+ if (GLPong.Ball.coord.y > 0.5f) {
+ GLPong.Ball.coord.y = 0.5f;
GLPong.Ball.yv = -GLPong.Ball.yv;
- } else if (GLPong.Ball.y + GLPong.Ball.h < -0.5f) {
- GLPong.Ball.y = -0.5f - GLPong.Ball.h;
+ } else if (GLPong.Ball.coord.y + GLPong.Ball.h < -0.5f) {
+ GLPong.Ball.coord.y = -0.5f - GLPong.Ball.h;
GLPong.Ball.yv = -GLPong.Ball.yv;
}
- GLPong.Ball.z += GLPong.Ball.zv;
- if (GLPong.Ball.z < -9.0f) {
- GLPong.Ball.z = -9.0f;
+ GLPong.Ball.coord.z += GLPong.Ball.zv;
+ if (GLPong.Ball.coord.z < -9.0f) {
+ GLPong.Ball.coord.z = -9.0f;
GLPong.Ball.zv = -GLPong.Ball.zv;
- } else if (GLPong.Ball.z > -3.0f) {
- GLPong.Ball.z = -3.0f;
+ } else if (GLPong.Ball.coord.z > -3.0f) {
+ GLPong.Ball.coord.z = -3.0f;
GLPong.Ball.zv = -GLPong.Ball.zv;
}
- GLPong.Back.x = GLPong.Ball.x;
- GLPong.Back.y = GLPong.Ball.y;
+ GLPong.Back.coord.x = GLPong.Ball.coord.x;
+ GLPong.Back.coord.y = GLPong.Ball.coord.y;
GLPong_Collide(&GLPong.Ball, &GLPong.Front);
}
@@ -339,7 +318,7 @@ void GLPong_Draw(void) {
glBindTexture(GL_TEXTURE_2D, paddle_texture);
glEnable(GL_TEXTURE_2D);
glColor3f(GLPong.Back.r, GLPong.Back.g, GLPong.Back.b);
- glTranslatef(GLPong.Back.x, GLPong.Back.y, GLPong.Back.z);
+ glTranslatef(GLPong.Back.coord.x, GLPong.Back.coord.y, GLPong.Back.coord.z);
glBegin(GL_QUADS);
glTexCoord2f(0.832f, 1.0f); glVertex2f(GLPong.Back.w / 2, GLPong.Back.h / 2); /* Upper Right */
glTexCoord2f(0.168f, 1.0f); glVertex2f(-GLPong.Back.w / 2, GLPong.Back.h / 2); /* Upper Left */
@@ -350,7 +329,7 @@ void GLPong_Draw(void) {
glLoadIdentity();
glColor3f(1.0f, 0.0f, 0.0f);
- glTranslatef(GLPong.Back.x, GLPong.Back.y, GLPong.Back.z);
+ glTranslatef(GLPong.Back.coord.x, GLPong.Back.coord.y, GLPong.Back.coord.z);
glBegin(GL_POINTS);
glVertex3f(0.0f, 0.0f, 0.0f);
glEnd();
@@ -359,7 +338,7 @@ void GLPong_Draw(void) {
glBindTexture(GL_TEXTURE_2D, ball_texture);
glEnable(GL_TEXTURE_2D);
glColor3f(GLPong.Ball.r, GLPong.Ball.g, GLPong.Ball.b);
- glTranslatef(GLPong.Ball.x, GLPong.Ball.y, GLPong.Ball.z);
+ glTranslatef(GLPong.Ball.coord.x, GLPong.Ball.coord.y, GLPong.Ball.coord.z);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex2f(GLPong.Ball.w, GLPong.Ball.h); /* Lower Left */
glTexCoord2f(1.0f, 1.0f); glVertex2f(0.0f, GLPong.Ball.h); /* Lower Right */
@@ -371,40 +350,40 @@ void GLPong_Draw(void) {
/* Lower Left */
glLoadIdentity();
glColor3f(1.0f, 0.0f, 0.0f);
- glTranslatef(GLPong.Ball.x, GLPong.Ball.y, GLPong.Ball.z);
+ glTranslatef(GLPong.Ball.coord.x, GLPong.Ball.coord.y, GLPong.Ball.coord.z);
glBegin(GL_POINTS);
glVertex3f(0.0f, 0.0f, 0.0f);
glEnd();
/* Lower Right */
glLoadIdentity();
- glTranslatef(GLPong.Ball.x + GLPong.Ball.w, GLPong.Ball.y, GLPong.Ball.z);
+ glTranslatef(GLPong.Ball.coord.x + GLPong.Ball.w, GLPong.Ball.coord.y, GLPong.Ball.coord.z);
glBegin(GL_POINTS);
glVertex3f(0.0f, 0.0f, 0.0f);
glEnd();
/* Top Right */
glLoadIdentity();
- glTranslatef(GLPong.Ball.x + GLPong.Ball.w, GLPong.Ball.y + GLPong.Ball.h, GLPong.Ball.z);
+ glTranslatef(GLPong.Ball.coord.x + GLPong.Ball.w, GLPong.Ball.coord.y + GLPong.Ball.h, GLPong.Ball.coord.z);
glBegin(GL_POINTS);
glVertex3f(0.0f, 0.0f, 0.0f);
glEnd();
/* Top Left */
glLoadIdentity();
- glTranslatef(GLPong.Ball.x, GLPong.Ball.y + GLPong.Ball.h, GLPong.Ball.z);
+ glTranslatef(GLPong.Ball.coord.x, GLPong.Ball.coord.y + GLPong.Ball.h, GLPong.Ball.coord.z);
glBegin(GL_POINTS);
glVertex3f(0.0f, 0.0f, 0.0f);
glEnd();
glLoadIdentity();
- glTranslatef(0.0f, 0.0f, GLPong.Ball.z);
+ glTranslatef(0.0f, 0.0f, GLPong.Ball.coord.z);
glCallList(box);
glLoadIdentity();
glBindTexture(GL_TEXTURE_2D, paddle_texture);
glEnable(GL_TEXTURE_2D);
glColor3f(GLPong.Front.r, GLPong.Front.g, GLPong.Front.b);
- glTranslatef(GLPong.Front.x + (GLPong.Front.w / 2), GLPong.Front.y + (GLPong.Front.h / 2), GLPong.Front.z);
+ glTranslatef(GLPong.Front.coord.x + (GLPong.Front.w / 2), GLPong.Front.coord.y + (GLPong.Front.h / 2), GLPong.Front.coord.z);
glBegin(GL_QUADS);
glTexCoord2f(0.168f, 1.0f); glVertex2f(GLPong.Front.w / 2, GLPong.Front.h / 2); /* Upper Right */
glTexCoord2f(0.832f, 1.0f); glVertex2f(-GLPong.Front.w / 2, GLPong.Front.h / 2); /* Upper Left */
@@ -413,55 +392,47 @@ void GLPong_Draw(void) {
glEnd();
glDisable(GL_TEXTURE_2D);
- /* Mouse Pointer */
- glLoadIdentity();
- glColor3f(1.0f, 1.0f, 0.0f);
- glTranslatef(GLPong.Mouse.x, -GLPong.Mouse.y, GLPong.Front.z);
- glBegin(GL_POINTS);
- glVertex3f(0.0f, 0.0f, 0.0f);
- glEnd();
-
/* Lower Left */
glLoadIdentity();
glColor3f(1.0f, 0.0f, 0.0f);
- glTranslatef(GLPong.Front.x, GLPong.Front.y, GLPong.Front.z);
+ glTranslatef(GLPong.Front.coord.x, GLPong.Front.coord.y, GLPong.Front.coord.z);
glBegin(GL_POINTS);
glVertex3f(0.0f, 0.0f, 0.0f);
glEnd();
/* Lower Right */
glLoadIdentity();
- glTranslatef(GLPong.Front.x + GLPong.Front.w, GLPong.Front.y, GLPong.Front.z);
+ glTranslatef(GLPong.Front.coord.x + GLPong.Front.w, GLPong.Front.coord.y, GLPong.Front.coord.z);
glBegin(GL_POINTS);
glVertex3f(0.0f, 0.0f, 0.0f);
glEnd();
/* Top Right */
glLoadIdentity();
- glTranslatef(GLPong.Front.x + GLPong.Front.w, GLPong.Front.y + GLPong.Front.h, GLPong.Front.z);
+ glTranslatef(GLPong.Front.coord.x + GLPong.Front.w, GLPong.Front.coord.y + GLPong.Front.h, GLPong.Front.coord.z);
glBegin(GL_POINTS);
glVertex3f(0.0f, 0.0f, 0.0f);
glEnd();
/* Top Left */
glLoadIdentity();
- glTranslatef(GLPong.Front.x, GLPong.Front.y + GLPong.Front.h, GLPong.Front.z);
+ glTranslatef(GLPong.Front.coord.x, GLPong.Front.coord.y + GLPong.Front.h, GLPong.Front.coord.z);
glBegin(GL_POINTS);
glVertex3f(0.0f, 0.0f, 0.0f);
glEnd();
}
void GLPong_Collide(Ball_t * ball, const Paddle_t * paddle) {
- if (ball->z == paddle->z) {
- if (ball->x + ball->w < paddle->x) return; /* if ball is left of paddle */
- if (ball->x > paddle->x + paddle->w) return; /* if ball is right of paddle */
- if (ball->y > paddle->y + paddle->h) return; /* if ball is above paddle */
- if (ball->y + ball->h < paddle->y) return; /* if ball is below paddle */
+ if (ball->coord.z == paddle->coord.z) {
+ if (ball->coord.x + ball->w < paddle->coord.x) return; /* if ball is left of paddle */
+ if (ball->coord.x > paddle->coord.x + paddle->w) return; /* if ball is right of paddle */
+ if (ball->coord.y > paddle->coord.y + paddle->h) return; /* if ball is above paddle */
+ if (ball->coord.y + ball->h < paddle->coord.y) return; /* if ball is below paddle */
if (ball->zv < 0) {
ball->zv -= 0.005f;
} else {
ball->zv += 0.005f;
}
- printf("x: %.3f, y: %.2f, z: %.2f\n", ball->x, ball->y, ball->z);
+ printf("x: %.3f, y: %.2f, z: %.2f\n", ball->coord.x, ball->coord.y, ball->coord.z);
}
}
@@ -535,3 +506,36 @@ GLuint SDL_GL_SurfaceToTexture(SDL_Surface * surface) {
return texture;
}
+
+static void
+SDL_GL_GetMouseState(Paddle_t * paddle) {
+ int x, y;
+ float temp_x, temp_y;
+ Uint8 * key;
+
+ key = SDL_GetKeyState(NULL);
+ SDL_GetMouseState(&x, &y);
+
+ temp_x = ((float) x / GLPONG_WIDTH) * 3.3f - 1.65f;
+
+ if (temp_x <= -1.5 + (paddle->w / 2)) {
+ temp_x = -1.5 + (paddle->w / 2);
+ } else if (temp_x >= 1.5 - (paddle->w / 2)) {
+ temp_x = 1.5 - (paddle->w / 2);
+ }
+
+ temp_y = ((float) y / GLPONG_HEIGHT) * 2.5f - 1.25f;
+
+ if (temp_y <= -1.0 + (paddle->h / 2)) {
+ temp_y = -1.0 + (paddle->h / 2);
+ } else if (temp_y >= 1.0 - (paddle->h / 2)) {
+ temp_y = 1.0 - (paddle->h / 2);
+ }
+
+ paddle->coord.x = temp_x - paddle->w / 2;
+ paddle->coord.y = -(temp_y + paddle->h / 2);
+
+#ifdef DEBUG
+ printf("SDL (x, y): (%d, %d)\tGL (x, y, z): (%.3f, %.3f)\n", x, y, paddle->coord.x, paddle->coord.y);
+#endif
+}
diff --git a/glpong3d.h b/glpong3d.h
index 55bab80..7dd0adf 100644
--- a/glpong3d.h
+++ b/glpong3d.h
@@ -27,28 +27,28 @@ GLuint paddle_texture_hit;
GLuint ball_texture;
typedef struct {
- GLfloat w, h, x, y, z;
+ GLfloat x, y, z;
+} Coord_t;
+
+typedef struct {
+ Coord_t coord;
+ GLfloat w, h;
GLfloat r, g, b;
} Paddle_t;
typedef struct {
- GLfloat w, h, x, y, z;
+ Coord_t coord;
+ GLfloat w, h;
GLfloat r, g, b;
GLfloat xv, yv, zv;
GLfloat rotate;
} Ball_t;
typedef struct {
- GLfloat x, y;
-} Mouse_t;
-
-typedef struct {
SDL_Surface * Surface;
Ball_t Ball;
Paddle_t Front;
Paddle_t Back;
- Mouse_t Mouse;
- GLfloat fps;
} GLPong_t;
GLPong_t GLPong;