[ponggl] / main.c Repository:
ViewVC logotype

View of /main.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (download) (annotate)
Sat Jun 24 15:55:46 2006 UTC (3 years, 5 months ago) by synack
File size: 4046 byte(s)
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