PureBasic
;
; ------------------------------------------------------------
;
;   PureBasic - Sound3D
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

    ; ; Инициализация трехмерного мира 
    InitEngine3D()
    InitSprite()
    InitKeyboard()
    InitMouse()
    Add3DArchive(#PB_Compiler_Home+"Examples/3D/Data", #PB_3DArchive_FileSystem)
    Add3DArchive(#PB_Compiler_Home+"Examples/3D/Data/Packs/skybox.zip", #PB_3DArchive_Zip)
    Add3DArchive(#PB_Compiler_Home+"Examples/3D/Data/Textures", #PB_3DArchive_FileSystem) 

    ; Откроем окно
    OpenWindow(0,0,0,1000,1000,"Звук меняется в зависимости от положения планеты",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
    OpenWindowedScreen(WindowID(0),0,0,1000,1000,1,0,0)

    ;Создание трехмерного мира
    SkyBox("stevecube.jpg");
    cam=CreateCamera(#PB_Any, 0, 0, 100, 100)
    planete=CreateSphere(#PB_Any, 10)
    tex_planete=LoadTexture(#PB_Any, "clouds.jpg")
    material=CreateMaterial(#PB_Any,TextureID(tex_planete))
    planeteE=CreateEntity(#PB_Any,MeshID(planete),MaterialID(material))

    ; Загрузка файла Sonav WAV или Ogg, который должен быть моно
    son3D= LoadSound3D(#PB_Any,"Roar.ogg",#PB_Sound3D_Streaming) 

    SoundVolume3D(son3D, 20)         ; Громкость звука в 20%
    SoundRange3D(son3D, 1, 100)      ; Звуковая зона
    SoundCone3D(son3D, 90, 360, 20)  ; Опционально, звуковой конус

    ; Звук воспроизводится повторно
    PlaySound3D(son3D, #PB_Sound3D_Loop)

    ; Слушатель движется с камерой
    SoundListenerLocate(CameraX(cam),CameraY(cam),CameraZ(cam))

    ; Звук и планета связаны,  
    ; поэтому, если пользователь перемещает планету, звук движется вместе с ней.
    noeud=CreateNode(#PB_Any, 0, 0, -75)
    AttachNodeObject(noeud, SoundID3D(son3D))
    AttachNodeObject(noeud, EntityID(planeteE))

    ; Управление окнами, клавиатурой и мышью
    Repeat
      Repeat 
        Event  = WindowEvent() 
        Select Event 
          Case #PB_Event_CloseWindow 
        End 
            
        EndSelect 
      Until Event = 0
      
      ExamineKeyboard()
      ExamineMouse()
      
      If MouseDeltaX()>0
        MoveNode(noeud,0.5,0,0)
      ElseIf MouseDeltaX()<0
        MoveNode(noeud,-0.5,0,0)
      EndIf
      If MouseDeltaY()>0
        MoveNode(noeud,0,-0.5,0)
      ElseIf MouseDeltaY()<0
        MoveNode(noeud,0,0.5,0)
      EndIf 
      If MouseButton(#PB_MouseButton_Left) <>0
        End
      EndIf
      If MouseButton( #PB_MouseButton_Right) <>0
        MoveNode(noeud,0,0,-75,#PB_Absolute)
      EndIf
      
      If KeyboardPushed(#PB_Key_Escape)
        quitter + 1
      EndIf
      RotateNode(noeud,0.3,0.4,0.5,#PB_Relative) 
      If KeyboardPushed(#PB_Key_Right)
        MoveNode(noeud,0.5,0,0)
      EndIf
      If KeyboardPushed(#PB_Key_Left)
        MoveNode(noeud,-0.5,0,0)
      EndIf
      If KeyboardPushed(#PB_Key_Up)
        MoveNode(noeud,0,0.5,0)
      EndIf
      If KeyboardPushed(#PB_Key_Down)
        MoveNode(noeud,0,-0.5,0)
      EndIf
      tiks = MouseWheel()
      If tiks > 0
        MoveNode(noeud,0,0,5)
      EndIf
      If tiks < 0
        MoveNode(noeud,0,0,-5)
      EndIf
      
      ; Отображение сцены
      StartDrawing(WindowOutput(0))
      DrawText(0,5,"X=" + Str(NodeX(noeud)) + " Y=" + Str(NodeY(noeud)) + " Z="+Str(NodeZ(noeud))) 
      DrawText(0,30,"Мышь или клавиатура: вверх, вниз, вправо, влево и колесо мыши")  
      DrawText(0,60,".: Esc или левый клик для выхода :.")
      StopDrawing()
      
      RenderWorld()
      
      FlipBuffers()
      
    Until quitter

    End