Edit: Please Mods can you change the title to "Space Duel"?
Hi all! First of all I want you to know that I have never played Space Dual if there is a game called that out there. Second I'm having trouble with the controls. I'm trying to use vectors for my game so I can learn how to use them better. Also I'm very new to programming. Here's my code so you can help me figure out what's wrong:
Rem *** Declare constants ***
#CONSTANT leftshipid 1
#CONSTANT rightshipid 2
#CONSTANT maximumshipspeed 30
#CONSTANT missilespeed 15
#CONSTANT screenheight 1024
#CONSTANT screenwidth 1280
Rem *** Define types ***
Type MissileType
spriteno as integer
trajectory as integer
moves as integer
endtype
type ShipType
spriteno as integer `Ship's sprite number
velocity as integer `Ship's velocity vector number
angle as float `Angle of rotation of ship
missile as MissileType `Ship's missile sprite number
endtype
Rem *** Declare globals ***
GLOBAL leftship as ShipType
GLOBAL rightship as ShipType
Rem *** Main program logic ***
InitialiseGame()
repeat
keyspressed = HandleKeyboard()
leftship.angle = HandleShip(leftship,keyspressed)
rightship.angle = HandleShip(rightship,keyspressed >> 4)
kill = HandleMissiles()
UNTIL kill <> 0
GameOver(kill)
END
FUNCTION InitialiseGame()
SetUpScreen()
ShowSplashScreen()
InitialiseShipsData()
PrepareSprites()
ENDFUNCTION
FUNCTION SetUpScreen()
Rem *** Set screen resolution ***
SET DISPLAY MODE screenwidth,screenheight,32
Rem *** Create a black background ***
COLOR BACKDROP 0
BACKDROP ON
ENDFUNCTION
FUNCTION ShowSplashScreen()
Rem *** Load mouse tip sprite ***
LOAD IMAGE "1pixel.bmp",4
sprite 4,0,0,4
HIDE SPRITE 4
Rem *** Load splash screen as sprite ***
LOAD IMAGE "splashduel.bmp",5
sprite 5,0,0,5
Rem *** Load start button sprite ***
CREATE ANIMATED SPRITE 6,"button1.bmp",3,1,6
sprite 6,620,900,6
Rem *** Start button not pressed ***
pressed = 0
repeat
Rem *** Get mouse position ***
x = mousex()
y = mousey()
sprite 4,x,y,4
Rem *** IF mouse over start button ***
if SPRITE HIT(4,6)>0
Rem *** IF mouse clicked over start button ***
if mouseclick() > 0
Rem *** Change button to frame 3 ***
SET SPRITE FRAME 6,3
Rem *** Rcord start clicked ***
pressed = 1
else
Rem *** IF mouse not clicked, set to frame 2 ***
SET SPRITE FRAME 6,2
endif
else
Rem *** If mouse not over start, use frame 1 ***
SET SPRITE FRAME 6,1
ENDIF
UNTIL pressed = 1
Rem *** Wait so frame 3 has time to show ***
wait 500
Rem *** Delete all sprites used here ***
DELETE SPRITE 4
DELETE SPRITE 5
DELETE SPRITE 6
Rem *** Hide mouse pointer during game ***
HIDE MOUSE
ENDFUNCTION
FUNCTION InitialiseShipsData()
Rem *** Initialise left ship variable ***
leftship.spriteno = leftshipid
leftship.velocity = leftshipid
leftship.angle = 0
leftship.missile.spriteno = leftshipid + 10
leftship.missile.trajectory = leftshipid + 10
leftship.missile.moves = 0
Rem *** Create ship's velocity vector ***
result = MAKE VECTOR2(leftship.velocity)
SET VECTOR2 leftship.velocity,0,0
Rem *** Initialise right ship variable ***
rightship.spriteno = rightshipid
rightship.velocity = rightshipid
rightship.angle = 0
rightship.missile.spriteno = rightshipid + 10
rightship.missile.trajectory = rightshipid + 10
rightship.missile.moves = 0
Rem *** Create ship's velocity vector ***
result = MAKE VECTOR2(rightship.velocity)
SET VECTOR2 rightship.velocity,0,0
ENDFUNCTION
FUNCTION PrepareSprites()
Rem *** Set transparent color to magenta ***
SET IMAGE COLORKEY 255,0,255
Rem *** Load left ship's animated sprite ***
CREATE ANIMATED SPRITE leftship.spriteno,"ship02.bmp",3,1,1
Rem *** Move its origin to center ***
OFFSET SPRITE leftship.spriteno,SPRITE WIDTH(leftship.spriteno)/2,SPRITE HEIGHT(leftship.spriteno)/2
Rem *** Position left ship ***
sprite leftship.spriteno,100,SCREEN HEIGHT()/2,1
Rem *** Load right ship's animated sprite ***
CLONE SPRITE leftship.spriteno,rightship.spriteno
Rem *** Position right ship ***
sprite rightship.spriteno,SCREEN WIDTH()-100,SCREEN HEIGHT()/2,2
Rem *** Load image used by missile ***
LOAD IMAGE "missilemag.bmp",2
ENDFUNCTION
FUNCTION HandleKeyboard()
Rem *** No keys pressed ***
keyspressed = 0
Rem *** if z pressed set bit 0 ***
if keystate(44) = 1
keyspressed = keyspressed || %1
ENDIF
Rem *** if x pressed set bit 1 ***
if keystate(45) = 1
keyspressed = keyspressed || %10
ENDIF
Rem *** if c pressed set bit 2 ***
if keystate(46) = 1
keyspressed = keyspressed || %100
ENDIF
Rem *** if v pressed set bit 3 ***
if keystate(47) = 1
keyspressed = keyspressed || %1000
ENDIF
Rem *** if 1 pressed set bit 4 ***
if keystate(79) = 1
keyspressed = keyspressed || %10000
ENDIF
Rem *** if 2 pressed set bit 5 ***
if keystate(80) = 1
keyspressed = keyspressed || %100000
ENDIF
Rem *** if . pressed set bit 6 ***
if keystate(83) = 1
keyspressed = keyspressed || %1000000
ENDIF
Rem *** if Enter pressed set bit 7 ***
if keystate(156) = 1
keyspressed = keyspressed || %10000000
ENDIF
ENDFUNCTION keyspressed
FUNCTION HandleShip(ship as ShipType,keyspressed)
Rem *** if bit 0, add to angle ***
if (keyspressed && 1) > 0
ship.angle = wrapvalue(ship.angle - 5)
ENDIF
Rem *** if bit 1, subtract from angle ***
if (keyspressed && 2) > 0
ship.angle = wrapvalue(ship.angle + 5)
ENDIF
Rem *** if bit 2 set then ***
if (keyspressed && 4) > 0
Rem *** Calculate thrust vector ***
thrustxoffset# = cos(ship.angle+270)
thrustyoffset# = sin(ship.angle+270)
thrustvector = 2
result = MAKE VECTOR2(thrustvector)
SET VECTOR2 thrustvector,thrustxoffset#,thrustyoffset#
Rem *** Add thrust to velocity ***
ADD VECTOR2 ship.velocity,ship.velocity,thrustvector
Rem *** Reduce speed if too fast ***
if length vector2(ship.velocity) > maximumshipspeed
multiply vector2 ship.velocity,maximumshipspeed/LENGTH VECTOR2(ship.velocity)
endif
Rem *** Show engine firing ***
PLAY sprite ship.spriteno,2,3,20
else
Rem *** Show normal ship ***
SET SPRITE FRAME ship.spriteno,1
ENDIF
Rem *** if bit 3 set and missile doesn't exist, fire missile ***
if (keyspressed && 8) > 0 AND (SPRITE EXIST(ship.missile.spriteno)) < 1
CreateMissile(ship)
ENDIF
Rem *** Rotate sprite to latest angle ***
ROTATE SPRITE ship.spriteno,ship.angle
Rem *** Move sprite by velocity amount ***
SPRITE ship.spriteno,SPRITE X(ship.spriteno)+X VECTOR2(ship.velocity),SPRITE Y(ship.spriteno)+Y VECTOR2(ship.velocity),1
WrapShip(ship)
ENDFUNCTION ship.angle
FUNCTION CreateMissile(ship as ShipType)
Rem *** IF missile already exists, exit routine ***
if SPRITE EXIST(ship.missile.spriteno)
exitfunction
ENDIF
Rem *** Missile's basic velocity based on ship's angle ***
launchvector = 31
result = MAKE VECTOR2(launchvector)
launchmissileX# = cos(ship.angle+270)*15
launchmissileY# = sin(ship.angle+270)*15
SET VECTOR2 launchvector,launchmissileX#,launchmissileY#
Rem *** Missile's path is basic velocity + ship's velocity ***
result = MAKE VECTOR2(ship.missile.trajectory)
ADD VECTOR2 ship.missile.trajectory,ship.velocity,launchvector
Rem *** Rotate and position sprite to front of ship ***
sprite ship.missile.spriteno, SPRITE X(ship.spriteno),SPRITE Y(ship.spriteno),2
OFFSET SPRITE ship.missile.spriteno,SPRITE WIDTH(ship.missile.spriteno)/2,SPRITE HEIGHT(ship.missile.spriteno)/2
ROTATE SPRITE ship.missile.spriteno,SPRITE ANGLE(ship.spriteno)
MOVE SPRITE ship.missile.spriteno,50
Rem *** Delete the basic velocity vector used ealier ***
result = DELETE VECTOR2(launchvector)
ENDFUNCTION
FUNCTION WrapShip(ship as ShipType)
Rem *** IF off left edge, bring back on right edge ***
if SPRITE X(ship.spriteno) < 0
sprite ship.spriteno, SCREEN WIDTH(),SPRITE Y(ship.spriteno),ship.spriteno
else
Rem *** IF off right edge, bring back at left ***
if SPRITE X(ship.spriteno) > SCREEN WIDTH()
sprite ship.spriteno, 0,SPRITE Y(ship.spriteno),ship.spriteno
else
Rem *** IF off top, bring on to bottom ***
if SPRITE Y(ship.spriteno) < 0
sprite ship.spriteno, SPRITE X(ship.spriteno),SCREEN HEIGHT(),ship.spriteno
else
Rem *** IF off bottom, bring back at top ***
if SPRITE Y(ship.spriteno) > SCREEN HEIGHT()
sprite ship.spriteno,SPRITE X(ship.spriteno),0,ship.spriteno
endif
endif
endif
ENDIF
ENDFUNCTION
FUNCTION HandleMissiles()
kill = 0
Rem *** IF the left ship's missile exists THEN ***
if SPRITE EXIST(leftship.missile.spriteno)
Rem *** Move missile on screen ***
MOVE SPRITE leftship.missile.spriteno,LENGTH VECTOR2(leftship.missile.trajectory)
Rem *** IF missile hits ship ***
if SPRITE HIT(leftship.missile.spriteno,rightship.spriteno) > 0
Rem *** Delete missile and rightship ***
DELETE SPRITE leftship.missile.spriteno
result = DELETE VECTOR2(leftship.missile.trajectory)
leftship.missile.moves = 0
DELETE SPRITE rightship.spriteno
kill = rightship.spriteno
else
Rem *** Increment the number of moves made ***
inc leftship.missile.moves
Rem *** IF more than 30 moves, destroy missile ***
if leftship.missile.moves > 30
DELETE SPRITE leftship.missile.spriteno
result = DELETE VECTOR2(leftship.missile.trajectory)
leftship.missile.moves = 0
endif
endif
ENDIF
if SPRITE EXIST (rightship.missile.spriteno)
MOVE SPRITE rightship.missile.spriteno,LENGTH VECTOR2(rightship.missile.trajectory)
if SPRITE HIT(rightship.missile.spriteno,leftship.spriteno) > 0
Rem *** Delete missile and rightship ***
DELETE SPRITE rightship.missile.spriteno
result = DELETE VECTOR2(rightship.missile.trajectory)
rightship.missile.moves = 0
DELETE SPRITE leftship.spriteno
kill = leftship.spriteno
else
inc rightship.missile.moves
if rightship.missile.moves > 30
DELETE SPRITE rightship.missile.spriteno
result = DELETE VECTOR2(rightship.missile.trajectory)
rightship.missile.moves = 0
endif
endif
ENDIF
ENDFUNCTION kill
FUNCTION GameOver(kill)
Rem *** Hide any sprite still on screen ***
HIDE ALL SPRITES
Rem *** Create a new sprite ***
CREATE ANIMATED SPRITE 3,"ship02.bmp",3,1,1
OFFSET SPRITE 3,SPRITE WIDTH(3)/2, SPRITE HEIGHT(3)/2
sprite 3,640,480,1
Rem *** Set sprite's angle to zero ***
angle = 0
Rem *** Set font details ***
SET TEXT FONT "Arial Black"
SET TEXT SIZE 40
Rem *** Record start time ***
startime = timer()
repeat
Rem *** Display screen title ***
SET CURSOR 550,100
print "Game Over"
Rem *** Rotate ship ***
ROTATE SPRITE 3,angle
angle = wrapvalue(angle+5)
Rem *** Display winner details ***
SET CURSOR 510,900
if kill = 2
print "Left ship wins"
else
print "Right ship wins"
ENDIF
UNTIL timer() - startime > 8000
ENDFUNCTION
Thanks for any help you can give!
{0br4|<!ng