Visual Basic 6 Создание Игры

On
  1. Visual Basic 6.0 Создание Игр
  2. Visual Basic 6.0 Создание Игры

Visual Basic 5.0/6.0. Простой пример создания игры 'Быки и Коровы' с 5-тизначными числами. На сайте собраны коды и примеры, статьи по программированию на Visual Basic.NET. Visual Basic 6.0. Возможно ли на VB 6.0 создать игру с неплохой. Сборник Visual-basic. Тема создания своих игр.

Программирование 3D графики на Visual Basic 6 и DirectX 8. Подготовка к работе Для работы нам понадобится компьютер с операционной системой Windows не ниже Windows 98, установленный DirectX 8.1 или новее и Visual Basic версии 6. Крайне желательно иметь видеоадаптер, полностью поддерживающий DirectX 8.1. Из наиболее распространенных это ATI Radeon 8500 и выше, nVidia GeForce3, GeForce4 Ti и выше. Однако вполне возможна работа и на GeForce серии MX и, даже, Riva TNT.

Стоит остановиться на установке Microsoft DirectX 8.1 SDK for Visual Basic. В ходе установки будет выбор режима – Debug или Retail, если мы выберем Debug, у нас будет возможность эмулировать программно функции DirectX, не поддерживаемые видеоадаптером аппаратно. Особенно рекомендуется выбрать режим Debug, если видеоадаптер не имеет полной поддержки DirectX 8.1. Инициализация Direct3D Приступим, наконец, к нашему первому проекту. Загрузим Visual Basic и создадим новый проект, состоящий из одной формы. Теперь подключим к проекту библиотеку типов для работы с DirectX 8.1.

Для этого в меню Проект откроем пункт Ссылки, найдем и отметим флажком строку DirectX 8 for Visual Basic Type Library. Зададим глобальные переменные. Private Sub D3DInit Dim DispMode As D3DDISPLAYMODE Dim d3dpp As D3DPRESENTPARAMETERS Set d3d = dx8.Direct3DCreate d3d.GetAdapterDisplayMode D3DADAPTERDEFAULT, DispMode d3dpp.Windowed = True d3dpp.SwapEffect = D3DSWAPEFFECTDISCARD d3dpp.BackBufferFormat = DispMode.Format Set d3dDevice = d3d.CreateDevice(D3DADAPTERDEFAULT, D3DDEVTYPEHAL, Me.hWnd , D3DCREATESOFTWAREVERTEXPROCESSING, d3dpp) End Sub Рассмотрим работу процедуры подробнее.

С помощью функции dx8.Direct3DCreate инициализируем переменную d3d, с помощью d3d.GetAdapterDisplayMode D3DADAPTERDEFAULT, DispMode заполняем структуру DispMode данными о текущем видеорежиме. Вторая структура d3dpp заполняется параметрами создаваемого устройства d3dDevice. Windowed говорит о том, что наша программа будет работать в оконном режиме, в этом случае формат, естественно, должен соответствовать формату видеорежима – d3dpp.BackBufferFormat = DispMode.Format. Private Sub FormLoad Me.Show D3DInit Running = True Do While Running DoEvents Render Loop Unload Me End Sub Private Sub FormQueryUnload(Cancel As Integer, UnloadMode As Integer) If Running Then Cancel = 1: Running = False Else ClearAll End If End Sub При старте программы инициализируется Direct3D и запускается цикл с вызовом процедуры Render, в которой и будет вывод изображения, а такая структура процедуры FormQueryUnload не дает завершить программу до выхода из цикла, ведь при завершении работы программы мы уничтожим созданные объекты, и вызов Render приведет к ошибке. И, наконец, сама процедура Render.

D3dpp.SwapEffect = D3DSWAPEFFECTCOPYVSYNC При этом исчезнут полосы – мерцание формы станет равномерным, ведь мы засинхронизировали его с частотой кадров. На компакт-диске, прилагаемом к книге, содержится (в папке Pr01) полный код данного проекта, как и остальных проектов, описанных в книге. Рисуем плоские фигуры. Пора, наконец, нарисовать что-то существенное. В Direct3D, за редким исключением, вывод графики основан на выводе примитивов – серий треугольников. Треугольники выбраны потому, что на них можно разбить любой многоугольник или, как его еще называют, полигон. Для однозначного задания положения треугольника в пространстве достаточно задать координаты трех его вершин.

В Direct3D существует понятие «вертекс» – особая структура, содержащая координаты и некоторые другие характеристики точки (например, вершины треугольника) в пространстве. Private Type vFormat PosX As Single PosY As Single PosZ As Single RHW As Single Color As Long End Type Эта структура задает формат вертекса, то есть перечень характеристик точки, описанных в вертексе. Поля PosX, PosY и PosZ соответствуют трем координатам точки в 3D пространстве. Поле RHW задает особую характеристику, значение которой мы рассмотрим чуть позже, и поле Color задает цвет точки. Кроме структуры вертекса мы должны также задать способ его обработки, то есть мы указываем Direct3D, каким образом нужно обрабатывать вертекс. Для этого служат специальные константы, заданные в Enum CONSTD3DFVFFLAGS, их имена начинаются с «D3DFVF».

Private Sub Render d3dDevice.Clear 0, ByVal 0, D3DCLEARTARGET, &H346666, 1, 0 d3dDevice.BeginScene d3dDevice.SetStreamSource 0, vBuffer, vSize d3dDevice.SetVertexShader vFlag d3dDevice.DrawPrimitive D3DPTTRIANGLELIST, 0, 1 d3dDevice.EndScene d3dDevice.Present ByVal 0, ByVal 0, 0, ByVal 0 End Sub Весь вывод графики в Direct3D должен начинаться с d3dDevice.BeginScene и заканчиваться d3dDevice.EndScene. С помощью d3dDevice.SetStreamSource 0, vBuffer, vSize указываем нашему устройству рендера (d3dDevice) на вертексный буфер, а d3dDevice.SetVertexShader vFlag конкретизирует формат его содержимого. И само рисование - d3dDevice.DrawPrimitive D3DPTTRIANGLELIST, 0, 1.

Это указание вывести список треугольников (TRIANGLELIST), начинающийся с адреса 0 и содержащий 1 треугольник. Жмем – и видим градиентно раскрашенный треугольник. Для пояснения смысла поля RHW в структуре vFormat проведем эксперимент. В процедуре InitGeometry заменим строку Vert(2).RHW = 1 на Vert(2).RHW = 3.

В результате цвет от красной вершины (№ 2) как бы расползается более сильно, чем от остальных вершин. Если немного напрячь воображение, можно представить, что красная вершина находится к нам ближе. Использование поля RHW в формате вертекса означает использование «приведенного» формата, в такой формат Direct3D неявно преобразует геометрию из других форматов перед выводом.

Visual Basic 6.0 Создание Игр

Проведем еще один эксперимент. Добавим процедуру обработки события MouseMove для формы. Private Sub FormMouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then Vert(0).PosX = X Vert(0).PosY = Y D3DVertexBuffer8SetData vBuffer, 0, vSize, 0, Vert(0) End If End Sub Теперь мы можем перетаскивать синюю вершину мышкой. Заметьте, что при перемещении вершины за противоположную сторону треугольника сам треугольник пропадает. Дело в том, что Direct3D отображает по умолчанию только лицевую сторону треугольника.

При использовании TRIANGLELIST лицевой считается та сторона, на которой вершины расположены по часовой стрелке. Это сделано с целью повышения быстродействия при выводе объемных объектов.

Они, как правило, представлены своей поверхностью, и их внутренняя сторона не бывает видна ни при каких обстоятельствах. Если нам необходимо отобразить двухстороннюю фигуру, эту оптимизацию необходимо запретить.

Добавим в D3DInit такую строку. D3dDevice.SetRenderState D3DRSZENABLE, D3DZBTRUE Здесь мы «включаем» ZBuffer. Запускаем программу и смотрим результат. Видим искаженное изображение двух треугольников.

При перемещении искажения усиливаются. А дело в том, что ZBuffer запоминает свое состояние с предыдущего кадра. После того, как была отрисована какая-то точка, более далекая точка на этой позиции уже не может быть отображена не только в текущем кадре, но и в следующих. Чтобы от этого избавиться, ZBuffer необходимо очищать перед каждым кадром так же, как мы очищаем BackBuffer.

Добавляем в процедуре Render флаг очистки ZBuffer. D3dDevice.Clear 0, ByVal 0, D3DCLEARTARGET Or D3DCLEARZBUFFER, &H346666, 1, 0 Теперь все отображается корректно. Убедитесь в этом, удаляя и приближая вершины треугольников (меняя значение PosZ). Код данного проекта находится на компакт-диске в папке Pr03. 3D, перспектива, матрицы Очевидно, что способ, которым мы в предыдущей главе рисовали треугольники, неудобен и неполноценен для 3D игр. Неудобен потому, что мы, построив сложную сцену, лишены возможности взглянуть на нее с другой точки.

Камера всегда направлена вдоль оси Z так, что ось X направлена вправо. Чтобы посмотреть, например, вдоль оси X, необходимо пересчитать позиции всех вертексов сцены! То же и в случае масштабирования, придется пересчитывать позиции вертексов, и при смене разрешения экрана или размеров формы – опять предстоит перерасчет, ведь шкала жестко привязана к размеру пикселя. Неполноценность заключается в отсутствии перспективы – видимый размер наших треугольников не зависит от расстояния до них (координаты Z). Чтобы избавиться от этих недостатков, нужно отказаться от «приведенного» формата вертекса. Но сначала немного теории. В математике существует понятие «матрица» – таблица чисел, построенная по определенным правилам.

Из всех типов матриц нас будет интересовать только один – квадратная (4 × 4) таблица чисел типа Single. Фактически это таблица коэффициентов в системе уравнений, которая описывает почти любое изменение (трансформацию) пространства. Это прежде всего перемещение и масштабирование – наиболее простые трансформации, это также поворот вокруг любой из осей координат или вокруг произвольной оси.

Матрицей можно описать перспективу – изменение видимого размера объекта в зависимости от расстояния до него. Кроме того, одной единственной матрицей можно задать любое сочетание всех перечисленных трансформаций. Правда есть некоторые ограничения – после любого преобразования прямая останется прямой (либо выродится в точку), а плоскость – плоскостью (либо выродится в прямую или точку). Каким образом произвести расчет нужной матрицы? Ответ на этот вопрос может дать курс аналитической геометрии, но мы не будем углубляться в дебри науки, так как, к нашей радости, в составе DirectX уже имеется набор готовых функций. Каким образом применять матрицы? D3dDevice содержит несколько трансформаций, которые задаются с помощью метода SetTransform, рассмотрим три основные:.

Visual Basic 6.0 Создание Игры

Первая – трансформация мира, обозначаемая D3DTSWORLD. Записывая в неё матрицу, например, перемещения, мы вызываем соответствующее перемещение всей выводимой в дальнейшем геометрии. Вторая – трансформация камеры или обзора D3DTSVIEW. Её действие противоположно трансформации мира. Записывая в D3DTSVIEW матрицу вращения вокруг оси Y на 30 градусов, мы получим вращение мира на -30 градусов, что соответствует повороту камеры (иначе говоря, глаз наблюдателя) на 30 градусов.

То есть с помощью этой трансформации мы задаем точку, из которой смотрим на наш 3D мир, и направление взгляда. Третья – трансформация проекции D3DTSPROJECTION. Она задает проекцию изображения на экран монитора (точнее на BackBuffer). Это может быть ортогональная проекция или перспектива, левосторонняя или правосторонняя. Создадим новый проект, взяв за основу предыдущий.

Добавим глобальную переменную типа D3DMATRIX. Private Sub InitMatrix D3DXMatrixIdentity Mtrx d3dDevice.SetTransform D3DTSWORLD, Mtrx D3DXMatrixPerspectiveFovLH Mtrx, 3.141593 / 4, Me.ScaleHeight / Me.ScaleWidth, 0.1, 10 d3dDevice.SetTransform D3DTSPROJECTION, Mtrx D3DXMatrixLookAtLH Mtrx, vec3(0, 0, -2), vec3(0, 0, 0), vec3(0, 1, 0) d3dDevice.SetTransform D3DTSVIEW, Mtrx End Sub Рассмотрим ее подробнее.

Все фильмы митхуна чакроборти. • Все фильмы • • По алфавиту • Премьеры • Подборки • • 720p • 1080p • 1440p • 2160p • По странам: • Зарубежные • Русские • Советские • Топ 250 • 2018 2017 2016 • Аниме • Биография • Боевики • Вестерн • Военный • Детектив • Детский • Для взрослых • Документальные • Драмы • Исторический • Комедии • Короткометражка • Криминал • Мелодрамы • Мистика • Музыка • Мюзикл • Новости • Оригинал • Отечественные • Передачи с ТВ • Приключения • Реальное ТВ • Семейный • Спорт • Ток-шоу • Триллеры • Ужасы • Фантастика • Фильм-нуар • Фэнтези • На английском • На украинском.

С помощью D3DXMatrixIdentity рассчитывается матрица «нулевого» преобразования (или идентичности) и в следующей строке записывается в трансформацию мира. Это означает, что координаты, указанные в вертексе, будут использоваться без каких-либо изменений, как есть. С помощью D3DXMatrixPerspectiveFovLH рассчитывается матрица левосторонней перспективы, описывающая камеру с углом зрения 45º по вертикали (значение 3.141593 / 4 указано в радианах), и с отношением размера по вертикали к размеру по горизонтали, соответствующим размеру формы. Последние две величины – ограничение ближнего и дальнего планов видимости, зачем это нужно – рассмотрим чуть позже.

Эта матрица записывается в трансформацию проекции. И остается трансформация обзора, D3DXMatrixLookAtLH позволяет задать позицию наблюдателя в пространстве (первый вектор), направление его взгляда (второй вектор) и направление «вверх» (третий вектор). В нашем примере наблюдатель из точки «0, 0, -2» смотрит в начало координат. Направление «вверх» соответствует направлению оси Y. Теперь зададим геометрию. D3DXMatrixRotationY Mtrx, Timer d3dDevice.SetTransform D3DTSWORLD, Mtrx Теперь, не меняя позиции наблюдателя, мы видим сцену с разных сторон. Мы вращаем саму сцену.

Строительство программа сетевой график. Вернемся к рассмотрению D3DTSPROJECTION, почему бы не расширить зону видимости по оси Z от 0 до ∞? Дело в использовании ZBuffer, расстояние до рисуемого пикселя преобразуется перед записью в ZBuffer в значение от 0 до 1, что мы видели при использовании приведенного формата.

Это значение имеет конечную точность, чем шире мы будем раздвигать границы, тем больше вероятность ошибки при Z-отсечении. Попробуем поменять значения zn и zf. D3DXMatrixPerspectiveFovLH Mtrx, 3.141593 / 4, Me.ScaleHeight / Me.ScaleWidth, 0.0001, 1000 Запускаем программу и видим результат неточности.

Восстановим прежнее значение трансформации проекции и попробуем осуществить более сложное движение. Допустим, нам нужно так же вращать нашу «стрелу», но отодвинув ее на некоторое расстояние назад. Можно, конечно, отодвинуть наблюдателя, но что, если в сцене много разных объектов? Они отодвинутся все, а нам нужно, чтобы отодвинулась «стрела». Второй вариант – перезаписать в вертексы новые значения, но этот вариант тоже неудобен, вдруг нам нужно не разово отодвинуть «стрелу», а передвигать ее постоянно, как мы постоянно ее вращаем.

То есть нужно перемещение задавать матрицей, но как записать в одну трансформацию сразу две матрицы, вращения и перемещения? В математике для матриц определено действие умножения, при этом в результате получается матрица, объединяющая обе трансформации пространства. Добавим в основной цикл две строки. Do While Running DoEvents D3DXMatrixRotationY Mtrx, Timer d3dDevice.SetTransform D3DTSWORLD, Mtrx D3DXMatrixTranslation Mtrx, 0, 0, 1 d3dDevice.MultiplyTransform D3DTSWORLD, Mtrx Render Loop Здесь мы рассчитали матрицу вращения, записали ее в D3DTSWORLD, потом рассчитали матрицу перемещения и домножили D3DTSWORLD на эту матрицу. Запускаем программу – результат не совсем правильный, «стрела» переместилась на некоторое расстояние, но продолжает вращаться вокруг начала координат, а не вокруг своей оси, которая с началом координат уже не совпадает.

Дело в том, что в умножении матриц, в отличие от умножения чисел, важен порядок множителей, и этот порядок обратный по отношению к порядку трансформаций. Поменяем местами матрицы таким образом.

D3DXMatrixTranslation Mtrx, 0, 0, 1 D3DXMatrixRotationY Mtrx2, Timer D3DXMatrixMultiply Mtrx, Mtrx2, Mtrx d3dDevice.SetTransform D3DTSWORLD, Mtrx Как обычно, код данного проекта находится на компакт-диске в папке Pr04. Рисуем цилиндр.

Создание

TriangleStrip От проекта к проекту мы постепенно осваиваем приемы программирования DirectX. Как правило, каждый новый проект основывается на предыдущих, поэтому дальше я не буду комментировать все изменения и дополнения, если эти изменения и дополнения уже изучены.

Если, например, в новом проекте изменена позиция наблюдателя (матрица трансформации D3DTSVIEW), то вы можете понять это и без комментариев, так как у вас есть код всех проектов. Представим, что нам нужно изобразить цилиндр. Естественно мы его имитируем с помощью призмы, ведь нам недоступны кривые линии. Призма, имеющая 64 боковых грани уже достаточно близко соответствует цилиндру, остановимся на этом числе граней. Каждая грань призмы – это прямоугольник, который мы можем отобразить двумя треугольниками. Итого нам нужно 128 треугольников или 128.

3 = 384 вертекса. Согласитесь, многовато. А ведь позиции каждого вертекса совпадают с позицией еще двух вертексов, принадлежащих другим треугольникам, если мы сможем вместо трех таких вертексов использовать один – мы уменьшим размер вертексного буфера в 3 раза. И такой способ есть, он заключается в использовании параметра D3DPTTRIANGLESTRIP вместо D3DPTTRIANGLELIST в методе d3dDevice.DrawPrimitive. Рассмотрим принцип его работы. Первые три вертекса из вертексного буфера, как и раньше, соответствуют первому отображаемому треугольнику, а вот следующий треугольник задан не 4-ым, 5-ым, 6-ым, а 2-ым, 3-ым, 4-ым вертексами.

Только лицевой уже считается та сторона, на которой вертексы расположены против часовой стрелки. Следующий треугольник задается 3-ым, 4-ым, 5-ым вертексами, на лицевой стороне вертексы опять расположены по часовой стрелке, и так далее.

Это можно изобразить так: В результате получается лента из треугольников, где для N треугольников необходимо задать N+2 вертексов. Если наш цилиндр задать такой лентой, свернутой в кольцо, нам понадобится всего 130 вертексов. Если непосредственно задавать 130 вертексов, это займет много страниц кода. Поэтому переделаем процедуру InitGeometry.

Создадим вспомогательную функцию для задания одного вертекса. D3dDevice.DrawPrimitive D3DPTTRIANGLESTRIP, 0, 128 Это означает вывод ленты из 128 треугольников из вертексного буфера, начиная с нулевого вертекса. Бланк диагностической карты автомобиля. Запускаем программу и видим разноцветный цилиндр. Код данного проекта находится на компакт-диске в папке Pr05.

Категория: Добавил: (14 Января 2011) Просмотров: 12741 Комментарии: 6 Рейтинг: 4.8/ 6 Теги:, Дополнительные опции: Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга: Игровые объявления и предложения. Если вас заинтересовал материал «Программирование 3D графики на Visual Basic 6 и DirectX 8. Часть 1», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже.

Данный список сформирован автоматически по тематическим меткам раздела. Предлагаются такие схожие материалы:. Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.

Всего комментариев: 6.