Lab 4 Using Blitz Graphics Pre-requisites Objectives

advertisement
Lab 4
Using Blitz Graphics
Pre-requisites
Read Chapter 5
Objectives
Creating a graphics window
Loading, drawing, and using images
Color
Vocabulary
Bitmap Image
Handle
Tile
Mask
Page Flipping
Frame
Buffer
Discussion and Procedure
You can start with your own StarWars2.bb from last week (rename it first to MyStarWars3.bb and copy
to Lec4 folder), or use the StarWars3.bb file already in the folder.
First, Fix the KeyCodes. After setting up image strings for the ships, add more constants near top of file:
Const TIE$="<-o->", XWING$=">-o-<"
Const UPKEY=200, LEFTKEY=203, RIGHTKEY=205, DOWNKEY=208, SPACE=57 Add
Then fix arrow handlers
if KeyDown(200)

(use KeyDown instead of KeyHit)
if KeyDown (UPKEY)
Because we will generate random numbers, add this line
etc.
SeedRnd MilliSecs() at top of file
Part 1. Capturing and Pre-Processing Images
1. Capture images on google images. Thumbnails for ships, etc. and Full Size for backgrounds
2. Convert .JPG to .BMP using MS PAINT.
3. Make background black using MS PAINT or other product.
1
Part 2. Creating a Graphics Window and Handling Images
4. Change text window to graphics by creating a graphics window:
Graphics 800, 600
color depth and mode—use default
5. Load images
Delete
Const TIE$="<-o->", XWING$=">-o-<"
And, after the line defining all your constants, add
Const UPKEY=200, LEFTKEY=203, RIGHTKEY=205, DOWNKEY=208, SPACE=57
Global xwingimg=LoadImage("Xwing.bmp")
Global dstarimg=LoadImage("DeathTrench.bmp")
 add (spell check!)
 add
Notes
A) To show the effect of non-masked images, we are using ones with non-black backgrounds
B) Right after these lines, load Tie4.bmp into tieimg
6. DELETE ALL REFERENCE TO shipstring$
including in Type Ship
Type Ship
Field x,y ;the position of the ship
Field hitpoints ;how many hits left
Field shipstring$ ;what the ship looks like
End Type
…
…
player\shipstring = XWING$
…
…
enemy\shipstring = TIE$
delete
delete
delete
2
7. Modify Display function to Draw the Images
Change display function
From:
Function Display(aShip.ship)
Text aShip\x, aShip\y, aShip\shipstring$
End Function
To:
Function Display()
DrawImage xwingimg, player\x, player\y
DrawImage tieimg, enemy\x, enemy\y
End Function
Also, modify the function call in the Main loop:
From
While Not KeyHit(1)
Display(player)
Display(enemy)
Delay 100
To:
While Not KeyHit(1)
Display()
Delay 100
8. Run the program, you should see Xwing and Tie fighter on screen
Notes
A) Use arrow to Move X-wing up into Tie—Tie is on top. It's background covers X-wing too
B) Reverse order of drawimage commands in Display so tieimg is first
C) Add another command in the Display function to draw the death star image at position 0,0
before the other two.
D) Switch to ship images that have been blacked out in background. At top of program, load these
images instead: Tie4black.bmp and Xwingblack.bmp. You can mask other colors using
MaskImage command, see p128
3
Part 3. Color and Lasers
The Color command takes three integers to set the red, green, blue proportions of all future lines drawn
Color 255, 0, 0
makes all future lines drawn pure red.
The line command draws a line from one point to another using the current color.
Line 10, 50 , 100, 200
draws a line from (10,50) to (100, 200)
9. Put these two together and you can make a new function to check and draw a laser beam on the
screen. This should go at the bottom of your program:
Function CheckXwingLaser()
If KeyDown(SPACE) Then
Color 255, 0, 0
; red = 255, 0, 0
Line player\x, player\y, player\x, player\y-25
Color 255,255,255
; white= 255,255,255
EndIf
End Function
black=
0,0,0
This draws a line from the player's current x/y position (upper left corner of the image) to a spot 25
pixels directly above.
You must add a function call in your main while loop to activate this function:
While Not KeyHit(1)
Display()
CheckXWingLaser( )
Delay 100
…
 add
Notes
A) Try changing the color of the laser beam
use 255, 0, 255
or 0,255,0 etc
B) You can align the laser beam (and all graphics commands) to the center of an image by adding
this line at the top of your program right before you load in the images:
AutoMidHandle True
 add
Global xwingimg=LoadImage("Xwing.bmp")
Global dstarimg=LoadImage("DeathTrench.bmp")
…
Run the program now and everything is displayed with x,y at center (now it skews the positioning
of the death star background image)
4
C) Change the positioning of the death star image so you place it in the center of the screen
Function Display()
DrawImage dstarimg, 0, 0
 change 0,0 to center pt of your screen
D) Now, using offsets from player\x and player\y, try to make 2 laser beams come out of the wing
tips and focus on a point about 75 pixels above the Xwing's center. Spend some time adjusting
the offsets – modify the line command already inside CheckXwingLaser() function. Then add a
second one. One beam will be something like this ( but needs work):
Line player\x-25, player\y-25, player\x, player\y-50
E) You can even draw a dot where those beams overlap using the oval command inside
CheckXwingLaser
Oval x,y,width,height[,solid]
(passing 1 to solid means it will be solid)
Oval player\x, player\y-75, 5, 5, 1
 add after line cmds in Display
E) Challenge: go back and use the distance and collision functions from last week's lab (already
included at the bottom of the original StarWars2 file for this lab). Inside CheckXwingLaser after
drawing the laser call the collision function using the Tie fighter's x,y and the laser dot's x,y
If there is a collision, then return 1 else return 0. Then in the main loop, if CheckXwingLaser clear
the screen, display congratulations, wait for a key to be pressed, and then quit.
Part 4. Would you like stars instead?
We can borrow the code from demo GPFK5-03 to change the background from the death star to starry
space. You can read pages 124 – 128 for more info.
10. Save StarWars3 as a new version, StarWars4
11. In the same editor, open GPFK5-03.bb and run it. This generates a small image of random stars,
then tiles it to create a larger background (see p124 – 128)
5
12. In file GPFK5-03.bb, copy all the code from ;For each dot, draw… to
SetBuffer FrontBuffer()
and past it into a new function you create at the bottom of the
StarWars4 file, called MakeBackground( )
Function MakeBackground()
 create at bottom of file
;For each dot, draw a random dot at a random location
 copy from
For loop = 0 To DOTS ;For every star
 demo GPFK5-03.bb
;draw only on created image

SetBuffer ImageBuffer(dotfieldimage)


;Plot the dot

Plot Rnd(LENGTH), Rnd(HEIGHT)

Next


;Set buffer back to normal

SetBuffer FrontBuffer()

End Function
THEN create another image handle after your existing image handles for the dot field image, and call
the function you just created:
AutoMidHandle True
Global tieimg=LoadImage("Tie4black.bmp")
Global xwingimg=LoadImage("Xwingblack.bmp")
Global dstarimg=LoadImage("DeathTrench.bmp")
Global dotfieldimage = CreateImage(LENGTH,HEIGHT)
 add
MakeBackground()
 add
13. In the Display function, comment out the line that draws the death star image, then add a line
immediately below it that displays the dotfieldimage using the TileImage command
Function Display()
; DrawImage dstarimg, 400,300
TileImage dotfieldimage
…
add comment symbol (;) at start
 add
(rest of function unchanged)
Finally, add the definition of new constants right after the ones you’ve already defined (top of file)
Const UPKEY=200, LEFTKEY=203, RIGHTKEY=205, DOWNKEY=208, SPACE=57
Const LENGTH = 100, HEIGHT = 100, DOTS = 100
 add
Now run the program, you should have a starry background. Change DOTS to have more or less
stars. If you want to switch back to Death Star background, simply remove the comment (;) from the
DrawImage dstarimg command and add one in front of the TileImage command.
6
Part 5. Smoothing motion with Page flipping
Motion is rather jerky. To smooth and speed up, you should switch to the standard game technique of
page flipping described in chapter 6. Only 4 steps are required:
1) right after Graphics 800,600 command (see top of file) add SetBuffer BackBuffer()
2) at the bottom of the MakeBackground function change SetBuffer FrontBuffer() to
SetBuffer BackBuffer()
3) in main loop comment out the
Delay 100
command
4) in main loop add a
Flip command on a line right before the
(see chapter 6 for full explanation)
( put ; in front of line)
Cls command
7
Download