Меню:
Главная страница Перечень курсов обучающего центра BlitzSchool Вход для слушателей Галерея О нас  
Голосование:
Результаты Какой курс для начинающих программистов Вам бы был интересен?
Ваш вариант Разработка 3D игр на C++
Разработка игр на Flash
Создание 3D игр на Flash
Создание игр для мобильных телефонов
Разработка браузерных стратегий (Travian,Ikariam и т.д.)
Создание 3D игр на Delphi/Pascal
Создание 3D игр без программирования


Какой новый курс Вы бы хотели видеть на нашем сайте?
Новости игр:


EA Sports Active расширяет охват
Немецкое издательство bitComposer Games приобрело у Strategy First права на серию Jagged Alliance и объявило о начале разработки сиквела. По словам новых владельцев бренда, Jagged Alliance 3 останется верна общей концепции своих предшественниц, а действие ее сюжета, как и прежде,...

Читать дальше

Еще одна RPG для EA
Японская студия-разработчик Cing, известная по целому ряду игр, среди которых — адвенчура Hotel Dusk: Room 215, симулятор фермера Harvest Moon и RPG Little King's Story, объявила о своем банкротстве. Сумма долгов компании составляет...

Читать дальше

Ja, ja, JA 3!
Студия Elemental Games, сделавшая себе имя на «Космических рейнджерах», работает над новым проектом в той же вселенной — онлайн-игрой «Время звезд». Игроки попробуют себя в роли свободных капитанов, отстаивающих интересы одной из...

Читать дальше

Подсчитывая убитых
Студия 5th Cell работает над продолжением логической аркады Scribblenauts, в которой герой решает головоломки, материализуя нужные ему объекты с помощью обширного словаря.

Теперь можно будет использовать не только имена существительные, но и прилагательные, а объем словаря...

Читать дальше

Cing R.I.P.
Новая игра с участием Лары Крофт — Lara Croft and the Guardian of Light, анонсированная в начале недели, неспроста лишена слов «Tomb Raider» в заголовке. Этим летом поклонники знаменитой «расхитительницы гробниц» смогут взглянуть на нее под...

Читать дальше

Польский призрак
Ubisoft обзавелась собственной игрой про футбол. Правда, проект студии Ubisoft Vancouver посвящен не большому спорту, а мини-футболу в формате «5 на 5». Главным отличием от других игровых серий станет визуальная стилистика. Вместо гладкой картинки, имитирующей телетрансляцию,...

Читать дальше

Время онлайновых звезд
Конфликт между Activision Publishing и бывшими руководителями студии Infinity Ward, уволенными 1 марта, перешел в новую стадию. Джейсон Уэст и Винс Зампелла подали в суд на Activision, обвиняя компанию в...

Читать дальше
   
 

КАК ОСУЩЕСТВЛЯЕТСЯ ИЗЛОЖЕНИЕ МАТЕРИАЛА (на примере курса "Создание 3D игр"):

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

В качестве демонстрации изложения фрагмента одного из уроков
, рассмотрим такой интересный пример, как управление камерой в играх от третьего лица. Для этого примера понадобится стандартная модель из комплекта поставки (
Blitz3D) робот (robotic.3ds) и набор текстур для нее.



Цель программы - привязать камеру к модели робота, чтоб всегда видеть его спину. Управление движением модели будем производить с помощью клавиатуры.
Камеру и модель опишем в виде пользовательских типов следующим образом

В пользовательском типе Player: entity - родительский объект для модели, model - загружаемая с диска сама модель робота.
В пользовательском типе
SmartCam: entity - родительский объект для модели робота , camera - дескриптор камеры, target, heading - объекты, связанный с моделью робота, определяющие взаимоувязку его и камеры.

Загрузка всех необходимых медиа-ресурсов произведем в следующей функции:

Function LoadGameObjects()

  level=
LoadMesh( "maps\tur.b3d" )

 
ScaleEntity level,.15,.15,.15
 
EntityType level,TYPE_WALL


  player_model =
LoadAnimMesh( "ROBOT\robotic.3DS" )
 
ScaleEntity player_model,.2,.2,.2
 
LoadAnimSeq player_model, ("ROBOT\running.3DS" )
 
TurnEntity player_model,0,-180,0
 
HideEntity player_model

End Function

В качестве уровня используется объект  в формате .b3d, сделанный в редакторе CartographyShop 4.1  (ссылки на инструменты, которые мы будем использовать в курсе и другие полезные программы, смотрите тут: Полезные ссылки)
После загрузки уровня (для упрощения он представляет собой - пол, стенку и наклонные поверхности для демонстрации гравитации) он проходит масштабирование (функция
ScaleEntity) и ему присваивается тип -
TYPE_WALL (функция EntityType) для контроля столкновений с ним модели робота.
Далее происходит загрузка модели (
LoadAnimMesh) и анимационной последовательности его движения (LoadAnimSeq )

Создание самих объектов робота и камеры приведем ниже:

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,2
 
Return p
End Function

Function
CreateSmartCam.SmartCam( entity )
  c.SmartCam=
New SmartCam
  c\entity=entity
  c\camera=
CreateCamera()

  c\target=
CreatePivot( entity )
  PositionEntity c\target,0,5,-10
  EntityType c\target,TYPE_TARGET

  c\heading=
CreatePivot( entity )
  PositionEntity c\heading,0,0,20
  Return c
End Function

При создании объекта робота (CreatePlayer.Player( x#,y#,z# )) - вначале создается пустой объект при помощи команды New. После чего инициализируем переменные объекта: entity и model.
Позиционирование в пространстве осуществляется функцией
PositionEntity. Функция EntityRadius задает радиус шара, который используется для столкновения модели с поверхностями уровня. Чем меньше радиус, тем ближе к стене может приблизиться модель.

При создании объекта камеры (
CreateSmartCam.SmartCam( entity )) - используется стандартная функция CreateCamera() Поля target и heading инициализируются как пустые объекты (pivot) и позиционируются в пространстве для установки благоприятного "видения" камерой модели.

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

;================================
Function
UpdatePlayer( p.Player )

If KeyDown(203) ;поворот налево/направо
 
TurnEntity p\entity,0,5,0
Else If KeyDown(205)
 
TurnEntity p\entity,0,-5,0
EndIf

If KeyDown(30) ;движение вперед кл. А
 
If p\anim_speed<=0
    p\anim_speed=1.75
   
Animate p\model, 1, 1.5, 1, 10
 
EndIf
 
MoveEntity p\entity,0,0,1
Else If KeyDown(44) ;движение назад кл. Z
 
If p\anim_speed>=0
    p\anim_speed=-1.75
   
Animate p\model, 1, 1.5, 1, 10
 
EndIf
 
MoveEntity p\entity,0,0,-1
Else If p\anim_speed ;остановка анимации
  p\anim_speed=0
 
Animate p\model, 2, 1, 0, 10
EndIf

ty#=
EntityY(p\entity)
y_vel#=(ty-p\player_y)
p\player_y=ty

y_vel=y_vel -.5
TranslateEntity p\entity,0,y_vel,0
End Function

;================================
Function UpdateSmartCam( c.SmartCam )

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*ssp,dy*ssp,dz*ssp

PointEntity c\camera,c\heading

PositionEntity c\target,0,0,0
ResetEntity c\target
PositionEntity c\target,0,20,-15

End Function

В функции UpdayePlayer осуществляется реакция программы на нажатия клавиш A/Z - движение модели робота вперед/назад и стрелок вправо/влево. Изменение режимов анимации осуществляется при помощи команды Animate.  Всего этих режимов два - для перемещения робота и при отсутствии движения. Второй аргумент команды Animate как раз отвечает за смену последовательностей анимации. Движение модели робота вперед/назад осуществляется при помощи команды MoveEntity. Переменная y_vel отвечает за гравитацию. То есть, по сути, модель стремится к движению по оси Y, чему мешает пол уровня (коллизии учитываются автоматически при задании соответствующих зависисмостей ). Как только робот покидает пол, гравитация скидывает его в пропасть.

Почему модель не проваливается сквозь пол? За этот процесс отвечает контроль столкновений или коллизий описанный ниже:

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

Collisions TYPE_PLAYER,TYPE_WALL,2,2
Collisions TYPE_TARGET,TYPE_WALL,2,2

Команда Collisions устанавливает зависимости между разными объектами при их столкновении. Так зависимости установлены между объектами - "камера-уровень" и "робот-уровень".

Что касается функции
UpdateSmartCam, то она занимается синхронизацией и ориентированием камеры относительно модели робота. Клавиши вперед/назад - меняют угол наклона камеры.
переменная
ssp - отвечает за скорость (плавность) приближения камеры к модели робота. Команда
PointEntity  просто дает указание камере "смотреть" на модель.
Экран примера выглядит примерно так:


Полный текст примера находится здесь:  (
smartcam.bb) , архив программы с моделями и текстурами можно взять тут:
(smartcam.zip).


Уроки сопровождаются тестом и домашним заданием, которые не обязательны, но желательны для выполнения.
Все вопросы, касательно уроков, неясных моментов, а также предложения, комментарии и организационные вопросы просьба отсылать по электронному адресу
learning@blitz-school.info

 

 
 
Copyright© 2005-2010. Blitz-School