A tutorial on code structure in Blitz.
Organization, a programmer’s nightmare,However, using good structure means that a code can be both easily reparable and easily reusable . Why reinvent the wheel?
In this article I am going to walk you through and article on how to structure blitz code. The game is called retro space shooter, and it won’t work unless you create two of your own images. You need a white on black title that says “Retro Space Shooter”, and you need a start background that is 800×600. Let’s begin.
First we start with the header, here I usually include five things.
Graphics 800,600,32,1 AutoMidHandle True SetBuffer BackBuffer() SeedRnd MilliSecs() AppTitle "Retro Space Shooter"
First I declare the Graphics Mode, then I set all image handles to the center, I set the drawing buffer to the BackBuffer(), I seed the random generator and I set the application title, this way, you never forget these very important things.
Next, I set up all the types, in this game, I did this.
Type ship Field x,y End Type Type ufo Field x,y End Type Type bullet Field x,y Field who ;1 = shot by player, 2 = shot by ufo End Type
This makes sure that I create all of the characters and objects that I need in the game, it also means that I can’t create any of the variables before the type is created, very smart.
Then I do constants, this is good because it allows me to get everything that just needs to be declared written down, so I don’t forget anything.
Const shipspeed = 10 Const shippic$ = "|/^|" Const killscore = 1000 Const levelscore = 5000 Const shootdeduct = 25 Const ufopic$ = "-0-" Const bulletspeed = 20 Const bulletpic$ = "*"
Now that those are set, I can declare all my Globals.
Global ufospeed = 7 Global count = 0 Global level = 1 Global numofufos = Rand(3,5) + level Global timer = 0 Global timerspeed = 2 Global score = ReturnScore() Global totalkills = 0 Global totalshots = 0 Global cont = 1 Global title = LoadImage("GraphicsRetrotitle.bmp") Global font = LoadFont("blitz",18) Global starfield = LoadImage("Graphicsstarfield.bmp") Global scrollx = 0 Global s.ship = New ship sx = 400 sy = 500
It is a good idea to declare your type variables immediately after the fact, so you don’t forget them.
Next up the interface
SetFont font DrawImage(title,400,300) Text 400,500,"Press Any Key to continue",True Flip Delay 3000 WaitKey Cls Text 400,100,"Welcome to Retro Space Shooter",True Text 400,200,"This is a simple space shooter game",True Text 400,300,"You will need to use the arrow keys to move left and right",True Text 400,400,"Spacebar fires your weapon",True Text 400,500,"Score is based on levels and kills, but too many shots will deduct",True Flip Delay 3000 Cls Text 400,300,"Get Ready to Play",True Flip Delay 3000
Declare your interface either into the loop or immediately before.
The loop should be clear and concise, use functions whenever possible, but don’t over do it. If your loop is 50 lines, so be it. Try to clump related code into functions.
Cls LevelMake() While cont = 1 Cls TileImage(starfield,scrollx,300) scrollx = scrollx + 5 UpdatePlayer() AI() If count = numofufos Then count = 0 timerspeed = timerspeed + 1 numofufos = numofufos + 1 level = level + 1 LevelMake() EndIf score = ReturnScore() Text 650,50,"Score: " + score Flip If KeyHit(1) Then cont = 0 EndIf Wend
Place your credits right after.
Cls DrawImage(title,400,150) Text 400,300,"Final Score: " + score,True Text 400,400,"Credits",True Text 400,500,"Tyler Chaney and Michael Cogswell",True Flip Delay 5000
Then write out your functions, try to do this in order of usage, it helps immensely.
Function LevelMake() Cls For b.bullet = Each bullet Delete b Next For u.ufo = Each ufo Delete u Next For e = 1 To numofufos u.ufo = New ufo ux = Rand(51,749) uy = Rand(50,300) Next sx = 400 sy = 500 Text 400,300,"Level " + level,True,False Flip Delay 3000 End Function Function UpdatePlayer() If KeyDown(205) Then sx = sx + shipspeed Else If KeyDown(203) Then sx = sx - shipspeed EndIf If KeyHit(57) Then b.bullet = New bullet bx = sx by = sy bwho = 1 totalshots = totalshots + 1 EndIf For b.bullet = Each bullet by = by - bulletspeed Color 0,0,0 Rect bx,by,StringWidth(bulletpic$),StringHeight(bulletpic$),0 Color 255,255,255 Text bx,by,bulletpic$ For u.ufo = Each ufo If RectsOverlap(ux,uy,StringWidth(ufopic$),StringHeight(ufopic$),bx,by,StringWidth(bulletpic$),StringHeight(bulletpic$)) count = count + 1 totalkills = totalkills + 1 Delete u EndIf Next If by = 750 Then ufospeed = -7 EndIf If ux = 800 Or ux = 600 Then uy = uy + 10 timer = 0 EndIf Color 0,0,0 Rect ux,uy,StringWidth(ufopic$),StringHeight(ufopic$),False Color 255,255,255 Text ux,uy,ufopic$ Next End Function Function Test() Text 100,500,"shots" + totalshots End Function Function ReturnScore() Return (((level * levelscore) + (totalkills * killscore)) - (totalshots * shootdeduct)) - 5000 End Function
Thanks for reading, hope it helps and happy coding.