All pastes #2065257 Raw Edit

pong

public text v1 · immutable
#2065257 ·published 2011-05-20 05:42 UTC
rendered paste body
#include "GLUT/glut.h"
#include <stdlib.h>
#include <math.h>
#include <stdio.h>

static int lastFrameTime = 0, windowWidth = 0, windowHeight = 0, now = 0;
static float midWidth = 0, midHeight = 0;
static float elapsedTime = 0, elapsedMilliSeconds = 0;
static char player1Move = 0, player2Move = 0;
static float player1V = 0, player2V = 0;

static float PI = 3.14159265358979323846264;

//scores
static int player1Score = 0, player2Score = 0;

//the following variables calculate a random starting projectile trajectory
static float randomDirection;
static long longMax = 0x7fffffff;    //max of longs 2^31-1 (2^(n-1)-1 for 2′s complement) static float trajectory[2] = {0, 0};

static float projMove[2] = {0, 0};
static double trajectory[2] = {0, 0};
static char moveSpeed = 70;

void resetProjectile(void) {
	//set starting random trajectory
	randomDirection = 2 * PI * (float) random() / (float) 0x7fffffff;
	trajectory[0] = (float) cos(randomDirection);
	trajectory[1] = (float) sin(randomDirection);
	projMove[0] = midWidth;
	projMove[1] = midHeight;
}

void display(void)
{
	//get window parameters
	windowWidth = glutGet(GLUT_WINDOW_WIDTH);
	windowHeight = glutGet(GLUT_WINDOW_HEIGHT);
	
	midWidth = windowWidth/2;
	midHeight = windowHeight/2;
	
	//start timing code
	if (lastFrameTime == 0) {
		lastFrameTime = glutGet(GLUT_ELAPSED_TIME);
		resetProjectile();    //since this is the fist time, this is actually a set 
	}
	
	now = glutGet(GLUT_ELAPSED_TIME);
	//elapsedMilliSeconds = now - lastFrameTime;
	elapsedMilliSeconds = now - lastFrameTime;
	elapsedTime = elapsedMilliSeconds/1000.0f;
	lastFrameTime = now;
	
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glShadeModel(GL_FLAT);
	
	//calculate move distances
	switch (player1Move) {
		case 1:        //move up
			player1V += 150 * elapsedTime;
			break;
		case -1:    //move up
			player1V -= 150 * elapsedTime;
			break;
		default:    //do nothing
			break;
	}
	//check out of bounds
	if (player1V > (windowHeight/2)-50) {
		//bounce back
		player1Move = -1;
	}
	if (player1V < -(windowHeight/2)+50) {
		//bounce back other way
		player1Move = 1;
	}
	
	switch (player2Move) {
		case 1:        //move up
			player2V = 10;// += 150 * elapsedTime;
			break;
		case -1:    //move up
			player2V = -10;//-= 150 * elapsedTime;
			break;
		default:    //do nothing
			break;
	}
	//check out of bounds
	if (player2V > (windowHeight/2)-50) {
		//bounce back
		player2Move = -1;
	}
	if (player2V < -(windowHeight/2)+50) {
		//bounc back other way
		player2Move = 1;
	}
	
	//create and position player 1
	glPushMatrix();
	
	glColor3ub(255, 0, 0);    //red
	
	glTranslatef(0.0f, player1V, 0.0f);
	
	glBegin(GL_QUADS);
	glVertex2f(20.0f, (midHeight-50));
	glVertex2f(20.0f, (midHeight+50));
	glVertex2f(50.0f, (midHeight+50));
	glVertex2f(50.0f, (midHeight-50));
	glEnd();
	
	glPopMatrix();
	
	//create and position player 2
	glPushMatrix();
	
	glColor3ub(0, 0, 255);    //blue
	
	glTranslatef(0.0f, player2V, 0.0f);
	
	glBegin(GL_QUADS);
	glVertex2f(windowWidth-20.0f, (midHeight-50));
	glVertex2f(windowWidth-20.0f, (midHeight+50));
	glVertex2f(windowWidth-50.0f, (midHeight+50));
	glVertex2f(windowWidth-50.0f, (midHeight-50));
	glEnd();
	
	glPopMatrix();
	player2V =0;
	/***************************************
	 *    Projectile CODE!!!
	 *
	 ***************************************/
	
	//calculate move distances
	projMove[0] += moveSpeed * trajectory[0] * elapsedTime;
	projMove[1] += moveSpeed * trajectory[1] * elapsedTime;
	
	//create and move projectile
	glPushMatrix();
	
	glColor3ub(255, 255, 255);
	
	glTranslatef(projMove[0], projMove[1], 0.0f);
	
	glBegin(GL_QUADS);
	glVertex2f(-10, -10);
	glVertex2f(10, -10);
	glVertex2f(10, 10);
	glVertex2f(-10, 10);
	glEnd();
	
	glPopMatrix();
	
	//set bounds for projectile
	if (projMove[0] > (windowWidth)) {    //player 1 scored – out of bounds right
		player1Score++;
		//printf(“Player 1 Scored!  Score: %f “, player1Score);
//		printf(“projMove[0] %f projMove[1] %f “, projMove[0], projMove[1]);
		resetProjectile();
	}
	
	if (projMove[0] < (0)) {        //player 2 scored – out of bounds left
		player2Score++;
		resetProjectile();
	}
	
	if (projMove[1] > (windowHeight)) {    //out of bounds top
		resetProjectile();
	}
	
	if (projMove[1] < (0)) {    //out of bounds bottom
		resetProjectile();
	}
	
	//collision detection code
	
	/******************************
	 *  END PROJECTILE CODE
	 *
	 ******************************/
	
	glutSwapBuffers();
	
}

void reshape(int width, int height)
{
	glViewport(0, 0, width, height);
	
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0, width, 0, height);
	glMatrixMode(GL_MODELVIEW);
}

void idle(void)
{
	glutPostRedisplay();
}

void keyboard(unsigned char key, int x, int y) {
	switch (key) {
		case 'w':
			//do something
			player1Move=1;
			glutPostRedisplay();
			break;
		case 's':
			//do something
			player1Move=-1;
			glutPostRedisplay();
			break;
		case 'a':
			player1Move=0;
			glutPostRedisplay();
			break;
		case 'o':
			//do something
			player2Move=1;
			glutPostRedisplay();
			break;
		case 'l':
			//do something
			player2Move=-1;
			glutPostRedisplay();
			break;
		case 'k':
			player2Move=0;
			glutPostRedisplay();
			break;
		default:
			//some other key
			break;
	}
	
}

void keyboardup(unsigned char key, int x, int y) {
	switch (key) {
		case 'i':
			//do something
			player1Move=0;
			glutPostRedisplay();
			break;
		case 'u':
			player2Move=0;
			glutPostRedisplay();
			break;
		default:
			//some other key
			break;
	}
	
}

int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
	glutInitWindowSize(500, 500);
	
	glutCreateWindow("Tim GL");
	
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutKeyboardFunc(keyboard);
	glutKeyboardUpFunc(keyboardup);
	glutIdleFunc(idle);
	
	glutMainLoop();
	return EXIT_SUCCESS;
}