`======================================================== `====================Simple FPS========================== `======================================================== `=======by culmor30====================================== `------CONTROLLER PROMPT------ `sync on:sync rate 0: `------CONTROLLER PROMPT------ sync on sync rate 60 color backdrop black hide mouse autocam off phy start global NextIDNumber = 0 global newy = 0 `=====Create player object===== PlayerObject = NextIDNumber() make object cube PlayerObject,2 scale object PlayerObject,2,20,2 position object PlayerObject,10,15,0 hide object PlayerObject `=====Create player object===== pbpx#=object position x(PlayerObject) pbpy#=object position y(PlayerObject) pbpz#=object position z(PlayerObject) `=====Add Level Light 1===== make light 1 set spot light 1,100,200 position light 1,200,350,100 point light 1,200,0,350 set light range 1,600 color light 1,rgb(255,255,255) `=====Add Level Light 1===== color light 0,255,255,255 `=====Add Level Light 2===== make light 2 set spot light 2,100,200 position light 2,100,350,200 point light 2,350,0,200 set light range 2,600 color light 2,rgb(255,255,255) `=====Add Level Light 2===== set normalization on `=====Level Fog===== `-(Only works if GFX card supports it) fog on fog color rgb(000,040,000) fog distance 350 set ambient light 2.0 color ambient light rgb(000,040,000) `=====Level Fog===== `=====Load Level===== LevelObject = NextIDNumber() load object "level.x", LevelObject position object LevelObject ,0,0,0 scale object LevelObject,400,400,400 set object collision to polygons LevelObject phy make rigid body static mesh LevelObject `=====Load Level===== `=====Load and position crosshair===== screen_height=screen height() screen_width=screen width() screen_center_x=screen_width / 2 screen_center_y=screen_height / 2 CrossHairImage = NextIDNumber() load image "crosshair.bmp",CrossHairImage,1 CrossHairSprite = NextIDNumber() sprite CrossHairSprite,screen_center_x - 50,screen_center_y - 50,CrossHairImage `=====Load and position crosshair===== `=====Character Controller===== phy make box character controller 1,pbpx#,pbpy#,pbpz#,2,20,2,1,1,50 `=====Character Controller===== `===Banner=== titleimg=NextIDNumber() load image "title.bmp",titleimg,1 titlesprite=NextIDNumber() sprite titlesprite,790,680,titleimg `===Banner=== type BulletType ObjectNumber as integer Distance as float endtype dim Bullets(10) as BulletType for b=0 to 10 NewBullet = NextIDNumber() make object sphere NewBullet,0.2 color object NewBullet,rgb(255,255,0) ` This is the object number. Bullets(b).ObjectNumber = NewBullet Bullets(b).Distance = -1.0 hide object NewBullet position object NewBullet,0,-999,0 next b sparktex = NextIDNumber() load image "sparktexture.bmp",sparktex,0 BulletsInFlight = 0 BulletRange# = 150.0 BulletVelocity# = 350.0 MovementSpeed# = 75.0 `Bullethole BulletHoleImage = NextIDNumber() load image "bullet hole.bmp", BulletHoleImage,1 OriginalBulletHole = NextIDNumber() make object plain OriginalBulletHole, 1, 1 texture object OriginalBulletHole, BulletHoleImage set object transparency OriginalBulletHole, 5 hide object OriginalBulletHole sparkexist# = particles exist(particleemitter) sparkdeltimer# = 1 cyclecount#=1 phy update 0 `Begin main loop: do PreviousCycleTime = CycleTime CycleTime = timer() ElapsedTime = CycleTime - PreviousCycleTime CyclesPerSecond# = 1000.0 / ElapsedTime oldx#=object position x(PlayerObject) oldy#=object position y(PlayerObject) oldz#=object position z(PlayerObject) `=====WASD Controls===== if keystate(17)=1 move object PlayerObject, MovementSpeed# / CyclesPerSecond# : phy move character controller 1, MovementSpeed# / CyclesPerSecond# else phy move character controller 1,0.0 endif if keystate(30)=1 then move object left PlayerObject, MovementSpeed# / CyclesPerSecond# if keystate(31)=1 move object PlayerObject, 0.0 - (MovementSpeed# / CyclesPerSecond#) : phy move character controller 1, 0.0 - (MovementSpeed# / CyclesPerSecond#) else phy move character controller 1,0.0 endif if keystate(32)=1 then move object right PlayerObject, MovementSpeed# / CyclesPerSecond# `=====WASD Controls===== x#=object position x(PlayerObject) y#=object position y(PlayerObject) z#=object position z(PlayerObject) `=====Camera/Player Obj Lock===== position camera object position x(PlayerObject),object position y(PlayerObject),object position z(PlayerObject) rotate camera camera angle x(),object angle y(PlayerObject),camera angle z() `=====Camera/Player Obj Lock===== `=====Camera Controls===== speed#=0.2 damper#=10.0 camy#=wrapvalue(camy#+mousemovex()*speed#):camx#=wrapvalue(camx#+mousemovey()*speed#) if camx#<=290 and camx#>180 then camx#=290 if camx#>=70 and camx#<180 then camx#=70 tx#=curvevalue(-camx#,tx#,damper#) ty#=curvevalue(-camy#,ty#,damper#) rotate camera camx#,object angle y(PlayerObject),0 yrotate object 1,camy# `=====Camera Controls===== `SPARKY'S SLIDING COLLISION FUNCTION CALL `slidingcollision(oldx#,oldy#,oldz#,x#,y#,z#,3,PlayerObject,LevelObject) if mouseclick() = 1 and FireTime < timer() - 200 gosub FireBullet FireTime = timer() endif ` Process the bullets that are in flight. if BulletsInFlight > 0 then gosub bullets inc sparkdeltimer# text 500,20,"Spark Deletion Timer: "+str$(sparkdeltimer#) inc cyclecount# text 500,40,"Cycle Count: "+str$(cyclecount#) text 500,60,"Frames Per Second: "+str$(screen fps()) `))$#@#!BULLET ARRAY!#@#$(( LineY = 10 for b = 0 to 10 inc LineY, 20 text 10, LineY, str$(bullets(b).ObjectNumber) + " / " + str$(bullets(b).Distance) next b inc LineY, 20 text 10, LineY,"Bullets in flight: "+str$(BulletsInFlight) phy update 1 phy update 0 sync loop `End main loop ` -------------------------------------------------------------------------------------------------- `========<=-=Bullets=-=>======== `---------->-=-Are-=-<---------- `========<=-=Annoying-=>======== FireBullet: ` Find the first unused bullet. for b = 0 to 10 ` If the bullet isn't in flight, position it at the point of origin. if Bullets(b).Distance = -1.0 BulletObject = Bullets(b).ObjectNumber show object BulletObject position object BulletObject, camera position x(), camera position y(), camera position z() rotate object BulletObject, camera angle x(), camera angle y(), camera angle z() ` Annotate this bullet as being in flight. Bullets(b).Distance = 0.0 inc BulletsInFlight ` We have our bullet, so exit. exit endif next b return ` -------------------------------------------------------------------------------------------------- bullets: for b = 0 to 10 ` If the bullet is in flight, see if it's going to hit something this program cycle. if Bullets(b).Distance > -1.0 BulletObject = Bullets(b).ObjectNumber ` Note the bullet's position. PositionX# = object position x(BulletObject) PositionY# = object position y(BulletObject) PositionZ# = object position z(BulletObject) ` Move the bullet to where it's going to be if it doesn't hit anything. move object BulletObject, BulletVelocity# / CyclesPerSecond# ` An impact has occured. NewBulletHole = NextIDNumber() instance object NewBulletHole, OriginalBulletHole position object NewBulletHole, newx# + normx# / 10.0, newy# + normy# / 10.0, newz# + normz# / 10.0 point object NewBulletHole, newx# + normx#, newy# + normy#, newz# + normz# `----____----Spark Particles----____---- particleemitter = NextIDNumber() `Spark Deletion Timer Stuff if sparkdeltimer#>30 if sparksexist#>0 `DELETE THE EMITTER HERE endif sparkdeltimer#=0 endif `-------- --------------- ` Reset the distance of flight for next use of bullet. Bullets(b).Distance = -1.0 dec BulletsInFlight hide object BulletObject ` An impact has not occured - the bullet will keep flying. else DistanceOfFlight# = Bullets(b).Distance + ThreeDimensionDistance#(PositionX#, PositionY#, PositionZ#, object position x(BulletObject), object position y(BulletObject), object position z(BulletObject)) ` control bullet flight distance if DistanceOfFlight# >= BulletRange# ` Reset the distance of flight for the next use of this bullet. Bullets(b).Distance = -1.0 dec BulletsInFlight hide object BulletObject ` The bullet's still flying, increase the distance of flight for next time. else Bullets(b).Distance = DistanceOfFlight# endif endif next b return ` -------------------------------------------------------------------------------------------------- ` -------------------------------------------------------------------------------------------------- function ThreeDimensionDistance#(FromX#, FromY#, FromZ#, ToX#, ToY#, ToZ#) ` calculate the distance between two points in three dimensions TempX# = abs(FromX# - ToX#) TempY# = abs(FromY# - ToY#) TempZ# = abs(FromZ# - ToZ#) ReturnValue# = sqrt((TempX# * TempX#) + (TempY# * TempY#) + (TempZ# * TempZ#)) endfunction ReturnValue# ` -------------------------------------------------------------------------------------------------- function NextIDNumber() ` determine ID numbers inc NextIDNumber endfunction NextIDNumber function newy() inc newy endfunction newy `------------------------------------------------------------------------------------------