Couldn't resist! Added audio, a few meshes, a particle sprite and a few other odds and ends.
http://www.headpile.com/stuff/shootermedia.zip
http://www.headpile.com/stuff/shootermedia.zip
Graphics3D 800,600,32,0 SetBuffer BackBuffer() SeedRnd MilliSecs() light = CreateLight() AmbientLight 100,100,100 Global timer# = MilliSecs() Global score Global madnum Global wavenum = 1 Global intermission = False Global ecount = 0 Global level = 0 Global health = 100 Global wavemax Global gameover = 1 Global launchtimer Global shot1 = LoadSound("shot1.ogg") SoundVolume shot1,.4 Global explosion1 = LoadSound("explosion1.ogg") SoundVolume explosion1,.6 tune1 = LoadSound("shooter1.ogg") SoundVolume tune1,.3 LoopSound tune1 PlaySound tune1 Global explsprite = LoadSprite("particle.png",1) HideEntity explsprite Global enemy1mesh = LoadMesh("enemy1.3ds") Global enemy1tex = LoadTexture("enemy1tex.jpg") EntityTexture enemy1mesh,enemy1tex HideEntity enemy1mesh Global proj1 = LoadMesh("proj1.3ds") EntityTexture proj1,enemy1tex HideEntity proj1 FreeTexture enemy1tex Type enemy Field mesh Field id Field angry = False Field angerspeed# Field xrot# Field yrot# Field mov# End Type ;Spacesphere ;Create the Texture sptex = CreateTexture(1024,1024,1+8) SetBuffer TextureBuffer(sptex) For a = 1 To 200 Plot Rand(0,1023),Rand(0,1023) Next SetBuffer BackBuffer() TextureBlend sptex,5 ;Create the Sphere Global spbox = CreateSphere(5) ScaleEntity spbox,1000,1000,1000 EntityTexture spbox,sptex ScaleTexture sptex,.25,.5 EntityFX spbox,1 FlipMesh spbox EntityOrder spbox,99999 camera = CreateCamera() MoveEntity camera,0,12,-20 ; create cannon Global base = LoadMesh("weap_plat.3ds") basetex = LoadTexture("weap_plat.png") EntityTexture base,basetex ScaleMesh base,.3,.3,.3 EntityFX base,1 EntityAlpha base,.6 PositionEntity base,0,4,0 barrel = LoadMesh("weap_trigun.3ds") barreltex = LoadTexture("weap_trigun.png") EntityTexture barrel,barreltex ScaleEntity barrel,3,3,3 RotateMesh barrel,0,180,0 Muzzle = CreatePivot(Barrel) PositionEntity Muzzle,0,0,1 PositionEntity barrel,0,8,0 EntityParent barrel,base ; Make Ground Global Ground = CreatePlane() i = CreateImage(64,64) SetBuffer(ImageBuffer(i)) Color 0,0,0:Rect 0,0,32,32:Rect 32,32,32,32 Color 100,100,100:Rect 32,0,32,32:Rect 0,32,32,32 checker = CreateTexture(64,64) CopyRect 0,0,64,64,0,0,ImageBuffer(i),TextureBuffer(checker) FreeImage i ScaleTexture checker ,50,50 EntityTexture ground,checker Color 0,200,0 xspin# = 0 yspin# = 0 Repeat xspin = xspin - (MouseXSpeed()/15.0) ; make Float yspin = yspin - (MouseYSpeed()/15.0) ; make Float If xspin < -55 Then xspin = -55 If xspin > 55 Then xspin = 55 If yspin > 10 Then yspin = 10 If yspin < -75 Then yspin = -75 MoveMouse 320,240 RotateEntity base,0,xspin/12,0 RotateEntity barrel,yspin,xspin,0 RotateEntity camera,yspin/2,xspin/2,0 updategrenade updatepoof updateanger If gameover = 0 If MouseHit(1) Then NewGrenade(Muzzle) PlaySound shot1 EndIf For e.enemy = Each enemy If e\angry = False TurnEntity e\mesh,e\xrot,e\yrot,0 MoveEntity e\mesh,0,0,e\mov RotateMesh e\mesh,0,.02,0 Else PointEntity e\mesh,base MoveEntity e\mesh,0,0,e\angerspeed# EndIf Next TurnEntity spbox,.004,0,0 Else mainmenu() EndIf RenderWorld Text GraphicsWidth()/2,60,"SCORE: "+score,1,1 Text GraphicsWidth()/2,80,"LEVEL: "+level+" WAVES: "+wavemax,1,1 Select True Case level = 1 wavemax = 1 Case level = 2 wavemax = 2 Case level = 3 wavemax = 3 Case level = 4 wavemax = 4 Case level = 5 wavemax = 5 Case level = 6 level = 1 End Select If intermission = False If MilliSecs() > timer + 6000 If wavenum < wavemax wavenum = wavenum + 1 CreateEnemies() EndIf EndIf Else If MilliSecs() < timer Text GraphicsWidth()/2,220,"GET READY FOR LEVEL "+(level+1),1,1 wavenum = 1 Else intermission = False level = level + 1 CreateEnemies() EndIf EndIf HidePointer() Flip Until KeyHit(1) Type Grenade Field Mesh Field Phys Field Life Field Explode End Type Type poof Field Mesh Field Phys Field Life Field Explode End Type Function MainMenu() Text GraphicsWidth()/2,200,"GAME OVER",1,1 Text GraphicsWidth()/2,240,"PRESS SPACE TO START",1,1 If KeyHit(57) FlushMouse() gameover = 0 score = 0 timer = MilliSecs() + 6000 intermission = True EndIf For e.enemy = Each enemy FreeEntity e\mesh Delete e Next End Function Function NewGrenade(Launcher) C.Grenade = New Grenade C\Mesh = CopyEntity (proj1) ;CreateSphere(8) ScaleEntity c\mesh,.4,.4,.4 C\Phys = CreatePivot() PositionEntity C\Mesh,EntityX(Launcher,True),EntityY(Launcher,True),EntityZ(Launcher,True) RotateEntity c\Phys,EntityPitch(Launcher,True),EntityYaw(Launcher,True),EntityRoll(Launcher,True) MoveEntity c\phys,0,0,2 EntityShininess c\mesh,1 c\Life = 150 c\explode = True End Function Function Clip(x) If x>255 Then x=255 Return x End Function Function NewExplode(Launcher) For n=1 To 100 C.Grenade = New Grenade C\Mesh = CopyEntity (explsprite) EntityColor C\Mesh,Rand(100,255),Rand(100,255),0 C\Phys = CreatePivot() PositionEntity C\Mesh,EntityX(Launcher,True),EntityY(Launcher,True),EntityZ(Launcher,True) ScaleEntity c\mesh,Rnd(.1,.4),Rnd(.1,.4),Rnd(.1,.4) PositionEntity c\Phys,Rnd(-.5,.5),Rnd(-1,1),Rnd(-.5,.5) EntityBlend c\mesh,3 c\Life = Rand(5,40) c\explode = False Next PlaySound explosion1 End Function Function EnemyExplode(e.enemy) For n=1 To 50 p.poof = New poof p\Mesh = CopyEntity (explsprite) EntityColor p\Mesh,0,Rand(10,255),Rand(10,255) p\Phys = CreatePivot() PositionEntity p\Mesh,EntityX(e\mesh,True),EntityY(e\mesh,True),EntityZ(e\mesh,True) ScaleEntity p\mesh,Rnd(.1,.4),Rnd(.1,.4),Rnd(.1,.4) PositionEntity p\Phys,Rnd(-.5,.5),Rnd(-1,1),Rnd(-.5,.5) EntityBlend p\mesh,3 p\Life = Rand(5,20) p\explode = False Next End Function Function UpdateGrenade() For c.Grenade = Each Grenade TranslateEntity c\Mesh,EntityX(c\phys),EntityY(c\phys),EntityZ(c\phys) TranslateEntity c\phys,0,-.01,0 If EntityY(c\mesh)<.5 Then PositionEntity c\mesh,EntityX(c\mesh),.5,EntityZ(c\mesh) TranslateEntity c\phys,0,-EntityY(c\phys)*1.5,0 EndIf TurnEntity c\mesh,1,2,4 c\life = c\life - 1 If c\life = 0 Or MouseHit(2) Then CheckEnemy(c) ;time to kill? If c\explode Then NewExplode(c\mesh) FreeEntity c\mesh FreeEntity c\phys Delete c EndIf Next End Function Function UpdatePoof() For p.poof = Each poof TranslateEntity p\Mesh,EntityX(p\phys)*.4,EntityY(p\phys)*.2,EntityZ(p\phys)*.4 p\life = p\life - 1 If p\life = 0 FreeEntity p\mesh FreeEntity p\phys Delete p EndIf Next End Function Function CheckEnemy(c.grenade) For e.enemy = Each enemy If EntityDistance (c\mesh,e\mesh) < 10 If e\angry = False score = score + 5 Else score = score + 10 EndIf EnemyExplode(e) ecount = ecount - 1 If ecount = 0 intermission = True timer = MilliSecs() + 6000 EndIf FreeEntity e\mesh Delete e EndIf Next End Function Function CreateEnemies() x=-45 y=10 z=100 For i = 1 To 72 e.enemy = New enemy ecount = ecount + 1 e\id = i e\mesh = CopyEntity(enemy1mesh) EntityShininess e\mesh,1 Select True Case wavenum = 1 EntityColor e\mesh,255,255,0 e\angerspeed = Rnd(.2,.4) e\xrot = .8 e\yrot = 0 e\mov = -1 Case wavenum = 2 EntityColor e\mesh,0,255,255 e\angerspeed = Rnd(.2,.6) e\xrot = .8 e\yrot = 0 e\mov = -1 Case wavenum = 3 EntityColor e\mesh,255,255,255 e\angerspeed = Rnd(.4,.7) e\xrot = .8 e\yrot = 0 e\mov = -1 Case wavenum = 4 EntityColor e\mesh,255,0,255 e\angerspeed = Rnd(.6,.8) e\xrot = .8 e\yrot = 0 e\mov = -1 Case wavenum = 5 EntityColor e\mesh,0,100,255 e\angerspeed = Rnd(.6,1) e\xrot = .8 e\yrot = 0 e\mov = -1 End Select ScaleEntity e\mesh,.6,.6,.6 PositionEntity e\mesh,x,y,z x=x+5 If x = 45 y = y + 10 x = -45 EndIf Next timer = MilliSecs() End Function Function updateanger() For e.enemy = Each enemy madnum = Rand(1,3000) If e\id = madnum And EntityDistance(e\mesh,base) > 140 And EntityY(e\mesh) < 100 e\angry = True EntityColor e\mesh,255,0,0 EndIf If EntityDistance (e\mesh,base) < 4 EnemyExplode(e) FreeEntity e\mesh level = 0 gameover = 1 ecount = ecount - 1 If ecount = 0 intermission = True timer = MilliSecs() + 6000 EndIf Delete e EndIf Next End Function