anachronox-sdk/docs/APEDocs/Lesson8.txt

188 lines
6.4 KiB
Plaintext

//----------------------------------------------------------------------------
// Lesson8: MAKING A GAME
//
// SIMPLE OBJECT COLLISION
// Now let's have more meaningful collision with...dum dum dum...ANOTHER
// OBJECT! Well, how do you do that? Instead of trying to check the
// exact shape of each object, you cheat--you just make a box roughly their
// size, and see if those boxes intersect. This is a really quick check
// (only four comparisons), and is close enough to work, unless you are
// doing physics-based collisions, like a pool game. (Actually, you might
// still use this kind of collision, then do another check to see if they
// _really_ collided...)
//
// All this file does is print a message when the Pong ball is inside each
// of the paddles. Try to work on your own after these lessons to make
// the ball react different if it is in different parts of the paddle!
//
// Next, we'll need to know how to make our games run the same on different
// computers, which all run at different speeds!
//
// To check out Lesson8...
//
// MAP TEST
// LOADAPE Lesson8
// INVOKE 2:1
//
// Move on to Lesson 9!
//
//#############################################################################
// DEFINES
//#############################################################################
#define $Lesson8 "2"
#define $HitTheWalls "1"
#define $Before "2"
#define $During "3"
#define $After "4"
#define $PaddleCollision "5"
#define $CheckTopPaddle "6"
#define $CheckBottomPaddle "7"
#define $CheckBallHit "8"
//-------------------------------------------------------
// CONSTANTS
//-------------------------------------------------------
#define $TOPSIDE "1"
#define $LEFTSIDE "1"
#define $RIGHTSIDE "232"
#define $BOTTOMSIDE "232"
#define %PADDLEWIDTH "24" // size of paddle
#define %PADDLEHEIGHT "8"
//#############################################################################
// CODE
//#############################################################################
#window $Lesson8:$HitTheWalls
startswitch $Lesson8:$Before
thinkswitch $Lesson8:$During
finishswitch $Lesson8:$After
//-------------------------------------------------------
width 256
height 256
flags noscroll // Don't scroll the text onto the screen, like dialog.
body " "
if (colliding == 0) body "Nope"
if (colliding == 1) body "TOP!"
if (colliding == 2) body "BOTTOM!"
body "\n "
body "Top Collisions %d", collisioncount1
body "\n "
body "Bottom Collisions %d", collisioncount2
font "Boost12"
image "zong\zongball.pcx" zongX,zongY
image "zong\tpaddle.pcx" tpaddleX,tpaddleY
image "zong\bpaddle.pcx" bpaddleX,bpaddleY
//=======================================================
// Before
// Initialize stuff!
//=======================================================
#switch $Lesson8:$Before
zongX = 200 // ball
zongY = 128
bpaddleX = 112 // bottom paddle
bpaddleY = 224
tpaddleX = 112 // top paddle
tpaddleY = 16
deltaX = 2.1
deltaY = .43
return
//=======================================================
// During
// Actively update appropriate variables
//=======================================================
#switch $Lesson8:$During
zongX = zongX + deltaX // add change to X location
zongY = zongY + deltaY // add change to Y location
if (zongX > $RIGHTSIDE) deltaX = -1 * deltaX // if on right side, go left
if (zongX < $LEFTSIDE) deltaX = -1 * deltaX // if on left side, go right
if (zongY > $BOTTOMSIDE) deltaY = -1 * deltaY // if at bottom side, go up
if (zongY < $TOPSIDE) deltaY = -1 * deltaY // if at top side, go down
gosub $Lesson8:$PaddleCollision
return
//=======================================================
// PaddleCollision
// Where we check each if ball hit either paddle.
//=======================================================
#switch $Lesson8:$PaddleCollision
unset colliding
gosub $Lesson8:$CheckTopPaddle
gosub $Lesson8:$CheckBottomPaddle
return
//=======================================================
// CheckTopPaddle
// See if collided with top paddle, and alter ball
// trajectory.
//=======================================================
#switch $Lesson8:$CheckTopPaddle
checkX = tpaddleX
checky = tpaddleY
checkWidth = %PADDLEWIDTH
checkHeight = %PADDLEHEIGHT
gosub $Lesson8:$CheckBallHit
if (colliding) set collisioncount1 = collisioncount1 + 1
return
//=======================================================
// CheckBottomPaddle
// See if collided with bottom paddle, and alter ball
// trajectory.
//=======================================================
#switch $Lesson8:$CheckBottomPaddle
if (colliding) return
checkX = bpaddleX
checky = bpaddleY
checkWidth = %PADDLEWIDTH
checkHeight = %PADDLEHEIGHT
gosub $Lesson8:$CheckBallHit
if (colliding)
{
colliding = 2 // bottom paddle collision!
set collisioncount2 = collisioncount2 + 1
}
return
//=======================================================
// CheckBallHit
// Check if ball hit something
//=======================================================
#switch $Lesson8:$CheckBallHit
set box1Left = checkX // whatever's bounding box
set box1Right = checkX + checkWidth
set box1Top = checkY
set box1Bottom = checkY + checkHeight
set box2Left = zongX // ball is 8 x 7
set box2Right = zongX + 7
set box2Top = zongY
set box2Bottom = zongY + 6
unset colliding // only set if inside each other
if (box1Top > box2Bottom) RETURN // check if boxes to any of four sides
if (box2Top > box1Bottom) RETURN
if (box1Left > box2Right) RETURN
if (box2Left > box1Right) RETURN
set colliding = 1 // if not to any of four sides, collision!
RETURN
//=======================================================
// After
// Leave the place like we found it
//=======================================================
#switch $Lesson8:$After
unset zongX
unset zongY
unset deltaX
unset deltaY
unset tpaddleX // top paddle
unset tpaddleY
unset bpaddleX // bottom paddle
unset bpaddleY
unset collisioncount1
unset collisioncount2
return