Files
plib/demos/simon/astropong/astropong.psl
T

250 lines
6.5 KiB
PSL

/*
AstroPong - A 3D Pong Game
Copyright (C) 2002 Oliver Baker
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
For further information visit http://plib.sourceforge.net
$Id: astropong.psl 1699 2002-09-22 15:22:21Z sjbaker $
*/
#define ARENA_SIZE 8.0 /* meters */
#define ARENA_LENGTH 10.0 /* meters */
#define BALL_SIZE 2.5 /* meters */
#define BOUNCE (ARENA_SIZE/2.0 - BALL_SIZE/2.0)
#define BOUNCEY (ARENA_LENGTH/2.0 - BALL_SIZE/2.0)
#define BAT_SIZE (1.0 + BALL_SIZE/2.0) /* From the center to the sides */
int arena ;
int shadow ;
int difficulty ;
int scoreBoardR ;
int scoreBoardB ;
int ball ;
int bPaddle ;
int rPaddle ;
int camera ;
int scoreR ;
int scoreB ;
float Blue_batspeed = .34;
float scoreSpinR ;
float scoreSpinB ;
float ballSpinH ;
float ballSpinSH ;
float ballSpinP ;
float ballSpinSP ;
float ballSpinR ;
float ballSpinSR ;
float ballX ;
float ballY ;
float ballZ ;
float ballSX ;
float ballSY ;
float ballSZ ;
float bpaddleX ;
float bpaddleZ ;
float rpaddleX ;
float rpaddleZ ;
float userX ;
float userZ ;
int frameno = 0 ;
int main()
{
camera = 0 ;
arena = siLoad ( "arena2.ac") ;
ball = siLoad ( "ball3.ac") ;
bPaddle = siLoad ( "bluepaddle2.ac");
rPaddle = siLoad ( "redpaddle2.ac") ;
scoreBoardR = siLoad ( "Scoreboard.ac") ;
scoreBoardB = siLoad ( "Scoreboard.ac") ;
shadow = siLoad ( "shadow2.ac") ;
scoreSpinR = 0 ;
scoreSpinB = 0 ;
ballSX = 0.166 ;
ballSY = 0.155 ;
ballSZ = 0.016 ;
ballSpinSH = 4 ;
ballSpinSP = 4 ;
ballSpinSR = 4 ;
difficulty = 1 ;
if ( difficulty == 1 ) { Blue_batspeed = .275 ; }
else { Blue_batspeed = .34 ; }
while ( 1 )
{
frameno = frameno + 1 ;
/* Read the joystick */
userX = siJoystickLR();
userZ = siJoystickUD();
/* Move the ball */
ballX += ballSX ;
ballY += ballSY ;
ballZ += ballSZ ;
ballSpinH += ballSpinSH ;
ballSpinP += ballSpinSP ;
ballSpinR += ballSpinSR ;
/* Bounce off the sides? */
if ( ballX > BOUNCE || ballX < -BOUNCE )
{
ballSX = -ballSX ;
}
/* Bounce off the top and bottom? */
if ( ballZ > BOUNCE || ballZ < -BOUNCE )
{
ballSZ = -ballSZ ;
}
/* What happens at the ends? */
if ( ballY > BOUNCEY ) /* Passed the blue paddle? */
{
/* Is the blue bat there? */
if (ballX > bpaddleX - BAT_SIZE && ballX < bpaddleX + BAT_SIZE &&
ballZ > bpaddleZ - BAT_SIZE && ballZ < bpaddleZ + BAT_SIZE )
{
float hitX = ballX - bpaddleX ;
float hitZ = ballZ - bpaddleZ ;
if ( ballSX > 0 )
ballSX = fabs ( hitX / 2.0 ) ;
else
ballSX = -fabs ( hitX / 2.0 ) ;
if ( ballSZ > 0 )
ballSZ = fabs ( hitZ / 2.0 ) ;
else
ballSZ = -fabs ( hitZ / 2.0 ) ;
ballSY = -ballSY ;
}
else
{
scoreR++ ;
print ("The score is Red:", scoreR, " Blue:", scoreB, "\n" ) ;
ballSX = 0.1 ;
ballSY = 0.1 ;
ballSZ = 0.1;
ballSY = -ballSY ;
ballX = 0.0 ;
ballY = 0.0 ;
ballZ = 0.0;
for ( int i = 0 ; i < 60 ; i++ ) pause ;
}
}
if ( ballY < -BOUNCEY ) /* Passed the red paddle? */
{
/* Was the red bat there? */
if (ballX > rpaddleX - BAT_SIZE && ballX < rpaddleX + BAT_SIZE &&
ballZ > rpaddleZ - BAT_SIZE && ballZ < rpaddleZ + BAT_SIZE )
{
float hitX = ballX - rpaddleX ;
float hitZ = ballZ - rpaddleZ ;
if ( ballSX > 0 )
ballSX = fabs ( hitX / 2.0 ) ;
else
ballSX = -fabs ( hitX / 2.0 ) ;
if ( ballSZ > 0 )
ballSZ = fabs ( hitZ / 2.0 ) ;
else
ballSZ = -fabs ( hitZ / 2.0 ) ;
ballSY = -ballSY ;
}
else
{
scoreB++ ;
print ("The score is Red:", scoreR, " Blue:", scoreB, "\n" ) ;
ballSX = .1 ;
ballSY = .1 ;
ballSZ = .1;
ballSY = -ballSY ;
ballX = 0.0 ;
ballY = 0.0 ;
ballZ = 0.0;
for ( int i = 0 ; i < 60 ; i++ ) pause ;
}
}
/* Update the scoreboard */
scoreSpinR = scoreR * -36.0 ;
scoreSpinB = scoreB * -36.0 ;
/* How should the computer move the paddle? */
if ( ballZ > bpaddleZ ) { bpaddleZ += Blue_batspeed ; }
else { bpaddleZ -= Blue_batspeed ; }
if ( ballX > bpaddleX ) { bpaddleX += Blue_batspeed ; }
else { bpaddleX -= Blue_batspeed ; }
/* How did the player move the paddle? */
rpaddleX += userX * -.5;
rpaddleZ += userZ * .5;
/* Did the paddle move off the edge of the screen? */
if ( rpaddleX > BOUNCE ) rpaddleX = BOUNCE ;
if ( rpaddleX < -BOUNCE ) rpaddleX = -BOUNCE ;
if ( rpaddleZ > BOUNCE ) rpaddleZ = BOUNCE ;
if ( rpaddleZ < -BOUNCE ) rpaddleZ = -BOUNCE ;
/* Tell SIMON where to position the paddle, ball and camera */
/* MODEL X, Y, Z, H, P, R */
siPosition ( scoreBoardR, 1, 0, 0, 0, scoreSpinR, 0 ) ;
siPosition ( scoreBoardB, -1, 0, 0, 0, scoreSpinB, 0 ) ;
siPosition ( bPaddle , bpaddleX, 5, bpaddleZ, 0, 0 , 0 ) ;
siPosition ( rPaddle , rpaddleX, -5, rpaddleZ, 0, 0 , 0 ) ;
siPosition ( ball , ballX, ballY, ballZ,
ballSpinH,ballSpinP,ballSpinR);
siPosition ( arena , 0, 0, 0, 0, 0 , 0 ) ;
siPosition ( shadow , ballX, ballY, -4, 0, 0 , 0 ) ;
siPosition ( camera , 0, -10, 0, 0, 0 , 0 ) ;
pause ;
}
}