#include #include #include "types.h" #include extern void initGL(); extern void initModels(); pinball ball; bumper bump[ NUM_BUMPERS ]; paddle pad[ 2 ]; void initObjects() { ball.x = 1.0f; ball.y = 0.0f; ball.z = 0.0f; ball.dx = 0.0f; ball.dy = 0.0f; for(int i=0; i0.0f) ? 1.0f : -1.0f ) void doCollide( bumper *b ) { GLfloat dx = ball.x - b->x; GLfloat dy = ball.y - b->y; GLfloat d = sqrtf((dx*dx) + (dy*dy)); if( d < PINBALL_RADIUS + BUMPER_RADIUS ) { //collision GLfloat mag = sqrtf((ball.dx*ball.dx) + (ball.dy*ball.dy)); GLfloat cos = (dx*ball.dx) + (dy*ball.dy); cos /= d; cos /= PINBALL_RADIUS + BUMPER_RADIUS; cos = cos*cos; cos *= 2.0f; cos -= 1.0f; ball.dx = -signum( ball.dx )*mag*cos; GLfloat sin = 1 - cos*cos; ball.dy = -signum( ball.dy )*mag*sin; } } #define CONV (3.1415f / 180.0f) void doPaddleCollide() { GLfloat dx = ball.x - pad[0].x; GLfloat dy = ball.y - pad[0].y; GLfloat ndx = dx*cosf( -pad[0].az*CONV ) - dy*sinf( -pad[0].az*CONV ); GLfloat ndy = dx*sinf( -pad[0].az*CONV ) + dy*cosf( -pad[0].az*CONV ); if( ndy < PINBALL_RADIUS - 0.1f && ndx < PADDLE_LENGTH ) { // collision GLfloat mag = sqrtf((ball.dx*ball.dx) + (ball.dy*ball.dy)); GLfloat oldangle = atanf( ball.dy / ball.dx ); GLfloat normal = (pad[0].az+90.0f)*CONV; GLfloat newangle = (normal-oldangle)*2.0f; ball.dx = -signum( ball.dx )*mag*cosf( newangle ); ball.dy = -signum( ball.dy )*mag*sinf( newangle ); return; } dx = ball.x - pad[1].x; dy = ball.y - pad[1].y; ndx = dx*cosf( -pad[1].az*CONV ) - dy*sinf( -pad[1].az*CONV ); ndy = dx*sinf( -pad[1].az*CONV ) + dy*cosf( -pad[1].az*CONV ); if( ndy < PINBALL_RADIUS - 0.1f && ndx < -PADDLE_LENGTH ) { // collision GLfloat mag = sqrtf((ball.dx*ball.dx) + (ball.dy*ball.dy)); GLfloat oldangle = atanf( ball.dy / ball.dx ); GLfloat normal = (pad[1].az+90.0f) } void updateObjects() { pad[0].az += pad[0].daz; if( pad[0].az > 30.0f ) { pad[0].az = 30.0f; pad[0].daz = 0.0f; } else if( pad[0].az < -30.0f ) { pad[0].az = -30.0f; pad[0].daz = 0.0f; } pad[1].az += pad[1].daz; if( pad[1].az > 30.0f ) { pad[1].az = 30.0f; pad[1].daz = 0.0f; } else if( pad[1].az < -30.0f ) { pad[1].az = -30.0f; pad[1].daz = 0.0f; } ball.x += ball.dx; ball.y += (ball.dy-0.1f); if( ball.x > 6.0f ) { ball.x = 6.0f; ball.dx = -ball.dx; } else if( ball.x < -6.0f ) { ball.x = -6.0f; ball.dx = -ball.dx; } if( ball.y > 6.0f ) { ball.y = 6.0f; ball.dy = -ball.dy; } if( ball.y < -6.0f ) { ball.y = 0.0f; ball.x = 1.0f; ball.dx = ball.dy = 0.0f; } for(int i=0; i