Oh Arse the code thingy screwed up. try again
AUTOCAM OFF
SYNC ON
SET GLOBAL COLLISION ON
COLOR BACKDROP RGB(0,0,0)
GOSUB setup
GOSUB loadstore
DO
SYNC
GOSUB keys
GOSUB collisions
GOSUB position_objects
GOSUB position_trail
`PRINT SCREEN FPS()
`PRINT SCORE
PRINT o(4).throttle
PRINT o(4).speed.x
PRINT o(4).speed.y
PRINT o(4).rot
PRINT OBJECT ANGLE Z(4)
LOOP
END
setup:
TYPE twoD
x AS FLOAT
y AS FLOAT
ENDTYPE
TYPE obj
pos AS twoD
speed AS twoD
rot AS FLOAT
rotrate AS FLOAT
brake AS FLOAT
throttlebrake AS FLOAT
decay AS INTEGER
size AS INTEGER
is AS STRING
throttle AS FLOAT
ENDTYPE
TYPE eff
pos AS twoD
speed AS twoD
rot AS INTEGER
rotrate AS INTEGER
decay AS INTEGER
is AS STRING
ENDTYPE
o_no=200
trail_base=201
trail_number=100
fire_rate=250
fire_timer=0
trail_timer=0
throttle#=0
score=0
DIM n(1) AS twoD
DIM o(o_no) AS obj
MAKE OBJECT CONE 1,25
ZROTATE OBJECT 1,270
FIX OBJECT PIVOT 1
COLOR OBJECT 1,RGB(0,255,0)
LOAD IMAGE "icon1.bmp",1
o(1).brake=0.98
o(1).throttlebrake=0.98
o(1).decay=-1
o(1).is="player"
o(2).pos.x=0
o(2).pos.y=-500
o(2).speed.x=.2
o(2).speed.y=.2
o(2).is="rock"
o(2).brake=1
o(2).decay=-1
o(2).size=8
MAKE OBJECT SPHERE 2,o(2).size*10
POSITION OBJECT 2,o(2).pos.x,o(2).pos.y,0
ZROTATE OBJECT 2,o(2).rot
o(3).pos.x=0
o(3).pos.y=500
o(3).speed.x=.2
o(3).speed.y=-0.2
o(3).is="rock"
o(3).brake=1
o(3).decay=-1
o(3).size=8
MAKE OBJECT SPHERE 3,o(3).size*10
POSITION OBJECT 3,o(3).pos.x,o(3).pos.y,0
ZROTATE OBJECT 3,o(3).rot
o(4).pos.x=0
o(4).pos.y=RND(500)
o(4).speed.x=1
o(4).speed.y=1
o(4).is="homer"
o(4).brake=.9
o(4).throttlebrake=1
o(4).decay=-1
o(4).size=8
o(4).rotrate=0
o(4).throttle=5
MAKE OBJECT CONE 4, 100
ZROTATE OBJECT 4,270
FIX OBJECT PIVOT 4
POSITION OBJECT 4, o(4).pos.x, o(4).pos.y, 0
ZROTATE OBJECT 4, o(4).rot
set object rotation zyx 4
DIM trail(trail_number) AS eff
POSITION CAMERA 0,0,-1000
POINT CAMERA 0,0,0
RETURN
keys:
IF LEFTKEY() THEN o(1).rot=WRAPVALUE(o(1).rot+0.5)
IF RIGHTKEY() THEN o(1).rot=WRAPVALUE(o(1).rot-0.5)
IF SPACEKEY() AND fire_timer=0
fire_timer=fire_rate
fire(o(1).pos.x,o(1).pos.y,o(1).rot,1,1000,o_no)
ENDIF
IF fire_timer>0 THEN DEC fire_timer,1
IF trail_timer>0 THEN DEC trail_timer,1
IF UPKEY()
o(1).throttle=o(1).throttle+0.0025
IF o(1).throttle>0.07 THEN o(1).throttle=0.07
N=spawntrail(trail_number,trail_base)
IF N>0 AND trail_timer=0
SHOW OBJECT N+trail_base
GHOST OBJECT ON N+trail_base
trail(N).pos.x=o(1).pos.x
trail(N).pos.y=o(1).pos.y
trail(N).speed.x=-o(1).speed.x/2
trail(N).speed.y=-o(1).speed.y/2
trail(N).rotrate=4
trail(N).decay=200
trail(N).is="trail"
trail_timer=5
ENDIF
ENDIF
RETURN
position_objects:
FOR L=1 TO o_no
IF o(L).is="homer"
rem work out angle between homer and player
xdiff#=o(L).pos.x-o(1).pos.x
ydiff#=o(L).pos.y-o(1).pos.y
ang#=WRAPVALUE(ATANFULL(ydiff#,xdiff#)+180):
o(L).rot=ang#
n(1).x=o(L).throttle*COS(o(L).rot)
n(1).y=o(L).throttle*SIN(o(L).rot)
o(L).speed.x=n(1).x
o(L).speed.y=n(1).y
IF o(L).speed.x<0.00001 THEN o(L).speed.x=0
IF o(L).speed.y<0.00001 THEN o(L).speed.y=0
INC o(L).pos.x, o(L).speed.x
INC o(L).pos.y, o(L).speed.y
ELSE
o(L).throttle=o(L).throttle*o(L).throttlebrake
n(1).x=o(L).throttle*COS(o(L).rot)
n(1).y=o(L).throttle*SIN(o(L).rot)
INC o(L).speed.x, n(1).x
INC o(L).speed.y, n(1).y
o(L).speed.x=o(L).speed.x*o(L).brake
o(L).speed.y=o(L).speed.y*o(L).brake
INC o(L).pos.x, o(L).speed.x
INC o(L).pos.y, o(L).speed.y
ENDIF
screensize=500
IF o(L).pos.x>screensize THEN o(L).pos.x=-screensize
IF o(L).pos.x<-screensize THEN o(L).pos.x=screensize
IF o(L).pos.y>screensize THEN o(L).pos.y=-screensize
IF o(L).pos.y<-screensize THEN o(L).pos.y=screensize
IF o(L).decay>0 THEN DEC o(L).decay ,1
INC o(L).rot, o(L).rotrate
IF OBJECT EXIST(L)
POSITION OBJECT L,o(L).pos.x,o(L).pos.y,0
ZROTATE OBJECT L,o(L).rot
IF o(L).decay=0 THEN DELETE OBJECT L
ENDIF
NEXT L
RETURN
FUNCTION spawnobject(X)
`returns the next free object number
R=-1
FOR L=X TO 1 STEP -1
IF OBJECT EXIST(L)=0 THEN R=L
NEXT L
ENDFUNCTION R
FUNCTION spawntrail(X,Y)
`returns the next free effect number
R=-1
FOR L=X TO 1 STEP -1
IF OBJECT VISIBLE(L+Y)=0 THEN R=L
NEXT L
ENDFUNCTION R
FUNCTION fire(X#,Y#,R#,S,D,O)
N=spawnobject(O)
IF N=-1 THEN EXITFUNCTION
MAKE OBJECT SPHERE N,10
COLOR OBJECT N,RGB(255,0,0)
o(N).pos.x=X#
o(N).pos.y=Y#
o(N).rot=R#
n(1).x=COS(o(N).rot)
n(1).y=SIN(o(N).rot)
o(N).speed.x=n(1).x*S
o(N).speed.y=n(1).y*S
o(N).decay=D
o(N).brake=1
o(N).is="bullet"
ENDFUNCTION
collisions:
FOR L=o_no TO 1 STEP -1
IF OBJECT EXIST(L)
X=OBJECT COLLISION(L,0)
IF X>0
IF o(L).is="rock" AND o(X).is="bullet"
INC SCORE,1
DELETE OBJECT X
DELETE OBJECT L
IF o(L).size>1
N=spawnobject(o_no)
IF N>0
o(N).is="rock"
o(N).pos.x=o(L).pos.x
o(N).pos.y=o(L).pos.y
o(N).speed.x=0-o(L).speed.x*1.5
o(N).speed.y=o(L).speed.y*1.5
o(N).size=o(L).size/2
o(N).decay=-1
MAKE OBJECT SPHERE N,o(N).size*10
ENDIF
IF N>0
N=spawnobject(o_no)
o(N).is="rock"
o(N).pos.x=o(L).pos.x
o(N).pos.y=o(L).pos.y
o(N).speed.x=o(L).speed.x*1.5
o(N).speed.y=0-o(L).speed.y*1.5
o(N).size=o(L).size/2
o(N).decay=-1
MAKE OBJECT SPHERE N,o(N).size*10
ENDIF
ENDIF
ENDIF
IF o(L).is="rock" AND o(X).is="player"
COLOR OBJECT X,RGB(RND(255),RND(255),RND(255))
ENDIF
ENDIF
ENDIF
NEXT L
RETURN
position_trail:
FOR L=1 TO trail_number
IF OBJECT EXIST(L+trail_base)
INC trail(L).pos.x, trail(L).speed.x
INC trail(L).pos.y, trail(L).speed.y
INC trail(L).rot, trail(L).rotrate
trail(L).speed.x=trail(L).speed.x*0.99
trail(L).speed.y=trail(L).speed.y*0.99
DEC trail(L).decay, 1
POSITION OBJECT L+trail_base,trail(L).pos.x,trail(L).pos.y,0
ZROTATE OBJECT L+trail_base,trail(L).rot
`IF trail(L).decay<100 THEN FADE OBJECT L+trail_base, trail(L).decay
`FADE OBJECT L+trail_base, trail(L).decay
IF trail(L).decay=0 THEN HIDE OBJECT L+trail_base
ENDIF
NEXT L
RETURN
loadstore:
rem makes 100 trail objects
FOR L= trail_base TO trail_base+trail_number
MAKE OBJECT PLAIN L,20,20
COLOR OBJECT L, RGB(255,0,0)
SET OBJECT COLLISION OFF L
HIDE OBJECT L
NEXT L
RETURN