Воскресенье, 22.12.2024, 14:35 | Приветствую Вас Гость

Information inovation!

Главная » Статьи » Компы! » Програмирование!

КАК ОСУЩЕСТВЛЯЕТСЯ ИЗЛОЖЕНИЕ МАТЕРИАЛА:
Материал уроков излагается на конкретных действующих примерах. Код приводится по частям и рассматривается очень подробно. Полный код вместе с медиа-ресурсами (графика, звуки, модели и т.д.) прилагается после рассмотрения отдельных фрагментов.

В качестве демонстрации изложения фрагмента одного из уроков, рассмотрим такой интересный пример, как управление камерой в играх от третьего лица. Для этого примера понадобится стандартная модель из комплекта поставки (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 просто дает указание камере "смотреть" на модель.
Экран примера выглядит примерно так:

Категория: Програмирование! | Добавил: Prise (13.06.2007)
Просмотров: 739 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Наш опрос
Как вам мой сайт
Всего ответов: 70
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz