var x, y : int := 0
var key : array char of boolean
var plane : int
plane := Pic.FileNew ("X-Wing1.bmp")
var back := Pic.FileNew ("space.jpg")
x := maxx div 2
y := maxy div 2
setscreen ("graphics:max;max")
View.Set ("offscreenonly, nocursor")
% delay for background
setscreen ("graphics:max,max,offscreenonly")
proc myDelay (var last : int, rate : int)
var now : int
loop
clock (now)
exit when now - last >= rate
end loop
last := now
end myDelay
% background
proc background (var y : int)
y := y - 6
if y < maxy - 1178 then
y := 0
end if
Pic.Draw (back, 0, y, picCopy)
end background
var gunReady : boolean := true % because processes can not take call be reference
% parameters this need to be global
type shotType : % Note how the use of records makes it easy to organize my code
record
x, y : real
vx, vy : real %velocity of x, y
live : boolean
end record
process coolGun
delay (200)
gunReady := true
end coolGun
proc vectorToXY (mag, ang : real, var x, y : real)
x := cosd (ang) * mag
y := sind (ang) * mag
end vectorToXY
proc xyToVector (x, y : real, var mag, ang : real)
mag := sqrt (x ** 2 + y ** 2)
if mag > 0 then
if x >= 0 then
ang := arcsind (y / mag)
else
ang := 180 - arcsind (y / mag)
end if
else
ang := 0
end if
end xyToVector
proc trackInput (var mag, ang : real, var shotFired : boolean)
shotFired := false
var chars : array char of boolean
Input.KeyDown (chars)
if chars (' ') then %Fire a shot
shotFired := true
end if
end trackInput
proc addShot (var shots : array 1 .. 10 of shotType)
var mx, my, mb : int
if gunReady then
for i : 1 .. 10
if not shots (i).live then
gunReady := false
fork coolGun % this will set gunReady back to true in 150 mill
shots (i).live := true
shots (i).x := x - 7 % This is so the shots come out of the ship
shots (i).y := y + 9
exit % this is so that the shot only takes up one slot
end if
end for
end if
end addShot
proc trackShots (var shots : array 1 .. 10 of shotType)
for i : 1 .. 10
if shots (i).live then
if shots (i).y > maxy then
shots (i).live := false % so we can recycle the shots
else
shots (i).y += 5
end if
end if
end for
end trackShots
proc drawScene (mag, ang : real, shots : array 1 .. 10 of shotType)
var linex, liney : real
var dx, dy : real
vectorToXY (mag, ang, dx, dy)
vectorToXY (25, ang, linex, liney)
for i : 1 .. 10
if shots (i).live then
drawfilloval (round (shots (i).x + 28), round (shots (i).y - 5), 1, 10, brightblue)
drawfilloval (round (shots (i).x - 24), round (shots (i).y - 5), 1, 10, brightblue)
end if
end for
end drawScene
var shots : array 1 .. 10 of shotType % All the data about the 10 shots that our
% gun can fire
for i : 1 .. 10
shots (i).live := false % clear the shots array to allow for new shots
end for
% ---------------------------- MAINLINE ------------------------------------
var backy, last := 0
loop
Input.KeyDown (key)
if key (KEY_UP_ARROW) then
y := y + 4
end if
if key (KEY_DOWN_ARROW) then
y := y - 4
end if
if key (KEY_RIGHT_ARROW) then
x := x + 4
end if
if key (KEY_LEFT_ARROW) then
x := x - 4
end if
x := max (35, x)
y := max (35, y)
x := min (maxx - 93, x)
y := min (maxy - 10, y)
background (backy)
% Draw the plane
Pic.Draw (plane, x - 35, y - 35, picMerge)
% Controls
myDelay (last, 20)
View.Update
var shotFired : boolean % Did the user try to shoot (won't shoot if gun is "hot"
var ang : real := 0 % current angle of the big gun
var mag : real := 10 % Amount of power being used for the shots
trackInput (mag, ang, shotFired)
if shotFired then
addShot (shots)
end if
trackShots (shots)
drawScene (mag, ang, shots)
View.Update
delay (10)
end loop
|