DirectX в Visual Basic 2005 для початківців (исходники), Різне, Програмування, статті

Почнемо з невеликого вступу. Що потрібно для того щоб працювала скомпільована програма, яка використовує функції DirectX? А потрібен для цього встановлений Microsoft DirectX і все. Як приклад будь-яка гра, використовує DirectX, яка зазвичай цей DirectX несе з собою на диску. А ось для того, щоб робити DirectX програму в Visual Studio 2005, потрібен ще один компонент Managed DirectX (керований DirectX). Встановлюється Managed DirectX автоматично разом з установкою Microsoft DirectX (починаючи з якихось версій DirectX 2006 року, точно не знаю).


Встановлюємо найсвіжіший з наявних у нас Microsoft DirectX (я використовував 4.9.0.904 за лютий 2007 року). Найсвіжіший, по-перше, для того, щоб в його складі був Managed DirectX, а по-друге, за тієї причини, що промальовування тривимірної графіки в нових версіях DirectX (навіть в межах одного і того ж DirectX9) якісно відрізняється від старих версій. Тепер перевіримо, чи справді Managed DirectX встановився в нашій системі. Для цього зайдемо в папку “C: WINDOWSMicrosoft.NET” яка природно повинна бути присутня, якщо у вас встановлена ​​Visual Studio і перевіримо, чи є там папка “DirectX for Managed Code “або” Managed DirectX “, якщо є, то все нормально.


Створюємо новий проект “WindowsApplication” в Visual Studio 2005 з використанням мови Visual Basic. Переходимо у вікно “Class View”, натискаємо праву кнопку миші, вибираємо “Add Reference”. Переходимо на вкладку “Browse” знаходимо папку “C: WINDOWSMicrosoft.NETDirectX for Managed Code” і підключаємо п’ять бібліотек:



От і все, тепер імпортувавши простір імен, відповідне назвами цих бібліотек, ми зможемо використовувати функції DirectX. Переходимо у вікно коду і копіюємо в нього весь нижченаведений код. Цього буде достатньо, щоб програма відразу ж запустилася (ніякі властивості форми міняти не треба й додавати будь-які компоненти на форму теж не треба). З коду виключено все зайве, показано тільки використання функцій Direct3D (Тривимірна графіка), DirectSound (Звук), DirectInput (Пристрої введення) плюс трохи геометрії для вивчення руху об’єктів в тривимірному просторі. Весь код ретельно прокоментовано, тому думаю, вам неважко буде в ньому розібратися.


Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Imports Microsoft.DirectX.DirectSound
Imports Microsoft.DirectX.DirectInput


Public Class Form1


“Оголошення змінних Direct3D
    Private Direct3D_Device As Direct3D.Device
    Private Direct3D_PresentParameters As New Direct3D.PresentParameters
    Private Ship_1, Ship_2, Ship_3, Planet As Direct3D.Mesh
    Private Direct3D_Material As Direct3D.Material


“Оголошення змінних DirectSound
    Private DirectSound_Device As DirectSound.Device
    Private DirectSound_SecondaryBuffer As DirectSound.SecondaryBuffer


“Оголошення змінних DirectInput
    Private DirectInput_Device As DirectInput.Device
    Private DirectInput_MouseState As New DirectInput.MouseState


“Оголошення інших змінних
    Private Ship_Matrix As Microsoft.DirectX.Matrix
    Private VectorOX, VectorOY, VectorOZ, Planet_Position(10000), Ship_Position, Ship_Vector As Microsoft.DirectX.Vector3
    Private AngleX, AngleY As Single
    Private I As Integer
    Private DateTime1 As DateTime


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


Location = New Point (50, 20) “Положення вікна
ClientSize = New Size (800, 600) “Розмір вікна


“Ініціалізація Direct3D у вікні програми
        Direct3D_PresentParameters.Windowed = True
        Direct3D_PresentParameters.SwapEffect = SwapEffect.Discard
        Direct3D_PresentParameters.EnableAutoDepthStencil = True
        Direct3D_PresentParameters.AutoDepthStencilFormat = DepthFormat.D16
        Direct3D_Device = New Direct3D.Device(0, Direct3D.DeviceType.Hardware, Me.Handle, CreateFlags.SoftwareVertexProcessing, Direct3D_PresentParameters)
        Direct3D_Device.Transform.Projection = Matrix.PerspectiveFovLH(CSng(Math.PI) / 4, 4 / 3, 1, 100)


“Освітлення (два джерела світла спрямовані протилежно один одному)
        Direct3D_Device.RenderState.Lighting = True
        Direct3D_Device.Lights(0).Diffuse = Color.White
        Direct3D_Device.Lights(0).Type = LightType.Directional
        Direct3D_Device.Lights(0).Direction = New Vector3(0, 0, 1)
        Direct3D_Device.Lights(0).Enabled = True
        Direct3D_Device.Lights(1).Diffuse = Color.White
        Direct3D_Device.Lights(1).Type = LightType.Directional
        Direct3D_Device.Lights(1).Direction = New Vector3(0, 0, -1)
        Direct3D_Device.Lights(1).Enabled = True


“Ініціалізація DirectSound
        DirectSound_Device = New DirectSound.Device
        DirectSound_Device.SetCooperativeLevel(Me, CooperativeLevel.Priority)
DirectSound_SecondaryBuffer = New SecondaryBuffer (“C: WINDOWSMediaWindows XP – відмова оборудованія.wav”, DirectSound_Device)


“Ініціалізація DirectInput
        DirectInput_Device = New DirectInput.Device(SystemGuid.Mouse)
        DirectInput_Device.SetCooperativeLevel(Me, CooperativeLevelFlags.Exclusive Or CooperativeLevelFlags.Foreground)


“Ініціалізація інших змінних
        VectorOX = New Vector3(1, 0, 0)
        VectorOY = New Vector3(0, 1, 0)
        VectorOZ = New Vector3(0, 0, 1)
        Ship_Matrix.Translate(0, 0, 0)


“Корабель – сфера і два боксу
        Ship_1 = Mesh.Box(Direct3D_Device, 0.5, 0.003, 0.1)
        Ship_2 = Mesh.Box(Direct3D_Device, 0.003, 0.5, 0.1)
        Ship_3 = Mesh.Sphere(Direct3D_Device, 0.02, 20, 20)


“Планета – сфера радіусом 1
        Planet = Mesh.Sphere(Direct3D_Device, 1, 20, 20)


        Randomize()
        For I = 0 To 10000
“Масив координат планет з випадкових чисел в обмеженому просторі
“500 одиниць по кожному виміру
            Planet_Position(I) = New Vector3(Rnd() * 500 – 250, Rnd() * 500 – 250, Rnd() * 500 – 250)
        Next


    End Sub


    Private Sub Form1_Activated(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Activated
DirectInput_Device.Acquire () “Захоплення пристроїв введення при активації вікна
    End Sub


    Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
        If e.KeyCode = Keys.Escape Then
Close () “Якщо натиснуто Escape то вихід
        End If
    End Sub


    Private Sub Form1_Shown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown
        While Created
If (Now – DateTime1). TotalMilliseconds> 30 Then “промальовування виконуємо через кожні 30 мілісекунд
“Якщо не встановлювати часовий інтервал, то цикл будуть виконуватися
“Через різні проміжки часу, і рух корабля буде нерівномірним
“Також якщо ваша система не буде встигати виконувати код за 30 мілісекунд
“То рух корабля теж буде нерівномірним, можна збільшити до 40
“Але це вже будуть видимі оку скачки в русі


“Реальний час в мілісекундах, за яке відбувається виконання
“Циклу відображаємо в заголовку вікна
“Якщо система встигає виконати цикл, в заголовку буде відображатися число 31.25
                Me.Text = (Now – DateTime1).TotalMilliseconds


DateTime1 = Now “Створення точки відліку часу


                Try
“Отримання стан миші
                    DirectInput_MouseState = DirectInput_Device.CurrentMouseState
                Catch
                End Try


“Розрахунок кутів повороту корабля в залежності від стану миші
                AngleX = AngleX + DirectInput_MouseState.X / 30000
                If AngleX < -0.03 Then AngleX = -0.03
                If AngleX > 0.03 Then AngleX = 0.03
                AngleY = AngleY + DirectInput_MouseState.Y / 30000
                If AngleY < -0.03 Then AngleY = -0.03
                If AngleY > 0.03 Then AngleY = 0.03


Direct3D_Device.BeginScene () “Початок сцени


“Очищення (виконується в кожному циклі, тобто кожен цикл всі об’єкти прорисовуються заново)
                Direct3D_Device.Clear(ClearFlags.Target Or ClearFlags.ZBuffer, System.Drawing.Color.DarkBlue, 1, 0)


“Розрахунок матриці напрямки корабля шляхом повороту навколо векторів
“VectorOY і VectorOX на кути AngleX і AngleY
“А також поворот самих векторів VectorOY, VectorOX, VectorOZ
                Ship_Matrix = Ship_Matrix * Matrix.RotationAxis(VectorOY, AngleX)
                VectorOX.TransformCoordinate(Matrix.RotationAxis(VectorOY, AngleX))
                Ship_Matrix = Ship_Matrix * Matrix.RotationAxis(VectorOX, AngleY)
                VectorOY.TransformCoordinate(Matrix.RotationAxis(VectorOX, AngleY))
                VectorOZ.TransformCoordinate((Matrix.RotationAxis(VectorOX, AngleY) * Matrix.RotationAxis(VectorOY, AngleX)))


Ship_Vector = New Vector3 (0, 0, 1) “Початковий вектор напрямку руху (+1 по осі OZ)
Ship_Vector.TransformCoordinate (Ship_Matrix) “вектор напрямку руху змінюємо матрицею
Ship_Position = Ship_Position + Ship_Vector “До позиції корабля додаємо вектор руху


“Встановлюємо координати положення корабля (поворот, поворот навколо осі OZ на 45 градусів і позиція)
                Direct3D_Device.Transform.World = Ship_Matrix * Matrix.RotationAxis(VectorOZ, Math.PI / 4) * Matrix.Translation(Ship_Position)


“Встановлюємо камеру ззаду корабля з напрямком огляду по напрямку руху корабля
                Direct3D_Device.Transform.View = Matrix.LookAtLH(Ship_Position – Ship_Vector * 1.1, Ship_Position, VectorOY)


“Колір матеріалу червоний
                Direct3D_Material.Diffuse = Color.Red
                Direct3D_Device.Material = Direct3D_Material


“Створення корабля
                Ship_1.DrawSubset(0)
                Ship_2.DrawSubset(0)
                Ship_3.DrawSubset(0)


“Якщо відстань між кораблем і планетами менше 75 то малюємо планету з індексом I
                For I = 0 To 10000
                    If (Ship_Position – Planet_Position(I)).Length < 75 Then


“Встановлюємо координати положення планети
                        Direct3D_Device.Transform.World = Matrix.Translation(Planet_Position(I))


“Колір матеріалу світло-зелений
                        Direct3D_Material.Diffuse = Color.LightGreen
                        Direct3D_Device.Material = Direct3D_Material


“Створення планети
                        Planet.DrawSubset(0)
                    End If
                Next


“Якщо відстань між кораблем і планетами менше 1
“(Зіткнення корабля і планети) то програємо звук
                For I = 0 To 10000
                    If (Ship_Position – Planet_Position(I)).Length < 1 Then
                        DirectSound_SecondaryBuffer.Play(0, BufferPlayFlags.Default)
                    End If
                Next


Direct3D_Device.EndScene () “Кінець сцени
Direct3D_Device.Present () “Промальовування сцени
Application.DoEvents () “Виконання інших подій, для того щоб
“Програма не зависала на виконанні циклу
            End If
        End While
    End Sub
End Class


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*