188 lines
6.4 KiB
Plaintext
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
|