Показать сообщение отдельно
Старый 01.08.2007, 07:37   #11
johnk
Легенда
 
Регистрация: 01.10.2006
Сообщений: 3,705
Написано 296 полезных сообщений
(для 568 пользователей)
Re: Скай куб. прошу помощи.

Есть пример castle.
Вот его код:
;The castle demo!
Const FPS=30
Const n_trees=100

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" )
Global boom=Load3DSound( "sounds\boom.wav" )
SoundVolume boom,.5

Type Player
    Field entity,model
    Field anim_speed#,player_y#,roll#
End Type

Type ChaseCam
    Field entity,camera,target,heading,sky
End Type

Type Spark
    Field alpha#,sprite
End Type
    
Type Bullet
    Field rot#,sprite,time_out
End Type

Type Hole
    Field alpha#,sprite
End Type

Const TYPE_PLAYER=1,TYPE_BULLET=2,TYPE_TARGET=3

Const TYPE_SCENERY=10,TYPE_TERRAIN=11

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
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

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 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 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 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 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 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
Все, что тебе надо отсюда, есть функция LoadSkyBox
(Offline)
 
Ответить с цитированием