[Tutorial][Blitz] How To Build A Game
Author |
Message |
shorthair
|
Posted: Mon Feb 16, 2004 10:09 pm Post subject: [Tutorial][Blitz] How To Build A Game |
|
|
Blitz Help
The status variable contains the "state" of the game, which is either displaying a title page or allowing the player to steer round the screen. Extra states such as player dies with cosmic explosion and gameover screen would be added to extend the game further.
The main loop, then uses the Flip command to perform the double buffering (allowing us to draw to one screen while the other is displayed) and then either prints a message informing the user to press Enter to start or calls the UpdatePlayer() function.
code: | BackBuffer()
Global status=0,x#=0,y#=0,speed#=1,dir=1
; eat the dots
Graphics 640,480
SetBuffer
; main loop
While Not KeyHit(1)
; refresh screen
Flip
Cls
Color 255,255,0
Rect 0,0,640,480,0
; select state
Select status
Case 0
Locate 100,100
Print "Press Enter To Start"
If KeyHit(28) InitGame()
Case 1
UpdatePlayer()
End Select
Wend |
What UpdatePlayer() function you ask? And if the user presses Enter what's this InitGame() function?
Unlike traditional BASIC languages where we would implement these functions as subroutines and call them with the Gosub command BlitzBasic features user defined functions.
Add the following two functions at the bottom of the above program to allow the program to run.
The first function initializes the variables we will need inorder to steer the players rectangle around the screen. Note how these variables have been declared at the top of the program as Global which allows us to access them from inside functions such as InitGame().
code: | Function InitGame()
x=320
y=240
speed=1
dir=1
status=1
End Function |
This second function changes the players direction depending on the arrow key they are pressing or the direction of the joystick. The code then moves the players position (x,y) depending on the dir variable which corresponds to up, right, down and left respectively.
code: | Function UpdatePlayer()
; steer player
If KeyDown(200) Or JoyY()<-0.5 dir=0
If KeyDown(205) Or JoyX()>0.5 dir=1
If KeyDown(208) Or JoyY()>0.5 dir=2
If KeyDown(203) Or JoyX()<-0.5 dir=3
; move player
Select dir
Case 0 y=y-speed
Case 1 x=x+speed
Case 2 y=y+speed
Case 3 x=x-speed
End Select
; draw player
Color 255,255,255
Rect x,y,10,10
End Function |
After adding the InitGame() and UpdatePlayer() code the game should run.
Next it's time to add some deadly rocks and some yummy food.
In order to do this we create some new Types that will hold all the information we need for each rock and food. To begin with these Types will simply hold the x and y position of each rock and food element we create for our game.
Place the following Type declarations at the top of the program.
code: | Type food
Field x,y
End Type
Type rock
Field x,y
End Type |
The following code then needs to be added to the InitGame() function, insert it after the line that reads status=1.
This code creates 20 rocks that will kill the player and 20 food that will speed the player up. The New command creates a new object and also adds it to a list. We set the position of each rock and food by setting the x and y fields of each new object created using the backslash \ character to denote which field.
code: | For i=0 To 20
r.rock=New rock
r\x=Rnd(640)
r\y=Rnd(480)
Next
For i=0 To 20
f.food=New food
f\x=Rnd(640)
f\y=Rnd(480)
Next
|
We now need a function that draws all the food and rocks each frame and checks if the player has collided with any.
Note how we can loop through each food and rock element that exist using the For..Each command pair. This is another great feature of BlitzBasic that keeps programs simple and easy to read.
We use the RectsOverlap command to check of the players position (x,y) collides with each food or rock element (f \ x , f \ y) or (r \ x , r \ y). If the player collides with some food we delete that piece of food and increase the player's speed. If the player collides with a rock we end the game by resetting the status variable.
code: | Function UpdateRocksandFood()
; draw food and check if eaten
Color 0,255,0
For f.food=Each food
Rect f\x,f\y,10,10
If RectsOverlap(x,y,10,10,f\x,f\y,10,10)
speed=speed+0.2
Delete f
EndIf
Next
; draw rocks and check for roadkill
Color 255,0,255
For r.rock=Each rock
Rect r\x,r\y,10,10
If RectsOverlap(x,y,10,10,r\x,r\y,10,10)
status=0
EndIf
Next
End Function |
Oops, one last thing, don't forget to call the UpdateRocksandFood() function from the main loop, just after the UpdatePlayer() call should do nicely.
code: | UpdateRocksandFood() |
OK, after playing the game, a few things should become evident.
First, the player should die if they hit the outer wall. We could do this by checking if their position does not collide with the main screen rectangle (0,0,640,480). Try adding the following code to the UpdatePlayer function.
code: | If Not RectsOverlap(x,y,10,10,0,0,630,470) status=0 |
Secondly, each time the game starts more rocks and food appear. This is because we never delete the food and rocks remaining from the last game. Insert the following code before the code that creates the new food and rocks in the InitGame() function.
code: | For f.food=Each food Delete f Next
For r.rock=Each rock Delete r Next |
|
|
|
|
|
|
Sponsor Sponsor
|
|
|
Cervantes
|
Posted: Tue Feb 17, 2004 5:59 pm Post subject: (No subject) |
|
|
Can't get it to work.. It's saying not enough parameters...
can you post the full complete code?
(yes, I put everything in the right order ) |
|
|
|
|
|
shorthair
|
Posted: Tue Feb 17, 2004 6:28 pm Post subject: (No subject) |
|
|
The cursor should go to wherethe error is , im gonna quickly run through it , |
|
|
|
|
|
|
|