Меню:
Главная страница Перечень курсов обучающего центра BlitzSchool Вход для слушателей Галерея О нас  
Голосование:
Результаты Какие курсы, кроме представленных на сайте, Вы хотели бы пройти?
Ваш вариант Игры для платформ iOS и Android
3D Игры на Flash
3D Игры без программирования
Создание стратегии (в стиле Starcraft)
Создание hack and slash игры (в стиле Diablo)
Создание гоночных симуляторов
Игры для xBox, PSP


Вы готовы предложить свой вариант?
   
 

КАК ОСУЩЕСТВЛЯЕТСЯ ИЗЛОЖЕНИЕ МАТЕРИАЛА (на примере курса "Создание 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).


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

 

 
 
Copyright© 2005-2017. Blitz-School