| [ LiB ] |
Alright, now you will be able to see what a full game looks like. This is basically a simple
Pong
clone, and it is easy to control and play. The idea of this game is to score more points than your
To compile the code yourself, you need to find demo01-01.bb on the CD. After finding it, copy it to your computer and open it through the Blitz Basic compiler. To open it, find the File menu on the top of the compiler and click
To actually compile, find the Program toolbar in Blitz Basic. Select Program->Run Program, and the game will compile and run! You have just compiled your first program!
Feel free to examine the code; although it may seem very weird and hard to understand now, you will soon be able to figure out this code easily.
Table 1.3 lists the keys you will use for this game.
|
Key |
Action |
|---|---|
|
Up Arrow |
Move player up |
|
Down Arrow |
Move player down |
|
Escape |
Exit game |
|
P |
Pause and Unpause |
Okay, let's actually take a look at the code. Read it, but don't worry if some of it is hard to understand. This is the first program you have seen, and it isn't easy. You will learn how to actually write this code throughout the book.
;demo01-01.bb - A Complete game of KONG
;Set up graphics mode
Graphics 800,600
;Seed the random generator (make random numbers actually random)
SeedRnd(MilliSecs())
;Create a back buffer
SetBuffer BackBuffer()
;Set the handle to the center of images
AutoMidHandle True
;CONSTS
;The following are key code constants
Const UPKEY = 200 ;Up
Const DOWNKEY = 208 ;Down
Const PAUSEKEY = 25 ;P
Const HUMANSPEED = 7 ;The human's max speed
Const COMPUTERSPEED = 6 ;The computer's max speed
;TYPES
;The player type: both the human and the opponent
Type player
Field y,score;y position and score
End Type
;The ball type: for the ball
Type ball
Field x,y,xv,yv ;x, y coordinates, and x, y velocity
End Type
;IMAGES
;The picture of the human player
Global player1image = LoadImage("player1.bmp")
;The picture of the computer player
Global player2image = LoadImage("player2.bmp")
;The picture of the ball
Global ballimage = LoadImage("ball.bmp") ;Load the ball image
;TYPE INITIALIZATION
;Create a ball
Global ball.ball = New ball
;Create the human
Global player1.player = New player
;Create the computer
Global player2.player = New player
This is the end of the declaration section of the code. This part sets up the important variable for the program, as well as the types and images. (Don't worry; you will be introduced to all of this as the book progresses.)
After the declaration, we begin the initialization. Initialization is the process of setting up everything that will be used in the programin this section, the initialization section sets up the beginning score values and the players' position on the screen.
;INITIALIZATION Text 400,300,"Ready...Set" ;Wait for one second Delay(1000) Text 420,330,"GO!!!" Flip ;Delay for 1/5 of a second Delay(200) ;Initialize the level InitializeLevel() ;Set inital scores player1\score = 0 player2\score = 0
The initialization section sets up some important variables for the game, such as the score and the player variables. These
After initialization, the actual loop begins:
;MAIN LOOP While Not KeyDown(1) ;Clear the screen Cls ;Draw the ball DrawImage (ballimage,ball\x,ball\y) ;Draw the human DrawImage (player1image, 60, player1\y) ;Draw the computer DrawImage (player2image, 740, player2\y) ;Test what user pressed TestKeyboard() ;What should AI do? TestAI() ;Draw the HUD DrawScore() Flip Wend ;END OF MAIN LOOP
NOTE
What Is a Frame?
I am about to reference the word "frame" a bunch of times in a few moments, and you should know what it means. A frame is the screen at any given moment. A game can be compared to an animated film both are made up of a bunch of different pictures that, when put together, create animation. The frames blend together so quickly that the objects on the screen appear to be moving. An average game runs at 30
This is the end of the main loop. To put it bluntly, the main loop is the entire game. Every frame of a game is one iteration of the main loop. By the way, a loop causes some code to be repeated over and over until some condition becomes false. Here, the condition is that the Esc key has not been pressed. Usually, the main loop is a while loop, shown here in the line
While Not KeyDown(ESCKEY)
At this point, the actual game loop has been completed, so we must now define the functions. A function is called with its
;INITIALIZELEVEL() ;Sets up starting values Function InitializeLevel() ;Put ball in center of the screen ball\x = 400 ball\y = 300 ;Make the ball move in a random direction ball\xv = Rand(2,6) ball\yv = Rand(-8,8) ;Place the players in their correct position player2\y = 300 player1\y = 300 End Function
This function sets up the starting values for the players and the ball. The ball is in the center of the screen, and it is directed toward the right of the screen (to the computer player's side) with a small variation on how high or low it goes. The human player is near the left edge of the screen, and the computer player is near the right.
;DRAWSCORE() ;Draws the HUD in the top right Function DrawScore() ;Write the human score Text 700,0,"Player 1: " + player1\score ;Write the computer's score Text 700,30,"Player 2: " + player2\score End Function
This is probably the simplest function in this program because all it does is draw the scores on the top-right corner of the screen.
;TESTKEYBOARD()
;Moves player up and down based on keyboard
Function TestKeyboard()
;If player hits up, move him up
If KeyDown(UPKEY)
player1\y = player1\y - HUMANSPEED
EndIf
;If player presses down, move him down
If KeyDown(DOWNKEY)
player1\y = player1\y + HUMANSPEED
End If
;if player presses Pause, pause the game
If KeyHit(PAUSEKEY)
;make screen blank
Cls
Text 400,300,"Press 'P' to Unpause Game"
Flip
;wait for player to unpause
While Not KeyHit(PAUSEKEY)
Wend
EndIf
End Function
This function determines what keys the user pressed, if any. If it doesn't make sense to you, try reading the following pseudocode:
NOTE
What Is Pseudocode?
Big word, huh? Pseudocode is a very helpful device in game programming because it takes hard-to-understand concepts and turns them into human language. Pseudocode is the program code put into easier-to-understand terms. Basically, to convert code into pseudocode, simply change each line of code into human language. However, pseudocode does not have all the detail that real code does, so although it is good for understanding concepts, it isn't a good idea to try and put it back into a program.
If ( player presses up ) Move player up If ( player presses down ) Move player down If ( player presses 'P' ) Pause the game
Pretty easy to understand, don't you think? Refer back to the actual code to see the correlation.
Next we look at the function TestAI() .
;TESTAI()
;Updates ball and score and enemy
Function TestAI()
;If ball is above computer, move computer up
If ball\y > player2\y
player2\y = player2\y + COMPUTERSPEED
;if ball is lower than computer, move computer down
ElseIf ball\y < player2\y
player2\y = player2\y - COMPUTERSPEED
EndIf
;If ball hits human player, reflect it away from him and variate its velocity and
direction
If ImagesOverlap(ballimage,ball\x,ball\y,player1image,60,player1\y)
ball\xv = -ball\xv + Rand(-4,4)
ball\yv = ball\yv + Rand(-4,4)
;If ball hits computer, reflect it away from computer and variate its velocity and
direction
ElseIf ImagesOverlap(ballimage,ball\x,ball\y,player2image,740,player2\y)
ball\xv = -ball\xv + Rand(-4,4)
ball\yv = ball\yv + Rand(-4,4)
;If ball hits top wall, reflect it downwards
ElseIf ball\y <= 0
ball\yv = -ball\yv + Rand (-1,1)
ball\xv = ball\xv + Rand (-1,1)
;If ball hits bottom wall, reflect it upwards
ElseIf ball\y >= 600
ball\yv = -ball\yv + Rand (-1,1)
ball\xv = ball\xv + Rand (-1,1)
;if ball hits left wall, computer has scored so computer gets one more point
ElseIf ball\x <= 0
player2\score = player2\score + 1 ;computer scores
Text 400,300,"Player 2 Scores!!!"
Flip
;wait two seconds
Delay(2000)
;reset level
InitializeLevel()
;If ball hits right wall, human scored so give him a point
ElseIf ball\x >= 800
player1\score = player1\score + 1 ;human scores
Text 400,300,"Player 1 Scores!!!"
Flip
;wait 2 secs
Delay(2000)
;reset level
InitializeLevel()
EndIf
;update ball's position on screen
ball\x = ball\x + ball\xv
ball\y = ball\y + ball\yv
End Function
This one is a lot harder to understand.
TestAI()
changes the position of the ball based on its direction variables, and changes the position of the computer's paddle based on the position of the ball. It also
If ( ball is above computer ) Move computer up OR if ( ball is below computer ) Move computer down If ( ball hits player's paddle ) Change direction of ball OR if ( ball hits computer's paddle ) Change direction of ball OR if ( ball hits top wall ) Change direction of ball OR if ( ball hits bottom wall ) Change direction of ball OR if ( ball hits left wall ) Score a point for computer Reset the level OR if ( ball hits right wall ) Score a point for the player Reset the level
NOTE
CAUTION
Because of margin constraints, some of the lines of code may have spread over two lines or more. In a real game, all of the code must be on one line, or else it won't run. For example, if I had written something like the following line:
ElseIf ImagesOverlap(ballimage,ball\x,ball\y, player2image,740,player2\y) ;This tests to see if the ball has collided with player 2's image.
Typing it into the compiler with the line break would not work. It must be on the same line, even though the margins in the book make it appear broken up.
Once again, if you want to have a better perspective of this game, run demo01-01.bb off the CD.
Figures 1.7 and 1.8 show the KONG title screen and main screen, respectively.
Compiling the code is a very simple procedure. Just open the file (demo01-01.bb) off the CD in Blitz Basic (or type it into the workspace), save the file (File->Save) onto your computer, and select Program->Run Program, as shown in Figure 1.9.
Well, that isn't what you would call a full game. I did not add any special effects or sounds because they aren't very important at this point. The idea is to get a feel for what code looks like and how it is written. You will notice that the meanings of most of the functions are easy to understand because of the function
Let me summarize the points that I've touched on so far. Many
The initialization section
The main loop
The shutdown
Initialization sets up variables and functions that are used throughout the game. Declaration is part of initialization and is used to set up variables that will be used later in the program. The game loop is what you see on the screen. Each iteration (an iteration is each time the program runs through the loop) of the loop is one frame of the game. Usually, there are at least 30 frames, or iterations, per second. See Figure 1.10 for a description of initialization, the game loop (also known as the main loop), and shutdown in KONG.
The shutdown sequence is the final part of the game, and it runs just before and during the end of the game. It
Of course, there are a few other important parts to any game, but I will go over them with you when learning about them is necessary. For now, read over the commented code (on the CD) and try to understand what the heck is going on. If you follow the functions, it shouldn't be too hard.
| [ LiB ] |