castle.bb 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  1. ;The castle demo!
  2. Const FPS=30
  3. Const n_trees=100
  4. Global info1$="Castle Demo"
  5. Global info2$="Featuring dynamic terrain, sliding collisions,"
  6. Global info3$="transparency effects and an intelligent camera"
  7. Global info4$="Arrow keys/A/Z to move, Space to jump, Left-Alt to fire"
  8. Include "../start.bb"
  9. Global shoot=Load3DSound( "sounds\shoot.wav" )
  10. Global boom=Load3DSound( "sounds\boom.wav" )
  11. SoundVolume boom,.5
  12. Type Player
  13. Field entity,model
  14. Field anim_speed#,player_y#,roll#
  15. End Type
  16. Type ChaseCam
  17. Field entity,camera,target,heading,sky
  18. End Type
  19. Type Spark
  20. Field alpha#,sprite
  21. End Type
  22. Type Bullet
  23. Field rot#,sprite,time_out
  24. End Type
  25. Type Hole
  26. Field alpha#,sprite
  27. End Type
  28. Const TYPE_PLAYER=1,TYPE_BULLET=2,TYPE_TARGET=3
  29. Const TYPE_SCENERY=10,TYPE_TERRAIN=11
  30. Collisions TYPE_PLAYER,TYPE_TERRAIN,2,3
  31. Collisions TYPE_PLAYER,TYPE_SCENERY,2,2
  32. Collisions TYPE_BULLET,TYPE_TERRAIN,2,1
  33. Collisions TYPE_BULLET,TYPE_SCENERY,2,1
  34. Collisions TYPE_TARGET,TYPE_TERRAIN,2,2
  35. Collisions TYPE_TARGET,TYPE_SCENERY,2,2
  36. Global water_level=-98
  37. Global light,castle,land,ground,water,sky
  38. Global spark_sprite,bull_sprite,player_model,hole_sprite,tree_sprite
  39. Global bull_x#=1.5
  40. Setup()
  41. ChangeDir "environ"
  42. LoadEnviron( "terrain-1.jpg","water-2_mip.bmp","sky","heightmap_256.bmp" )
  43. ChangeDir "..\"
  44. player1.Player=CreatePlayer( 0,10,0 )
  45. camera1.ChaseCam=CreateChaseCam( player1\entity )
  46. period=1000/FPS
  47. time=MilliSecs()-period
  48. listener=CreateListener( player1\entity,.1,1,.2 )
  49. piv=CreatePivot()
  50. PositionEntity piv,0,10,40
  51. While Not KeyHit(1)
  52. If KeyHit(17)
  53. wire=Not wire
  54. Wireframe wire
  55. EndIf
  56. Repeat
  57. elapsed=MilliSecs()-time
  58. Until elapsed
  59. ;how many 'frames' have elapsed
  60. ticks=elapsed/period
  61. ;fractional remainder
  62. tween#=Float(elapsed Mod period)/Float(period)
  63. For k=1 To ticks
  64. time=time+period
  65. If k=ticks Then CaptureWorld
  66. TurnEntity piv,0,5,0
  67. PositionEntity piv,0,7,40;47+Sin(time*.1)*40,40
  68. UpdateGame()
  69. UpdateWorld
  70. PositionEntity water,Sin(time*.01)*10,water_level+Sin(time*.05)*.5,Cos(time*.02)*10
  71. For c.ChaseCam=Each ChaseCam
  72. UpdateChaseCam( c )
  73. PositionEntity sky,EntityX(c\camera),EntityY(c\camera),EntityZ(c\camera)
  74. Next
  75. Next
  76. RenderWorld tween
  77. Flip
  78. Wend
  79. End
  80. Function UpdateGame()
  81. For h.Hole=Each Hole
  82. UpdateHole( h )
  83. Next
  84. For b.Bullet=Each Bullet
  85. UpdateBullet( b )
  86. Next
  87. For s.Spark=Each Spark
  88. UpdateSpark( s )
  89. Next
  90. For p.Player=Each Player
  91. UpdatePlayer( p )
  92. Next
  93. End Function
  94. Function UpdateHole( h.Hole )
  95. h\alpha=h\alpha-.005
  96. If h\alpha>0
  97. EntityAlpha h\sprite,h\alpha
  98. Else
  99. FreeEntity h\sprite
  100. Delete h
  101. EndIf
  102. End Function
  103. Function CreatePlayer.Player( x#,y#,z# )
  104. p.Player=New Player
  105. p\entity=CreatePivot()
  106. p\model=CopyEntity( player_model,p\entity )
  107. p\player_y=y
  108. PositionEntity p\entity,x,y,z
  109. EntityType p\entity,TYPE_PLAYER
  110. EntityRadius p\entity,1.5
  111. ResetEntity p\entity
  112. Return p
  113. End Function
  114. Function CreateBullet.Bullet( p.Player )
  115. bull_x=-bull_x
  116. b.Bullet=New Bullet
  117. b\time_out=150
  118. b\sprite=CopyEntity( bull_sprite,p\entity )
  119. TranslateEntity b\sprite,bull_x,1,.25
  120. EntityParent b\sprite,0
  121. EmitSound shoot,b\sprite
  122. Return b
  123. End Function
  124. Function UpdateBullet( b.Bullet )
  125. If CountCollisions( b\sprite )
  126. If EntityCollided( b\sprite,TYPE_TERRAIN )
  127. EmitSound boom,b\sprite
  128. ex#=EntityX(b\sprite)
  129. ey#=EntityY(b\sprite)
  130. ez#=EntityZ(b\sprite)
  131. TFormPoint( ex,ey,ez,0,land )
  132. hi#=TerrainHeight( land,TFormedX(),TFormedZ() )
  133. If hi>0
  134. hi=hi-.02:If hi<0 Then hi=0
  135. ModifyTerrain land,TFormedX(),TFormedZ(),hi,True
  136. EndIf
  137. CreateSpark( b )
  138. FreeEntity b\sprite
  139. Delete b
  140. Return
  141. EndIf
  142. If EntityCollided( b\sprite,TYPE_SCENERY )
  143. For k=1 To CountCollisions( b\sprite )
  144. If GetEntityType( CollisionEntity( b\sprite,k ) )=TYPE_SCENERY
  145. cx#=CollisionX( b\sprite,k )
  146. cy#=CollisionY( b\sprite,k )
  147. cz#=CollisionZ( b\sprite,k )
  148. nx#=CollisionNX( b\sprite,k )
  149. ny#=CollisionNY( b\sprite,k )
  150. nz#=CollisionNZ( b\sprite,k )
  151. th.Hole=New Hole
  152. th\alpha=1
  153. th\sprite=CopyEntity( hole_sprite )
  154. PositionEntity th\sprite,cx,cy,cz
  155. AlignToVector th\sprite,-nx,-ny,-nz,3
  156. MoveEntity th\sprite,0,0,-.1
  157. Exit
  158. EndIf
  159. Next
  160. EmitSound boom,b\sprite
  161. CreateSpark( b )
  162. FreeEntity b\sprite
  163. Delete b
  164. Return
  165. EndIf
  166. EndIf
  167. b\time_out=b\time_out-1
  168. If b\time_out=0
  169. FreeEntity b\sprite
  170. Delete b
  171. Return
  172. EndIf
  173. b\rot=b\rot+30
  174. RotateSprite b\sprite,b\rot
  175. MoveEntity b\sprite,0,0,2
  176. End Function
  177. Function CreateSpark.Spark( b.Bullet )
  178. s.Spark=New Spark
  179. s\alpha=-90
  180. s\sprite=CopyEntity( spark_sprite,b\sprite )
  181. EntityParent s\sprite,0
  182. Return s
  183. End Function
  184. Function UpdateSpark( s.Spark )
  185. If s\alpha<270
  186. sz#=Sin(s\alpha)*5+5
  187. ScaleSprite s\sprite,sz,sz
  188. RotateSprite s\sprite,Rnd(360)
  189. s\alpha=s\alpha+15
  190. Else
  191. FreeEntity s\sprite
  192. Delete s
  193. EndIf
  194. End Function
  195. Function UpdatePlayer( p.Player )
  196. If KeyHit(56) ;fire?
  197. CreateBullet( p )
  198. EndIf
  199. If KeyDown(203) ;left/right
  200. TurnEntity p\entity,0,6,0 ;turn player left/right
  201. Else If KeyDown(205)
  202. TurnEntity p\entity,0,-6,0
  203. EndIf
  204. If KeyDown(30) ;forward
  205. If p\anim_speed<=0
  206. p\anim_speed=1.75
  207. Animate p\model,1,p\anim_speed
  208. EndIf
  209. MoveEntity p\entity,0,0,1
  210. Else If KeyDown(44) ;back
  211. If p\anim_speed>=0
  212. p\anim_speed=-1.75
  213. Animate p\model,1,p\anim_speed
  214. EndIf
  215. MoveEntity p\entity,0,0,-1
  216. Else If p\anim_speed ;stop animating
  217. p\anim_speed=0
  218. Animate p\model,0
  219. EndIf
  220. Goto skip
  221. ex#=EntityX(p\entity):ez#=EntityZ(p\entity)
  222. PositionEntity p\entity,ex,TerrainY( land,ex,0,ez )+1.5,ez
  223. Return
  224. .skip
  225. ty#=EntityY(p\entity)
  226. y_vel#=(ty-p\player_y)
  227. p\player_y=ty
  228. If KeyHit(57) ;jump?
  229. y_vel=5 ;2.4
  230. Else
  231. y_vel=y_vel-.5 ;2
  232. EndIf
  233. TranslateEntity p\entity,0,y_vel,0
  234. End Function
  235. Function CreateChaseCam.ChaseCam( entity )
  236. c.ChaseCam=New ChaseCam
  237. c\entity=entity
  238. c\camera=CreateCamera()
  239. c\target=CreatePivot( entity )
  240. PositionEntity c\target,0,3,-10
  241. EntityType c\target,TYPE_TARGET
  242. c\heading=CreatePivot( entity )
  243. PositionEntity c\heading,0,0,20
  244. c\sky=CopyEntity( sky )
  245. Return c
  246. End Function
  247. Function UpdateChaseCam( c.ChaseCam )
  248. If KeyDown(200)
  249. TranslateEntity c\heading,0,-3,0
  250. Else If KeyDown(208)
  251. TranslateEntity c\heading,0,+3,0
  252. EndIf
  253. dx#=EntityX(c\target,True)-EntityX(c\camera,True)
  254. dy#=EntityY(c\target,True)-EntityY(c\camera,True)
  255. dz#=EntityZ(c\target,True)-EntityZ(c\camera,True)
  256. TranslateEntity c\camera,dx*.1,dy*.1,dz*.1
  257. PointEntity c\camera,c\heading
  258. PositionEntity c\target,0,0,0
  259. ResetEntity c\target
  260. PositionEntity c\target,0,3,-10
  261. PositionEntity c\sky,EntityX(c\camera),EntityY(c\camera),EntityZ(c\camera)
  262. End Function
  263. Function LoadEnviron( land_tex$,water_tex$,sky_tex$,height_map$ )
  264. light=CreateLight()
  265. TurnEntity light,45,45,0
  266. land_tex=LoadTexture( land_tex$,1 )
  267. ScaleTexture land_tex,10,10
  268. land=LoadTerrain( height_map$ )
  269. EntityTexture land,land_tex
  270. TerrainShading land,True
  271. PositionEntity land,-1000,-100,-1000
  272. ScaleEntity land,2000.0/256,100,2000.0/256
  273. EntityType land,TYPE_TERRAIN
  274. TerrainDetail land,750,True
  275. For k=1 To n_trees
  276. Repeat
  277. tx#=Rnd(-70,70)-150
  278. tz#=Rnd(-70,70)+400
  279. ty#=TerrainY( land,tx,0,tz )
  280. Until ty>water_level
  281. t=CopyEntity( tree_sprite )
  282. PositionEntity t,tx,ty,tz
  283. ScaleSprite t,Rand(2,3),Rand(4,6)
  284. Next
  285. ground=CreatePlane()
  286. EntityTexture ground,land_tex
  287. PositionEntity ground,0,-100,0
  288. EntityOrder ground,9
  289. water_tex=LoadTexture( water_tex$,3 )
  290. ScaleTexture water_tex,20,20
  291. water=CreatePlane()
  292. EntityTexture water,water_tex
  293. PositionEntity water,0,water_level,0
  294. sky=LoadSkyBox( sky_tex$ )
  295. EntityOrder sky,10
  296. HideEntity sky
  297. End Function
  298. Function LoadSkyBox( file$ )
  299. m=CreateMesh()
  300. ;front face
  301. b=LoadBrush( file$+"_FR.jpg",49 )
  302. s=CreateSurface( m,b )
  303. AddVertex s,-1,+1,-1,0,0:AddVertex s,+1,+1,-1,1,0
  304. AddVertex s,+1,-1,-1,1,1:AddVertex s,-1,-1,-1,0,1
  305. AddTriangle s,0,1,2:AddTriangle s,0,2,3
  306. FreeBrush b
  307. ;right face
  308. b=LoadBrush( file$+"_LF.jpg",49 )
  309. s=CreateSurface( m,b )
  310. AddVertex s,+1,+1,-1,0,0:AddVertex s,+1,+1,+1,1,0
  311. AddVertex s,+1,-1,+1,1,1:AddVertex s,+1,-1,-1,0,1
  312. AddTriangle s,0,1,2:AddTriangle s,0,2,3
  313. FreeBrush b
  314. ;back face
  315. b=LoadBrush( file$+"_BK.jpg",49 )
  316. s=CreateSurface( m,b )
  317. AddVertex s,+1,+1,+1,0,0:AddVertex s,-1,+1,+1,1,0
  318. AddVertex s,-1,-1,+1,1,1:AddVertex s,+1,-1,+1,0,1
  319. AddTriangle s,0,1,2:AddTriangle s,0,2,3
  320. FreeBrush b
  321. ;left face
  322. b=LoadBrush( file$+"_RT.jpg",49 )
  323. s=CreateSurface( m,b )
  324. AddVertex s,-1,+1,+1,0,0:AddVertex s,-1,+1,-1,1,0
  325. AddVertex s,-1,-1,-1,1,1:AddVertex s,-1,-1,+1,0,1
  326. AddTriangle s,0,1,2:AddTriangle s,0,2,3
  327. FreeBrush b
  328. ;top face
  329. b=LoadBrush( file$+"_UP.jpg",49 )
  330. s=CreateSurface( m,b )
  331. AddVertex s,-1,+1,+1,0,1:AddVertex s,+1,+1,+1,0,0
  332. AddVertex s,+1,+1,-1,1,0:AddVertex s,-1,+1,-1,1,1
  333. AddTriangle s,0,1,2:AddTriangle s,0,2,3
  334. FreeBrush b
  335. ;bottom face
  336. b=LoadBrush( file$+"_DN.jpg",49 )
  337. s=CreateSurface( m,b )
  338. AddVertex s,-1,-1,-1,1,0:AddVertex s,+1,-1,-1,1,1
  339. AddVertex s,+1,-1,+1,0,1:AddVertex s,-1,-1,+1,0,0
  340. AddTriangle s,0,1,2:AddTriangle s,0,2,3
  341. FreeBrush b
  342. ScaleMesh m,100,100,100
  343. FlipMesh m
  344. EntityFX m,1
  345. Return m
  346. End Function
  347. Function Setup()
  348. castle=LoadMesh( "castle\castle1.x" )
  349. ScaleEntity castle,.15,.15,.15
  350. EntityType castle,TYPE_SCENERY
  351. player_model=LoadAnimMesh( "markio\mariorun.x" )
  352. ScaleEntity player_model,.2,.2,.2
  353. TranslateEntity player_model,0,-1.25,0
  354. HideEntity player_model
  355. spark_sprite=LoadSprite( "sprites\bigspark.bmp" )
  356. HideEntity spark_sprite
  357. bull_sprite=LoadSprite( "sprites\bluspark.bmp" )
  358. ScaleSprite bull_sprite,3,3
  359. EntityRadius bull_sprite,1.5
  360. EntityType bull_sprite,TYPE_BULLET
  361. HideEntity bull_sprite
  362. hole_sprite=LoadSprite( "sprites\bullet_hole.bmp",1 )
  363. EntityBlend hole_sprite,2
  364. SpriteViewMode hole_sprite,2
  365. HideEntity hole_sprite
  366. tree_sprite=LoadSprite( "sprites\tree.bmp",7 )
  367. HandleSprite tree_sprite,0,-1
  368. ScaleSprite tree_sprite,2,4
  369. PositionEntity tree_sprite,0,0,-100
  370. SpriteViewMode tree_sprite,3
  371. EntityAutoFade tree_sprite,120,150
  372. End Function