Приветствую Вас Гость | Зарегистрироваться | Вход | RSS

Поиск по сайту:
Поиск в интернете:
Главная » Статьи » Учебники по Blitz3d

Учебник для начинающих по Blitz3d (Часть 1_1)
Полный учебник по Blitz 3D. Часть 1.
Этот раздел представляет не просто урок, а полный учебник по Blitz3D. В учебнике рассмотрены,
практически, все команды и все аспекты программирования игр на языке Blitz3D.

Введение в создание игр

Итак, у Вас есть прекрасная возможность почувствовать себя богом, который создаёт вселенную.
Но сначала давайте разберёмся, из чего же она будет состоять. А состоит она из разных объектов.
Большая часть – это так называемые 3D объекты (Mesh). Что это такое? 3D объекты – это просто
модели. Цилиндр, куб, шар, Ваша собственная модель – всё это 3D объекты. Они состоят из вершин
– это просто точки в пространстве, и треугольников, состоящих из трёх соединённых вершин.
Но это можно пока не запоминать – к этому мы подойдем чуть позже. Но, кроме 3D объектов, к
объектам относятся: свет (Light), камеры(Camera), и пивоты (Pivot) или центры. Пивоты – это
невидимые точки в пространстве, которые очень помогают в процессе работы. Далее, из двухмерного
мира к нам пришли спрайты (Sprite). Спрайты - это просто плоские объекты, состоящие из четырёх
вершин и двух треугольников, т.е. это просто плоская картинка. Потом плоскость (Plane) – тот же
спрайт, только бесконечный. Их обычно используют для создания неба, воды – всего, что должно
быть плоским и бесконечным. И, наконец ландшафт (Terrain), но его мы затрагивать не будем.

Далее, вселенная - трёхмерная, так что у неё есть 3 оси – X, Y, Z. Ось X – это ось ширины,
направленная слева направо. Ось Y – высота, идущая снизу вверх. И ось Z – как, бы длина,
направленная вперёд! Эти оси существуют не только у всей вселенной, но и у каждого объекта
тоже, но и об этом тоже по порядку.

Это была вводная часть в 3D мир, без которого нельзя было обойтись, чтобы знать, что вообще
мы собираемся делать. Но, более - менее мы всё поняли, так что идём дальше! Пора уже приступать
к программированию – зайдите в Blitz3D, и наберите следующий код:

Graphics3D 640,480,16,1
SetBuffer BackBuffer()
Repeat
Until KeyHit(1)
End

Момент, когда Вы это запустите, можете считать историческим, и отмечать его, как день
рождения - Вы только что создали собственный мир! Пусть там ничего не видно – просто он пока
пустой! Разберём все команды по порядку:

Graphics3D 640,480,16,1 – эта строчка инициализирует Direct3D, ну, и создаёт вселенную.
Синтакс такой: Graphics3D ширина, высота, глубина цвета, режим. Ширина, высота – размер
создаваемого экрана (в пикселях). Глубина – глубина цвета – 16, 24 или 32 бита на пиксель.
 Режим:

0 - оконный во время разработки (если возможно), полноэкранный в .exe формате; 1 - всегда
полноэкранный
2 - всегда оконный
3 - всегда оконный, с возможностью изменения размеров окна.

SetBuffer BackBuffer() - устанавливает буфер на задний буфер. Те, кто знали, те поняли, те же,
кто не знали, не поняли вообще. В общем, если хотите, чтобы всё было правильно, пишите эту
команду после Graphics3D.

Repeat и Until KeyHit(1) - между этими двумя командами, у нас будет происходить сам цикл игры.
Перевод таков: Повторять до нажатия клавиши Esc.

End – эта команда показывает, что программа завершена.

Что, не впечатляет? А зря – вы только что создали окно Direct3D – практически Ваше окно в мир
создания компьютерных игр!

Создание простейшей 3D программы

Вставим следующий кусок кода после инициализации графики:

cam=CreateCamera()
cub=CreateCube()


В этих строках мы создаём наши первые объекты. cam=CreateCamera() – здесь, мы создаём камеру,
(как бы наши «глаза» в виртуальном мире), и помещаем её в переменную cam. cub=CreateCube() –
таким же образом создаём 3D-объект – куб, и называем cub. Созданные нами объекты очутятся в
начале координат, т.е. в точке с координатами 0, 0, 0. Чтобы камера не была в одной точке с
кубом, а смотрела на него со стороны, нам нужно поставить куб в другое место. Для этого можно
воспользоваться командой PositionEntity, которую мы расположим после команды создания куба.

PositionEntity cub,0,0,5

PositionEntity cub,0,0,5 - ставит объект куб в точку с координатами 0,0,5 – т.е. немного
впереди. Синтакс: PositionEntity объект, координата X, координата Y, координата Z.

В цикл программы вставим следующие три строчки:

UpdateWorld
RenderWorld
Flip


Эти команды (точнее последние две) должны присутствовать в Вашей программе, если Вы хотите,
чтобы она что-то Вам показывала.

UpdateWorld - анимирует все объекты в созданном мире, и проводит проверку на столкновения.

RenderWorld
- рендерит все объекты. Т.е. создаёт картинку той части мира, которую видит
камера(ы).

Flip – меняет местами передний и задний буфер. На этом основан способ двойной буферизации,
но это знать не обязательно – просто нужно вставлять эту команду, для того, чтобы на экране
что-то появлялось.

Итак, теперь запустите программу. Что Вы видите? Серый квадрат? Практически да, хотя на самом
деле – это куб, просто мы смотрим на него прямо, и видим только одну грань.

Хоть какой-то прогресс. Дальше интереснее. Заставим-ка его двигаться! Поставим эту строчку в
цикл. Прямо в самое его начало после команды Repeat.

TurnEntity cub,.1,.2,.3

TurnEntity cub,.1,.2,.3 – эта функция поворачивает объект cub на 0.1 градус по оси X, 0.2
градуса по оси Y, и 0.3 градуса по оси Z, относительно системы координат объекта. Естественно,
здесь можно использовать отрицательные числа и ноль. Например, команда TurnEntity cub,0,.1,0 –
будет поворачивать куб просто влево, а TurnEntity cub,0,-.1,0 – вправо.

Итак, первая сложность (хотя в общем ничего сложного здесь нет, это наоборот даже удобно).
Попробую объяснить: помните, я говорил, что оси X, Y и Z (т.е. система координат) есть не
только у самой вселенной, но и у каждого объекта. Сделано это для удобства. Главная – «мировая»
система координат – статичная, и нужна нам для того, чтобы узнать где, например, находится
объект, а система координат объекта – двигается и поворачивается вместе с самим объектом.

Например, у нас есть персонаж, который должен поворачиваться и ходить вперёд, допустим, мы его
повернули на какой-то угол. И, если мы захотим сделать так, чтобы он шёл в ту сторону, в
которую он направлен через «мировую» систему координат, нам придётся делать вычисления,
рассчитывающие то, на какой угол он повёрнут, и насколько должен передвинуться относительно каждой оси, но, к счастью, у него есть собственная система координат, и, где бы он не находился, как бы он не был повёрнут относительно «мировой» системы координат, его ось Z будет указывать направление вперёд - назад (относительно него), Y – вверх-вниз, X – влево-вправо. Иногда нужно наоборот – независимо от того, куда направлен объект, двигать его в какую-то определённую сторону, относительно всего мира. Так, например, действует гравитация – т.е. как бы не был повёрнут объект со своей системой координат, мы просто двигаем его вниз по оси Y по «мировой» системе координат – и он падает.

Это было небольшое отступление, чтобы всё было ясно. Сами команды будут позже.

Итак, когда Вы запустите эту программу, Вы увидите вращающийся куб. Правда чего-то не хватает? Да! Все его грани одинакового цвета, и мы понимаем, что это куб чисто интуитивно. Что же закрашивать каждую грань разными цветами? Нет до этого мы не доросли, да это и не нужно. То, что нам не хватает – это свет! Именно он должен оживить всю сцену. Да будет свет!

lit=CreateLight()

Здесь всё также, как и раньше! Эту команду можно поставить в любом месте перед главным циклом, но я обычно создаю свет сразу после создания камеры. Теперь запустите программу. Так намного лучше, неправда ли? Да, кстати, свет – это объект, а это значит, что им тоже можно управлять, как и всеми объектами. Поэтому, чтобы он лучше смотрелся, сразу же после создания повернём его:

TurnEntity lit,45,45,0

По-моему так лучше… или у Вас есть другие варианты?

А весь код выглядит так:

Graphics3D 640,480,16,1
SetBuffer BackBuffer()
cam=CreateCamera()
lit=CreateLight()
TurnEntity lit, 45,45,0
cub=CreateCube()
PositionEntity cub,0,0,5
Repeat
TurnEntity cub,.1,.2,.3
UpdateWorld
RenderWorld
Flip
Until KeyHit(1)
End


Ну, и как Вам? Всего 14 строчек сделали то, для чего в других языках пришлось бы писать несколько страниц! Вот, в общем первая трёхмерная программа. Не бойтесь экспериментировать – попробуйте подставить свои значения углов, или назвать объекты по-другому (тут главное изменить названия переменных во всём коде, а не только в команде создания). А чтобы убедиться, что вы всё хорошо усвоили, попробуйте сделать так, чтобы в цикле поворачивался не только куб, но и свет. В следующем уроке мы научимся управлять объектом сами.

Использование клавиатуры для перемещения объекта

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

Ну, тогда давайте разбираться с перемещением предмета. Я надеюсь, что предыдущие уроки Вы хорошо освоили, так что начнём сразу с такого шаблона:

Graphics3D 640,480,16,1
SetBuffer BackBuffer()
cam=CreateCamera()
PositionEntity cam,0,5,-10
lit=CreateLight()
cub=CreateCube()
Repeat
UpdateWorld
RenderWorld
Flip
Until KeyHit(1)
End


Здесь мы (по порядку) инициализируем графику, создаём камеру, свет, куб и в цикле всё это рендерим и выводим на экран, пока не будет нажата клавиша Esc. Обратите внимание, что здесь мы поменяли позицию камеры (а не куба, как в прошлый раз), и теперь она имеет координаты X=0 Y=5 Z=-10. В итоге, получилось, что мы смотрим на куб сзади, и чуть-чуть сверху. В нашем распоряжении имеется куб. Наша миссия двигать его, в направлении, задаваемом с клавиатуры.

Итак, новые команды:

KeyDown(сканкод) – (вообще-то не команда, а функция) – проверяет, нажата ли соответствующая клавиша. В скобках нужно указать сканкод клавиши (сканкоды клавиш можно узнать в Help'e Blitz3D, в разделе Command Reference). Мы будем управлять клавишами управления курсора и манипулятором типа мышь. Значит сразу напишу сканкоды (всем запомнить – пригодится): кнопка вверх – 200, вниз – 208, влево – 203, вправо – 205. С мышкой разберёмся позже.

MoveEntity
объект, перемещение по X, по Y, по Z – перемещает объект относительно своей собственной системы координат. Так, у нас есть команда проверки нажатия клавиш, и есть команда перемещения объекта, осталось только связать их вместе. Как это сделать? Очевидно, просто надо поставить условие (ЕСЛИ НАЖАТА кнопка ВВЕРХ то ПЕРЕДВИНУТЬ ОБЪЕКТ ВПЕРЁД), ну, и так далее. Я надеюсь Вы прочитали учебник по основам Blitz Basic, поэтому команду условия IF я уж объяснять не буду.

Вот так это должно выглядеть:

If KeyDown(200) MoveEntity cub,0,0,.1

Поставьте это условие в начало цикла, и запустите прогу. Теперь, когда Вы будете нажимать кнопку вверх, куб будет двигаться по направлению оси Z, т. е. вперёд. По аналогии сделаем остальные условия:

If KeyDown(208) MoveEntity cub,0,0,-.1
If KeyDown(203) MoveEntity cub,-.1,0,0
If KeyDown(205) MoveEntity cub,.1,0,0


Полностью код выглядит так:

Graphics3D 640,480,16,1
SetBuffer BackBuffer()
cam=CreateCamera()
PositionEntity cam,0,5,-10
lit=CreateLight()
cub=CreateCube()
Repeat
If KeyDown(200) MoveEntity cub,0,0,.1
If KeyDown(208) MoveEntity cub,0,0,-.1
If KeyDown(203) MoveEntity cub,-.1,0,0
If KeyDown(205) MoveEntity cub,.1,0,0
UpdateWorld
RenderWorld
Flip
Until KeyHit(1)
End


Кубик двигается! Что ещё нужно для счастья? Я думаю достаточно, но Blitz3D предоставляет нам очень много возможностей на этой почве, и в следующих уроках мы постараемся уяснить самые важные.

Доработка кода программы

Круто, конечно, объект перемещается, но мы попробуем немного модернизировать программу. Две последние строчки проверки нажатия клавиш немного изменим. Теперь, когда мы будем нажимать кнопки ВЛЕВО и ВПРАВО он будет поворачиваться влево и вправо (раньше он перемещался влево и вправо). Итак строчки:

If KeyDown(203) MoveEntity cub,-.1,0,0
If KeyDown(205) MoveEntity cub,.1,0,0

Нужно заменить на:

If KeyDown(203) TurnEntity cub,0,1,0
If KeyDown(205) TurnEntity cub,0,-1,0


Вот у нас уже что-то вроде автогонок вырисовывается (точнее кубогонок). Так, команду TurnEntity Вы уже знаете, но обратите внимание, что если мы хотим, чтобы наш объект вертелся именно влево или вправо, мы поворачиваем его по оси Y. Чтобы немного было понятнее, где у него передняя часть, а где боковые, я предлагаю его немного трансформировать.

ScaleEntity cub,1,.5,2


Эту команду нужно вставить после команды создания куба (смотрите не вставьте её в цикл ). Синтаксис: ScaleEntity объект, трансформация по X, по Y, по Z. То есть в примере мы оставляем такой же размер по X (ширину) (1 значит, что мы оставляем тот же размер), трансформируем размер по Y (высоту) до 0.5 от его размера (то есть просто уменьшаем в 2 раза) – получается как бы сплющиваем его сверху, и в два раза увеличиваем размер по Z (длину) – то есть растягиваем его в длину. Получился, что-то похожее на кирпич.

Вот ездит этот кирпич, ездит, да заезжает за экран, так что мы перестаём его видеть. А как бы сделать так, чтобы не терять его из виду? Здесь нам поможет такая замечательная команда PointEntity объект1, объект2 – эта команда просто поворачивает объект1 в сторону объекта2. То есть если мы хотим, чтобы наша камера всегда следила за нашим кубиком, нам просто нужно вставить эту команду в цикл. Вот как это делается:

PointEntity cam,cub


Эту команду можно вставить в любое место в цикле, но, чтобы у нас было всё по порядку, поставим её после команд проверяющих нажатия клавиш. Вот полный код:

Graphics3D 640,480,16,1
SetBuffer BackBuffer()
cam=CreateCamera()
PositionEntity cam,0,5,-10
lit=CreateLight()
cub=CreateCube()
ScaleEntity cub,1,.5,2
Repeat
If KeyDown(200) MoveEntity cub,0,0,.1
If KeyDown(208) MoveEntity cub,0,0,-.1
If KeyDown(203) TurnEntity cub,0,1,0
If KeyDown(205) TurnEntity cub,0,-1,0
PointEntity cam,cub
UpdateWorld
RenderWorld
Flip
Until KeyHit(1)
End


Опять же столько всего, только в 18 строчках! Если запустить программу, то видно, что камера как бы следит за кубиком, хотя это плохо понятно – такое чувство, как будто он ездит сам как хочет. Всё это потому, что у нас нет ничего, с чем мы могли бы сравнивать его положение.
Категория: Учебники по Blitz3d | Добавил: blitz3d-portal (08.Декабрь.04) E W
Просмотров: 7617 | Комментарии: 1 | Рейтинг: 3.3/7
Всего комментариев: 1
1 Elumifather  
0
Кому интересно - вот мой видео учебник по Blitz3D. Скоро будет больше серий. http://www.youtube.com/watch?v=zLJx3gGv0DM

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]