| Description: The source file Castle.bb modified by RepeatUntil to include a few comments. |
| The source file: ; The castle demo documented by Cod2Doc! ; This is a very basic example to show how to comment your code. ; Some Piece of code are commented (by RepeatUntil, sorry Mark ;), some are not ;; (just to show that even without comment, nice documentation is produced). ; ; You can also see the [bb source file]SourceCastle.html from which the documentation was created. ;author Mark Sibly Global ATYPE_PLAYER=1,AATYPE_BULLET=2,AAATYPE_TARGET=3 Const FPS=30 Const n_trees=100 ; Numbers of trees Global info1$="Castle Demo" Global info2$="Featuring dynamic terrain, sliding collisions," Global info3$="transparency effects and an intelligent camera" Global info4$="Arrow keys/A/Z to move, Space to jump, Left-Alt to fire" Include "../start.bb" Global shoot=Load3DSound( "sounds\shoot.wav" ) ; The sound when Marios fire Global boom=Load3DSound( "sounds\boom.wav" ) ; The sound when the bullet hit something SoundVolume boom,.5 Type Player Field entity,model ; Entity stuff Field anim_speed#,player_y#,roll# ; Parameters of the entity End Type Type ChaseCam Field entity,camera,target,heading,sky End Type Type Spark Field alpha# Field sprite End Type ; Type describing the bullet fired by Marios Type Bullet Field rot# ; The rotation! Field sprite ; The sprite! Field time_out ; The time after which the bullet disappears End Type ; Damage created by the bullet Type Hole Field alpha#,sprite ; The sprite and the alpha (yes, really!) End Type Const TYPE_PLAYER=1,TYPE_BULLET=2,TYPE_TARGET=3 Const TYPE_SCENERY=10 ; Variable used for the collision Const TYPE_TERRAIN=11 ; Variable used for the collision Collisions TYPE_PLAYER,TYPE_TERRAIN,2,3 Collisions TYPE_PLAYER,TYPE_SCENERY,2,2 Collisions TYPE_BULLET,TYPE_TERRAIN,2,1 Collisions TYPE_BULLET,TYPE_SCENERY,2,1 Collisions TYPE_TARGET,TYPE_TERRAIN,2,2 Collisions TYPE_TARGET,TYPE_SCENERY,2,2 Global water_level=-98 Global light,castle,land,ground,water,sky Global spark_sprite,bull_sprite,player_model,hole_sprite,tree_sprite ; Some sprites!! Global bull_x#=1.5 Setup() ChangeDir "environ" LoadEnviron( "terrain-1.jpg","water-2_mip.bmp","sky","heightmap_256.bmp" ) ChangeDir "..\" player1.Player=CreatePlayer( 0,10,0 ) camera1.ChaseCam=CreateChaseCam( player1\entity ) period=1000/FPS time=Millisecs()-period listener=CreateListener( player1\entity,.1,1,.2 ) piv=CreatePivot() PositionEntity piv,0,10,40 While Not KeyHit(1) If KeyHit(17) wire=Not wire Wireframe wire EndIf Repeat elapsed=Millisecs()-time Until elapsed ;how many 'frames' have elapsed ticks=elapsed/period ;fractional remainder tween#=Float(elapsed Mod period)/Float(period) For k=1 To ticks time=time+period If k=ticks Then CaptureWorld TurnEntity piv,0,5,0 PositionEntity piv,0,7,40;47+Sin(time*.1)*40,40 UpdateGame() UpdateWorld PositionEntity water,Sin(time*.01)*10,water_level+Sin(time*.05)*.5,Cos(time*.02)*10 For c.ChaseCam=Each ChaseCam UpdateChaseCam( c ) PositionEntity sky,EntityX(c\camera),EntityY(c\camera),EntityZ(c\camera) Next Next RenderWorld tween Flip Wend End ; This function is the main one of this demo ; It calls UpdateHole(), UpdateBullet(), UpdateSpark() and UpdatePlayer() at each loop Function UpdateGame() For h.Hole=Each Hole UpdateHole( h ) Next For b.Bullet=Each Bullet UpdateBullet( b ) Next For s.Spark=Each Spark UpdateSpark( s ) Next For p.Player=Each Player UpdatePlayer( p ) Next End Function Function UpdateHole( h.Hole ) h\alpha=h\alpha-.005 If h\alpha>0 EntityAlpha h\sprite,h\alpha Else FreeEntity h\sprite Delete h EndIf End Function ; Function used to create Marios ; x = the x location of the new entity ; y = the y location of the new entity ; z = the z location of the new entity ; return = the new type handle, ;see Player ;example ; Type Player ; Field entity,model ; Entity stuff ; Field anim_speed#,player_y#,roll# ; Parameters of the entity ; End Type ; ; How to use this function: ; player1.Player = CreatePlayer(0,10,0) ;/example Function CreatePlayer.Player( x#,y#,z# ) p.Player=New Player p\entity=CreatePivot() p\model=CopyEntity( player_model,p\entity ) p\player_y=y PositionEntity p\entity,x,y,z EntityType p\entity,TYPE_PLAYER EntityRadius p\entity,1.5 ResetEntity p\entity Return p End Function Function CreateBullet.Bullet( p.Player ) bull_x=-bull_x b.Bullet=New Bullet b\time_out=150 b\sprite=CopyEntity( bull_sprite,p\entity ) TranslateEntity b\sprite,bull_x,1,.25 EntityParent b\sprite,0 EmitSound shoot,b\sprite Return b End Function ; Function updating the bullet. Function UpdateBullet( b.Bullet ) If CountCollisions( b\sprite ) If EntityCollided( b\sprite,TYPE_TERRAIN ) EmitSound boom,b\sprite ex#=EntityX(b\sprite) ey#=EntityY(b\sprite) ez#=EntityZ(b\sprite) TFormPoint( ex,ey,ez,0,land ) hi#=TerrainHeight( land,TFormedX(),TFormedZ() ) If hi>0 hi=hi-.02:If hi<0 Then hi=0 ModifyTerrain land,TFormedX(),TFormedZ(),hi,True EndIf CreateSpark( b ) FreeEntity b\sprite Delete b Return EndIf If EntityCollided( b\sprite,TYPE_SCENERY ) For k=1 To CountCollisions( b\sprite ) If GetEntityType( CollisionEntity( b\sprite,k ) )=TYPE_SCENERY cx#=CollisionX( b\sprite,k ) cy#=CollisionY( b\sprite,k ) cz#=CollisionZ( b\sprite,k ) nx#=CollisionNX( b\sprite,k ) ny#=CollisionNY( b\sprite,k ) nz#=CollisionNZ( b\sprite,k ) th.Hole=New Hole th\alpha=1 th\sprite=CopyEntity( hole_sprite ) PositionEntity th\sprite,cx,cy,cz AlignToVector th\sprite,-nx,-ny,-nz,3 MoveEntity th\sprite,0,0,-.1 Exit EndIf Next EmitSound boom,b\sprite CreateSpark( b ) FreeEntity b\sprite Delete b Return EndIf EndIf b\time_out=b\time_out-1 If b\time_out=0 FreeEntity b\sprite Delete b Return EndIf b\rot=b\rot+30 RotateSprite b\sprite,b\rot MoveEntity b\sprite,0,0,2 End Function Function CreateSpark.Spark( b.Bullet ) s.Spark=New Spark s\alpha=-90 s\sprite=CopyEntity( spark_sprite,b\sprite ) EntityParent s\sprite,0 Return s End Function Function UpdateSpark( s.Spark ) If s\alpha<270 sz#=Sin(s\alpha)*5+5 ScaleSprite s\sprite,sz,sz RotateSprite s\sprite,Rnd(360) s\alpha=s\alpha+15 Else FreeEntity s\sprite Delete s EndIf End Function ; Function to update the player ; Handle the movement of Marios as well as the shot! ; p = the handle of the player type Function UpdatePlayer( p.Player ) If KeyHit(56) ;fire? CreateBullet( p ) EndIf If KeyDown(203) ;left/right TurnEntity p\entity,0,6,0 ;turn player left/right Else If KeyDown(205) TurnEntity p\entity,0,-6,0 EndIf If KeyDown(30) ;forward If p\anim_speed<=0 p\anim_speed=1.75 Animate p\model,1,p\anim_speed EndIf MoveEntity p\entity,0,0,1 Else If KeyDown(44) ;back If p\anim_speed>=0 p\anim_speed=-1.75 Animate p\model,1,p\anim_speed EndIf MoveEntity p\entity,0,0,-1 Else If p\anim_speed ;stop animating p\anim_speed=0 Animate p\model,0 EndIf Goto skip ex#=EntityX(p\entity):ez#=EntityZ(p\entity) PositionEntity p\entity,ex,TerrainY( land,ex,0,ez )+1.5,ez Return .skip ty#=EntityY(p\entity) y_vel#=(ty-p\player_y) p\player_y=ty If KeyHit(57) ;jump? y_vel=5 ;2.4 Else y_vel=y_vel-.5 ;2 EndIf TranslateEntity p\entity,0,y_vel,0 End Function Function CreateChaseCam.ChaseCam( entity ) c.ChaseCam=New ChaseCam c\entity=entity c\camera=CreateCamera() c\target=CreatePivot( entity ) PositionEntity c\target,0,3,-10 EntityType c\target,TYPE_TARGET c\heading=CreatePivot( entity ) PositionEntity c\heading,0,0,20 c\sky=CopyEntity( sky ) Return c End Function Function UpdateChaseCam( c.ChaseCam ) If KeyDown(200) TranslateEntity c\heading,0,-3,0 Else If KeyDown(208) TranslateEntity c\heading,0,+3,0 EndIf dx#=EntityX(c\target,True)-EntityX(c\camera,True) dy#=EntityY(c\target,True)-EntityY(c\camera,True) dz#=EntityZ(c\target,True)-EntityZ(c\camera,True) TranslateEntity c\camera,dx*.1,dy*.1,dz*.1 PointEntity c\camera,c\heading PositionEntity c\target,0,0,0 ResetEntity c\target PositionEntity c\target,0,3,-10 PositionEntity c\sky,EntityX(c\camera),EntityY(c\camera),EntityZ(c\camera) End Function ; Function creating the environ ; arg1 = The texture of the land ; arg2 = The texture of the water ; arg3 = Guess what? The texture of the sky ; arg4 = The image file representing the height map Function LoadEnviron( land_tex$,water_tex$,sky_tex$,height_map$ ) light=CreateLight() TurnEntity light,45,45,0 land_tex=LoadTexture( land_tex$,1 ) ScaleTexture land_tex,10,10 land=LoadTerrain( height_map$ ) EntityTexture land,land_tex TerrainShading land,True PositionEntity land,-1000,-100,-1000 ScaleEntity land,2000.0/256,100,2000.0/256 EntityType land,TYPE_TERRAIN TerrainDetail land,750,True For k=1 To n_trees Repeat tx#=Rnd(-70,70)-150 tz#=Rnd(-70,70)+400 ty#=TerrainY( land,tx,0,tz ) Until ty>water_level t=CopyEntity( tree_sprite ) PositionEntity t,tx,ty,tz ScaleSprite t,Rand(2,3),Rand(4,6) Next ground=CreatePlane() EntityTexture ground,land_tex PositionEntity ground,0,-100,0 EntityOrder ground,9 water_tex=LoadTexture( water_tex$,3 ) ScaleTexture water_tex,20,20 water=CreatePlane() EntityTexture water,water_tex PositionEntity water,0,water_level,0 sky=LoadSkyBox( sky_tex$ ) EntityOrder sky,10 HideEntity sky End Function Function LoadSkyBox( file$ ) m=CreateMesh() ;front face b=LoadBrush( file$+"_FR.jpg",49 ) s=CreateSurface( m,b ) AddVertex s,-1,+1,-1,0,0:AddVertex s,+1,+1,-1,1,0 AddVertex s,+1,-1,-1,1,1:AddVertex s,-1,-1,-1,0,1 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;right face b=LoadBrush( file$+"_LF.jpg",49 ) s=CreateSurface( m,b ) AddVertex s,+1,+1,-1,0,0:AddVertex s,+1,+1,+1,1,0 AddVertex s,+1,-1,+1,1,1:AddVertex s,+1,-1,-1,0,1 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;back face b=LoadBrush( file$+"_BK.jpg",49 ) s=CreateSurface( m,b ) AddVertex s,+1,+1,+1,0,0:AddVertex s,-1,+1,+1,1,0 AddVertex s,-1,-1,+1,1,1:AddVertex s,+1,-1,+1,0,1 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;left face b=LoadBrush( file$+"_RT.jpg",49 ) s=CreateSurface( m,b ) AddVertex s,-1,+1,+1,0,0:AddVertex s,-1,+1,-1,1,0 AddVertex s,-1,-1,-1,1,1:AddVertex s,-1,-1,+1,0,1 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;top face b=LoadBrush( file$+"_UP.jpg",49 ) s=CreateSurface( m,b ) AddVertex s,-1,+1,+1,0,1:AddVertex s,+1,+1,+1,0,0 AddVertex s,+1,+1,-1,1,0:AddVertex s,-1,+1,-1,1,1 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;bottom face b=LoadBrush( file$+"_DN.jpg",49 ) s=CreateSurface( m,b ) AddVertex s,-1,-1,-1,1,0:AddVertex s,+1,-1,-1,1,1 AddVertex s,+1,-1,+1,0,1:AddVertex s,-1,-1,+1,0,0 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ScaleMesh m,100,100,100 FlipMesh m EntityFX m,1 Return m End Function ; Function creating the whole world!! Function Setup() castle=LoadMesh( "castle\castle1.x" ) ScaleEntity castle,.15,.15,.15 EntityType castle,TYPE_SCENERY player_model=LoadAnimMesh( "markio\mariorun.x" ) ScaleEntity player_model,.2,.2,.2 TranslateEntity player_model,0,-1.25,0 HideEntity player_model spark_sprite=LoadSprite( "sprites\bigspark.bmp" ) HideEntity spark_sprite bull_sprite=LoadSprite( "sprites\bluspark.bmp" ) ScaleSprite bull_sprite,3,3 EntityRadius bull_sprite,1.5 EntityType bull_sprite,TYPE_BULLET HideEntity bull_sprite hole_sprite=LoadSprite( "sprites\bullet_hole.bmp",1 ) EntityBlend hole_sprite,2 SpriteViewMode hole_sprite,2 HideEntity hole_sprite tree_sprite=LoadSprite( "sprites\tree.bmp",7 ) HandleSprite tree_sprite,0,-1 ScaleSprite tree_sprite,2,4 PositionEntity tree_sprite,0,0,-100 SpriteViewMode tree_sprite,3 EntityAutoFade tree_sprite,120,150 End Function |
on 26 Jan 2004.