home *** CD-ROM | disk | FTP | other *** search
/ DarkBasic Professional / DarkBasicPro.iso / data1.cab / Lang_Files_(English) / Help / tutorials / fpsgame.dba < prev    next >
Encoding:
Text File  |  2004-09-22  |  8.6 KB  |  322 lines

  1. rem Tutorial Final
  2.  
  3. rem Initial settings
  4. sync on : sync rate 100
  5. backdrop off : hide mouse
  6.  
  7. rem Select font
  8. set text font "arial" : set text size 16
  9. set text to bold : set text transparent
  10.  
  11. rem Loading prompt
  12. sync : center text screen width()/2,screen height()/2,"LOADING" : sync
  13.  
  14. rem Load all media for game
  15. gosub _load_game
  16.  
  17. rem Setup all objects for game
  18. gosub _setup_game
  19.  
  20. rem Game loop
  21. do
  22.  
  23.  rem Control game elements
  24.  gosub _control_player
  25.  gosub _control_gunandbullet
  26.  gosub _control_enemies
  27.  gosub _control_stats
  28.  
  29.  rem Update screen
  30.  sync
  31.  
  32. rem End loop
  33. loop
  34.  
  35. rem End program
  36. end
  37.  
  38. _control_player:
  39.  
  40. rem Control player direction
  41. rotate camera camera angle x(0)+(mousemovey()/2.0),camera angle y(0)+(mousemovex()/2.0),0
  42.  
  43. rem Control player movement
  44. cx#=camera angle x(0) : cy#=camera angle y(0)
  45. if upkey()=1 then xrotate camera 0,0 : move camera 0,0.2 : xrotate camera 0,cx#
  46. if downkey()=1 then xrotate camera 0,0 : move camera 0,-0.2 : xrotate camera 0,cx#
  47. if leftkey()=1 then yrotate camera 0,cy#-90 : move camera 0.2 : yrotate camera 0,cy#
  48. if rightkey()=1 then yrotate camera 0,cy#+90 : move camera 0.2 : yrotate camera 0,cy#
  49. if wrapvalue(camera angle x(0))>40 and wrapvalue(camera angle x(0))<180 then xrotate camera 0,40
  50. if wrapvalue(camera angle x(0))>180 and wrapvalue(camera angle x(0))<335 then xrotate camera 0,335
  51.  
  52. rem Apply simple gravity to player
  53. position camera camera position x(),camera position y()-0.1,camera position z()
  54.  
  55. rem Player is always focal point of sky
  56. position object SkyObj,camera position x(),camera position y(),camera position z()
  57.  
  58. rem Position listener at player for 3D sound
  59. position listener camera position x(),camera position y(),camera position z()
  60. rotate listener camera angle x(),camera angle y(),camera angle z()
  61.  
  62. rem In case of restart
  63. if restart=1
  64.    restart=0
  65.    set bsp collision off 1
  66.    rotate camera 0,0,0
  67.    position camera 2,2,2
  68.    set camera range 0.1,5000
  69.    set bsp camera collision 1,0,0.75,0
  70. endif
  71.  
  72. return
  73.  
  74. _control_gunandbullet:
  75.  
  76.  rem Control gun firing
  77.  if mouseclick()=1 and bullet=-50
  78.   bullet=100
  79.   play sound GunSnd
  80.   position object BulletObj,camera position x(0),camera position y(0),camera position z(0)
  81.   rotate object BulletObj,camera angle x(0),camera angle y(0),0
  82.   set bsp object collision 2,BulletObj,0.1,1
  83.   if particles exist(1)=1 then delete particles 1
  84.   make particles 1, FireImg, 50, 0.5
  85.   set particle emissions 1,10
  86.   set particle speed 1,0.01
  87.   move object BulletObj,0.2
  88.  endif
  89.  
  90.  rem Control life of bullet
  91.  if bullet>0
  92.  
  93.   rem If bullet collides with BSP world
  94.   if bsp collision hit(2)=1 or bulletimpact=1
  95.    rem End bullet on wall
  96.    position sound ImpactSnd,object position x(BulletObj), object position y(BulletObj), object position z(BulletObj)
  97.    play sound ImpactSnd
  98.    bulletimpact=0
  99.    bullet=0
  100.   else
  101.    rem Move bullet
  102.    dec bullet
  103.    move object BulletObj,0.5
  104.    set particle emissions 1,1+(bullet/10)
  105.   endif
  106.  
  107.   rem Update particle using bullet object position
  108.   rotate particles 1,90-object angle x(BulletObj),object angle y(BulletObj)+180,0
  109.   position particles 1,object position x(BulletObj),object position y(BulletObj),object position z(BulletObj)
  110.  
  111.   rem Bullet dies
  112.   if bullet=0
  113.    set particle emissions 1,0
  114.    set bsp collision off 2
  115.   endif
  116.  
  117.  else
  118.   rem Gun recharge phase
  119.   if bullet>-50 then dec bullet
  120.  endif
  121.  
  122. return
  123.  
  124. _control_enemies:
  125.  
  126.  rem Variable for finding closest enemy
  127.  cdist#=9999.99
  128.  
  129.  rem Handle enemies within world
  130.  for ene=EneObj to EneObj+4
  131.  
  132.   rem If enemy alive
  133.   if object visible(ene)=1
  134.  
  135.   rem Kill this enemy
  136.   killenemy=0
  137.  
  138.   rem Move enemy on a slow curve for appearance of intelegence
  139.   if object angle z(ene)=0
  140.    yrotate object ene,wrapvalue(object angle y(ene)+2)
  141.   endif
  142.   if object angle z(ene)=1
  143.    yrotate object ene,wrapvalue(object angle y(ene)-2)
  144.   endif
  145.   if object angle z(ene)=2
  146.    move object ene,0.05
  147.   else
  148.    move object ene,0.02
  149.   endif
  150.  
  151.   rem Switch direction of curve based on a random value
  152.   if rnd(200)=1 then zrotate object ene,rnd(1)
  153.  
  154.   rem Handle gravity for enemy
  155.   position object ene,object position x(ene),object position y(ene)-0.01,object position z(ene)
  156.  
  157.   rem Work out angle and distance between enemy and player
  158.   dx#=camera position x(0)-object position x(ene)
  159.   dy#=camera position y(0)-object position y(ene)
  160.   dz#=camera position z(0)-object position z(ene)
  161.   dist#=abs(sqrt(abs(dx#*dx#)+abs(dy#*dy#)+abs(dz#*dz#)))
  162.   viewa#=wrapvalue(atanfull(dx#,dz#))
  163.   obja#=wrapvalue(object angle y(ene))
  164.   if viewa#>180 then viewa#=viewa#-360
  165.   if obja#>180 then obja#=obja#-360
  166.  
  167.   rem If enemy 'facing player' and 'on similar height' and 'close', zoom in
  168.   if abs(viewa#-obja#)<10.0 and abs(dy#)<5.0 and dist#<30.0
  169.    if object angle z(ene)<>2 then play sound EnemygunSnd
  170.    rotate object ene,0,viewa#,2
  171.    set object speed ene,200
  172.   else
  173.    set object speed ene,100
  174.   endif
  175.  
  176.   rem If enemy gets too close to player, player dies
  177.   if dist#<2.0
  178.    play sound DieSnd
  179.    for x=0 to 100
  180.     point camera object position x(ene), object position y(ene)+(x/20.0), object position z(ene)
  181.     sync
  182.    next x
  183.    restart=1
  184.    killenemy=1
  185.   endif
  186.  
  187.   rem If enemy and bullet in same space, enemy dies
  188.   if bullet>0
  189.    if object collision(BulletObj,ene)>0
  190.     play sound EnemydieSnd
  191.     play object ene,26,26+50
  192.     set object speed ene,100
  193.     bulletimpact=1
  194.    endif
  195.   endif
  196.  
  197.   rem Closest enemy emits the enemy sound
  198.   if dist#<cdist#
  199.    cdist#=dist#
  200.    position sound EnemySnd,object position x(ene), object position y(ene), object position z(ene)
  201.    position sound EnemygunSnd,object position x(ene), object position y(ene), object position z(ene)
  202.    position sound EnemydieSnd,object position x(ene), object position y(ene), object position z(ene)
  203.   endif
  204.  
  205.   rem Hide enemy when die animation over
  206.   if object frame(ene)>26+25 and object visible(ene)=1
  207.    killenemy=1
  208.   endif
  209.  
  210.   if killenemy=1
  211.    set bsp collision off 3+(ene-EneObj)
  212.    hide object ene : dec aliensleft
  213.    killenemy=0
  214.   endif
  215.  
  216.   rem If enemy alive ENDIF
  217.   endif
  218.  
  219.  next ene
  220.  
  221. return
  222.  
  223. _control_stats:
  224.  
  225.  rem Distance to next alien
  226.  if aliensleft>0 then text 20,screen height()-40,"DISTANCE READING:"+str$(abs(cdist#*100))
  227.  
  228.  rem Aliens Left Stat
  229.  s$=str$(aliensleft)+" ALIENS LEFT"
  230.  if aliensleft=0 then s$="LEVEL COMPLETE!" : stop sound EnemySnd
  231.  text 640-20-text width(s$),screen height()-40,s$
  232.  
  233.  return
  234.  
  235. _setup_game:
  236.  
  237.  rem Setup camera
  238.  set camera range 0.1,5000
  239.  autocam off
  240.  
  241.  rem Setup sky model
  242.  set object SkyObj,1,0,0,0,0,0,0
  243.  scale object SkyObj,20,20,20
  244.  
  245.  rem Setup gun for player
  246.  lock object on GunObj
  247.  scale object GunObj,2,2,4
  248.  rotate object GunObj,270,0,0
  249.  position object GunObj,0.5,-1,1
  250.  disable object zdepth GunObj
  251.  
  252.  rem Create object for bullet
  253.  BulletObj=3 : make object cube BulletObj,0.1
  254.  
  255.  rem Create simple sprite based crosshair
  256.  sprite 1,320-16,240-16,CrossHairImg
  257.  set sprite 1,0,1
  258.  
  259.  rem Place enemies throughout world and set BSP collision for them
  260.  aliensleft=0
  261.  restore EnemyPosData
  262.  for ene=EneObj to EneObj+4
  263.   read ex#,ey#,ez#
  264.   position object ene,ex#,ey#,ez#
  265.   set bsp object collision 3+(ene-EneObj),ene,0.75,0
  266.   yrotate object ene,180 : fix object pivot ene
  267.   inc aliensleft
  268.  next ene
  269.  
  270.  rem Start the enemy presence sound
  271.  loop sound EnemySnd
  272.  scale listener 0.1
  273.  
  274.  rem Trigger player initialisation
  275.  restart=1
  276.  
  277. return
  278.  
  279. _load_game:
  280.  
  281.  rem Load BSP world and sky model
  282.  load bsp "world\ikzdm1.pk3","ikzdm1.bsp"
  283.  SkyObj=1 : load object "models\sky\am.x",SkyObj
  284.  
  285.  rem Load model for gun
  286.  GunObj=2 : load object "models\gun\gun.x",GunObj
  287.  
  288.  rem Load models for enemies
  289.  EneObj=11
  290.  for ene=EneObj to EneObj+4
  291.   load object "models\enemy\H-Alien Psionic-Idle.x",ene
  292.   append object "models\enemy\H-Alien Psionic-Die.x", ene, total object frames(ene)+1
  293.   loop object ene,0,25
  294.  next ene
  295.  
  296.  rem Load all sounds
  297.  GunSnd=1 : load sound "sounds\gun.wav",GunSnd
  298.  ImpactSnd=2 : load 3dsound "sounds\impact.wav",ImpactSnd
  299.  DieSnd=3 : load sound "sounds\die.wav",DieSnd
  300.  EnemySnd=11 : load 3dsound "sounds\enemy.wav",EnemySnd
  301.  EnemygunSnd=12 : load 3dsound "sounds\enemygun.wav",EnemygunSnd
  302.  EnemydieSnd=13 : load 3dsound "sounds\enemydie.wav",EnemydieSnd
  303.  
  304.  rem Load music (WAV best for looping)
  305.  MusicSnd=101 : load sound "sounds\ingame.wav",MusicSnd
  306.  loop sound MusicSnd : set sound volume MusicSnd,80
  307.  
  308.  rem Load images
  309.  FireImg=1 : load image "images\fire.bmp",FireImg
  310.  CrossHairImg=2 : load image "images\crosshair.bmp",CrossHairImg
  311.  
  312. return
  313.  
  314. rem Enemy position data within level
  315. EnemyPosData:
  316. data -9.27,9.98,-2.78
  317. data -16.54,-0.22,19.18
  318. data 2.0,9.0,25.0
  319. data -2.0,-9.0,25.0
  320. data 2,4.0,10.0
  321.  
  322.