150 lines
8.2 KiB
Plaintext
150 lines
8.2 KiB
Plaintext
How to write a Shoot 'em Up, by Phagex of LSD.
|
|
|
|
The source code for this tutorial should be hanging around one of the
|
|
Grapevine disks, and is self exctracting: GameTut.EXE
|
|
|
|
Right, this is a tutorial for all the coders out there who have learnt how
|
|
to put a screen on and make a few bobs fly around, but havent got an idea
|
|
about how to put them to proper use. In this tutorial i have coded the basic
|
|
platform (Nooo! not a PLATFORM game! (it isnt a PLATFORM game is it?)) of
|
|
a shoot 'em up. Its a very simple move yer space ship around the screen,
|
|
and shoot upwards against the nasty alien coming down at you type affair,
|
|
only its a complete, fully commented source code that i've given you to play
|
|
with. I've placed this game into the Public domain through Grapevine, but
|
|
i have FULL copyright on this game, ie. the GFX and source. I know it isnt
|
|
that much, but i'de prefer you to draw and eventually program your OWN
|
|
routines instead of just lifting them from my source, although it really
|
|
isnt the BEST source anyway! But it does do the job (which is all that
|
|
matters when your coding for a living hehe!)...
|
|
|
|
|
|
Anyway, off we go with a loose description of what happens:
|
|
|
|
First of all you naturally kill the system and set the games variables,
|
|
then we have a few presentation routines for fading in and out and
|
|
displaying text. Start off with "Get Ready" and then head for the main
|
|
game processing loop which is what i'll now describe in more detail...
|
|
|
|
First of all, the screen is double buffered, which i'm sure you all know the
|
|
purpose of, (y'know, keeps everything smooth and flicker free) not only does
|
|
this mean that the screen has two memory banks, but all variables associated
|
|
with the blitting and clearing are double buffered as well.
|
|
|
|
The Aliens, Bullets and Explosions all have three data lists each, the first
|
|
is the Variable Table which stores main variables about each item, and then
|
|
theres 2 tables (double buffered) which stores the actual items Screen memory
|
|
address, this is to allow for blitter clearing on the next frame.
|
|
|
|
The Variable Tables are used differently for each type of on screen object,
|
|
each alien has 4 words allocated to it, the 1ST is the downwards SPEED
|
|
(ie. this variable is added to the aliens Y Position), the 2ND and 3RD are
|
|
the X and Y Positions, and the 4TH is its animation FRAME. The SPEED
|
|
variable is also used as an active FLAG, ie. if the speed is -1 ($ffff) then
|
|
that particular alien is inactive (not shown), but if its positive ie. 1++
|
|
then the alien IS active and is used as the speed. Bullets are simpler in
|
|
the way they just have 2 words, X & Y Positions, but if the X Position is -1
|
|
(Off screen) then its inactive and not shown. Explosions have 3 words, an
|
|
X & Y and an animation Frame, similar to the bullet configuration.
|
|
|
|
|
|
Now the first thing i've done at the start of the loop is to clear all the
|
|
old objects such as the ship, aliens, bullets (fire) and explosions off the
|
|
screen, this is done by storing the memory positions of everything on screen
|
|
in the last frame. Then the clear routine just has to look up the last
|
|
active objects and BlitClear them, this individual clearing is faster than
|
|
clearing the WHOLE screen with the blitter.
|
|
|
|
The next 2 routines service the bullets, first the bullets variable table
|
|
is scanned, any active bullets are moved UP the screen by subtracting a
|
|
speed variable from the bullets Y Position, if however the bullet reaches
|
|
the top of the screen then its life is over and that bullet is disactivated
|
|
in the VarList. The next routine blits the bullets onto the currently
|
|
active screen. This is done by scanning the VarList for active bullets
|
|
(X Pos <> -1) and just blitting onto the screen with any active bullets X & Y
|
|
positions.
|
|
|
|
Next are the alien routines, first a quick randomize routine which uses a
|
|
few sources of varied numbers ie. X & Y Position of spaceship, raster X & Y
|
|
position and contents of the KickStart ROM chip. The new random number is
|
|
used as the new X position and for the speed of any new aliens activated.
|
|
The second routine is the New Alien one, every 10 frames a new alien is
|
|
activated, the routine searches down the aliens VarList for an empty
|
|
location (ie. unactive alien) and the first empty location it finds it puts
|
|
the random number into the X Position (within screen boundaries), zeros the
|
|
Y position and animation frame, and uses the remainder of the random number
|
|
as the new aliens speed. This sets a new active alien into the VarList. The
|
|
third alien routine moves the aliens down the screen, same as the bullet
|
|
mover works, but in the opposite direction. When the alien reaches the
|
|
bottom of the screen, it is then disactivated. The fourth routine is a
|
|
collision detection routine, it uses the VarLists of both the Bullets and
|
|
the Aliens, its checks the X & Y Positions of all active bullets against
|
|
all active aliens. If any bullets co-ords are found within an aliens, then
|
|
the alien is disactivated, score is increased and the New Explosion routine
|
|
is called. The explosion routine searches through its VarList for an unused
|
|
explosion, gives the dead aliens X & Y Pos for a new explosions co-ords, and
|
|
sets the frame to 0. The fifth routine is just a blitter routine, goes
|
|
through the Aliens VarList, blitting any alien active.
|
|
|
|
Next are the 2 explosion routines, the first just scans the explosion
|
|
VarList and increases the Animation Frame number of any active explosions.
|
|
When the frame counter of any explosion reaches 18, that explosion is
|
|
disactivated as its reached its last anim frame. Second routine just blits
|
|
the explosions current anim frames at their corresponding X & Y Pos.
|
|
|
|
Next is a quick check to see if the spaceship has been hit, and if its in
|
|
the process of "dying" then the next few routines are skipped.
|
|
|
|
The CheckAlien routine is the other collision detection routine, where
|
|
co-ords of active aliens are checked against the spaceships X & Y Pos. If
|
|
the ship has collided, then an explosion is activated and a flag set to
|
|
indicate death. TrackStick and TrackMouse just get the status of the
|
|
joystick and mouse and set the movement flags accordingly. The MoveShip
|
|
routine checks the movement flags and moves the ship Up/Down/Left/Right at
|
|
the selected ship speed, it also checks the ships co-ords against the screen
|
|
boundaries, and makes sure the ship doesnt wander off the edge of the screen!
|
|
|
|
Then the ships X & Y co-ords are Double buffered into either 1 of two sets
|
|
according to what screen the ship will be displayed on.
|
|
|
|
Finally the SpaceShip is blitted onto the screen.
|
|
|
|
Then we wait for the Vertical Blank period, then double buffer the screen
|
|
and copperlist, and increase the time variables.
|
|
|
|
A quick check to see if all the lives have been used up by the player, if
|
|
they have then jump to the "Game Over" routines and exit, otherwise check
|
|
the right mouse button, if pressed then quit anyway, else jump back to the
|
|
mainloop!!
|
|
|
|
|
|
And thats just about it! Well its a fairly complex process, but hopefully
|
|
you've learnt the basics of it all. Theres quite a bit you can improve on,
|
|
like the aliens, all they do is come down the screen at you, it shouldnt be
|
|
too hard to make a routine where they follow a pattern, go left and right,
|
|
in a circle or even both! Then theres intelligence routines, aliens that
|
|
follow you or avoid you. Perhaps even a scrolly background that moves
|
|
down the screen, complete with level maps and such. Theres plenty of ideas
|
|
to add to it all. But remember to keep your source code simple and clean,
|
|
it helps to be able to read and understand source that you coded while in
|
|
a "different" state of mind like you were the other night hehe!
|
|
|
|
Oh, i coded this game in Devpac 3.02, and i recommend you use it or a Devpac
|
|
variant for source compatability, i dunno about this ASM-one and Trashm
|
|
business. Devpac isnt the best, but i think its the most user friendly.
|
|
|
|
|
|
As for future tutorials from me, well i'll keep 'em simple because i'm
|
|
coding Satan On Speed for LSD and thats using ALL my free time up! But i
|
|
may even come up with a tutorial on platform games, but then again, WHO
|
|
HASNT CODED A PLATFORM GAME!!! There are just SOOO many!!! But i suppose
|
|
theres always room for a GOOD platformer, most i've seen today are just
|
|
simply shite.
|
|
|
|
Also i'm upping quite a bit of my source code to Pazzas BBS, so when its
|
|
online you can leech my codings heh, but dont go bothering Pazza for my code
|
|
pleeze.... cya 4 now....
|
|
|
|
|
|
|
|
|