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

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