Parent Directory
|
Revision Log
Initial import
// main.c
// Jeremy Grosser
// OpenGL libraries
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#include <GLUT/glut.h>
// System libraries
#include <stdio.h>
#include <stdlib.h>
// Macros
#define PUCK_WIDTH 2.0
#define PUCK_HEIGHT 2.0
#define PADDLE_WIDTH 3.0
#define PADDLE_HEIGHT 16.0
#define PADDLE_SPEED 2.5
#define PUCK_SPEED 2.0
// Globals
GLfloat puck_xloc;
GLfloat puck_yloc;
GLfloat xinc;
GLfloat yinc;
GLfloat paddle1_yloc;
GLfloat paddle2_yloc;
// Prototypes
void drawGL();
void resizeGL();
void idleGL();
void keyGL(unsigned char key, int x, int y);
void initGame();
int main(int argc, char* argv[])
{
// Setup GLUT window
fprintf(stderr, "Initializing GLUT window context\n");
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(400, 400);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
// Any OpenGL init code goes here
fprintf(stderr, "Initializing OpenGL state\n");
glClearColor(0.0, 0.0, 0.0, 0.0);
glColor3f(1.0, 1.0, 1.0);
glShadeModel(GL_FLAT);
// Setup game init parameters
fprintf(stderr, "Initializing Game state\n");
initGame();
// Run GLUT window
fprintf(stderr, "Initializing callbacks and entering main loop\n");
glutDisplayFunc(drawGL);
glutReshapeFunc(resizeGL);
glutIdleFunc(idleGL);
glutKeyboardFunc(keyGL);
glutMainLoop();
return 0;
}
void initGame()
{
puck_xloc = 0.0;
puck_yloc = 0.0;
xinc = PUCK_SPEED;
yinc = 0.5;
paddle1_yloc = 0.0;
paddle2_yloc = 0.0;
}
void keyGL(unsigned char key, int x, int y)
{
if(key == 'q')
paddle1_yloc += PADDLE_SPEED;
if(key == 'a')
paddle1_yloc -= PADDLE_SPEED;
if(key == 'w')
paddle2_yloc += PADDLE_SPEED;
if(key == 's')
paddle2_yloc -= PADDLE_SPEED;
if(paddle1_yloc < -50.0)
paddle1_yloc = -50.0;
if(paddle1_yloc > 50.0 - PADDLE_HEIGHT)
paddle1_yloc = 50.0 - PADDLE_HEIGHT;
if(paddle2_yloc < -50.0)
paddle2_yloc = -50.0;
if(paddle2_yloc > 50.0 - PADDLE_HEIGHT)
paddle2_yloc = 50.0 - PADDLE_HEIGHT;
}
void idleGL()
{
// Collisions on y axis
if(puck_yloc >= 50.0 - PUCK_HEIGHT - PADDLE_WIDTH)
yinc = -PUCK_SPEED;
if(puck_yloc <= -50.0)
yinc = PUCK_SPEED;
// Collisions on x axis (paddles)
if(puck_xloc >= 50.0 - PUCK_WIDTH - PADDLE_WIDTH) {
if(puck_yloc >= paddle2_yloc && puck_yloc <= paddle2_yloc + PADDLE_HEIGHT) {
xinc = -PUCK_SPEED;
}else{
fprintf(stderr, "PLAYER 1 WINS!\n");
initGame();
}
}
if(puck_xloc <= -50.0 + PADDLE_WIDTH) {
if(puck_yloc >= paddle1_yloc && puck_yloc <= paddle1_yloc + PADDLE_HEIGHT) {
xinc = PUCK_SPEED;
}else{
fprintf(stderr, "PLAYER 2 WINS!\n");
initGame();
}
}
puck_xloc += xinc;
puck_yloc += yinc;
// Attempt some semblance of AI
if(puck_yloc > paddle1_yloc && paddle1_yloc + PADDLE_HEIGHT <= 50.0)
paddle1_yloc += PADDLE_SPEED;
if(puck_yloc < paddle1_yloc)
paddle1_yloc -= PADDLE_SPEED;
/* // TESTING ONLY
if(puck_yloc > paddle2_yloc && paddle2_yloc + PADDLE_HEIGHT <= 50.0)
paddle2_yloc += PADDLE_SPEED;
if(puck_yloc < paddle2_yloc)
paddle2_yloc -= PADDLE_SPEED;
*/
// Request a redraw
usleep(30000);
drawGL();
}
void drawGL()
{
// Clear the window background
glClear(GL_COLOR_BUFFER_BIT);
// Move the puck
glPushMatrix();
glTranslatef(puck_xloc, puck_yloc, 1.0);
glRectf(0.0, 0.0, PUCK_WIDTH, PUCK_HEIGHT);
glPopMatrix();
// Draw the paddles
glRectf(-50.0, paddle1_yloc, PADDLE_WIDTH - 50.0, paddle1_yloc + PADDLE_HEIGHT);
glRectf(50.0 - PADDLE_WIDTH, paddle2_yloc, PADDLE_WIDTH + 50.0, paddle2_yloc + PADDLE_HEIGHT);
glFlush();
glutSwapBuffers();
}
void resizeGL(GLsizei width, GLsizei height)
{
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(width <= height) {
glOrtho(-50.0, 50.0, -50.0 * (GLfloat)height/(GLfloat)width, 50.0 * (GLfloat)height/(GLfloat)width, -1.0, 1.0);
}else{
glOrtho(-50.0 * (GLfloat)width/(GLfloat)height, 50.0 * (GLfloat)width/(GLfloat)height, -50.0, 50.0, -1.0, 1.0);
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}| synack at csh.rit.edu | ViewVC Help |
| Powered by ViewVC 1.0.0 |