Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programming / GameProg / RPG_Programming_2ed.pdf
Скачиваний:
243
Добавлен:
12.02.2016
Размер:
12.06 Mб
Скачать

Глава 13. Работа с картами и уровнями

// Загрузка используемых сеток и анимаций cMesh Mesh;

cAnimation Anim; Mesh.Load(&Graphics, "barrier.x"); Anim.Load("barrier.x", &Mesh);

// Назначение сеток и анимаций обеим загруженным барьерам

Barrier.SetMesh(1, &Graphics, &Mesh);

Barrier.SetMesh(2, &Graphics, &Mesh); Barrier.SetAnim(1, &Anim, "AnimationName", 0); Barrier.SetAnim(2, &Anim, "AnimationName", 0);

Проверка столкновений с барьерами

Чтобы увидеть, заблокирована ли область карты, вызовите GetBarrier с координатами персонажа. Если возвращается значение TRUE, проход

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

Вы используете трио значений, представляющих перемещение персонажа по каждой из осей, чтобы предварительно определить, заблокировано ли передвижение барьером. Скажем, персонаж перемещается на 10 единиц вдоль оси Z, и это значит, что в входящей переменной ZMove

будет установлено значение 10. Эта переменная ZMove прибавляется к текущему местоположению персонажа, и, если произошло пересечение с барьером, переменная ZMove очищается, запрещая таким образом данное передвижение вдоль оси, как показано ниже:

//XPos, YPos, ZPos = координаты персонажа

//XMove, YMove, ZMove = значения перемещения персонажа

if(Barrier.GetBarrier(XPos+XMove, YPos+YMove, ZPos+ZMove) == TRUE) {

// Проход запрещен, очищаем переменные перемещения

XMove = YMove = ZMove = 0.0f;

}

Визуализация барьеров

Теперь вам надо только вызвать cBarrier::Render, чтобы нарисовать все объекты барьеров в поле зрения:

// Frustum = ранее инициализированный объект cFrustum

Barrier.Render(timeGetTime(), &Frustum);

Использование автоматических карт

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

638

netlib.narod.ru

Джим Адамс

Вам необходимо отображать только те части карты, которые игрок исследовал. Места, которые еще ни разу не были посещены, показывать не надо, то есть их следует показывать только тогда, когда они обнаружены игроками. Таким образом, игроки смогут оглянуться назад, где они уже были, и, возможно, взглянуть вперед и наметить пути для будущих экспедиций. Это волшебство называется автоматической картой.

Автоматические карты в действии

Одна из моих любимых игр, Phantasy Star Online, выпущенная Sega, использует автоматические карты цельным образом. Посмотрите на рис. 13.5, который показывает рабочую автоматическую карту в верхнем правом углу экрана.

Рис. 13.5. Phantasy Star Online использует плоскую двухмерную версию уровня, как показано выше

В Phantasy Star Online главный игрок и другие важные персонажи игры отображаются на автоматической карте как небольшие стрелки. Когда главный игрок ходит вокруг, карта прокручивается, чтобы показывать область вокруг игрока. Когда игрок посещает новую комнату (область), она появляется на автоматической карте.

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

Большие карты, малые карты

Главный вызов здесь — преобразовать ваш большой игровой уровень в маленькую карту, подходящую для отображения в вашей игре. На рис. 13.6

netlib.narod.ru

639

Глава 13. Работа с картами и уровнями

показан снимок экрана демонстрационной программы Mapping. Обратите внимание на карту в верхнем правом углу экрана. Она использует альфасмешивание (обратитесь к главе 2 за дополнительной информацией по этой теме), чтобы было видно игровое действие под ней.

Рис. 13.6. Демонстрационная программа Mapping использует автоматическое картографирование, чтобы отображать области карты, которые игрок уже посетил

Простейший способ создать уменьшенную версию игрового уровня — перейти в редактор трехмерной графики и загрузить тот уровень, уменьшенную карту которого вы собираетесь сконструировать. На рис. 13.7 показан пример уровня, загруженный в MilkShape 3D и готовый для работы.

ВНИМАНИЕ!

MilkShape 3D неспособен показывать большие сетки,

 

поэтому, чтобы рассмотреть сразу весь уровень, вам

 

может потребоваться уменьшить масштаб сетки для

 

работы, а затем вернуть прежний масштаб, когда вы

 

будете записывать результат.

Для начала выберите все полигональные грани, нажав Ctrl+A. Щелкните по вкладке Groups и выберите Regroup для создания единой сетки. Затем щелкните по вкладке Materials и щелкайте Delete, пока не будут удалены все материалы. В результате вы должны получить единую сетку, которая не использует наложение текстур.

Теперь сложная часть: пройдитесь по всей сетке и удалите несущественные полигоны. В их число входят полигоны, которые никогда не будут видимы при взгляде сверху, которые используются для украшения, или представляют стены. Вам надо оставить только те полигоны, из которых состоит земля. Чтобы удалить грани, выберите ее (вам надо щелкнуть Select, а затем Face) и нажмите клавишу Delete.

640

netlib.narod.ru

Джим Адамс

Рис. 13.7. Пример уровня, загруженный в редактор MilkShape 3D и готовый для преобразования в уменьшенную карту

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

Рис. 13.8. Перекрывающиеся полигоны на малой карте при визуализации с альфа-смешиванием могут создавать странные цветовые артефакты

После небольшой переработки, как вы можете видеть на рис. 13.9, моя загруженная сетка уровня сократилась только до тех полигонов, которые доступны персонажам. Я добавил несколько новых полигонов, которые будут полезны при разделении сетки на несколько областей.

netlib.narod.ru

641

Глава 13. Работа с картами и уровнями

Рис. 13.9. Малая карта содержит значительно меньше полигонов. Полигоны готовы к группировке в отдельные секции

Рис. 13.10. Выбор граней — первый этап построения отдельных областей карты

И, наконец, карту надо разделить на меньшие фрагменты (которые, по сути, являются отдельными комнатами на карте), которые открываются по

642

netlib.narod.ru

Джим Адамс

мере того, как персонаж обнаруживает их. Начнем с отмены выделения (нажмите Shift+Ctrl+A). Теперь щелкните вкладку Model, щелкните Select и выберите Face.

Щелкайте по тем граням, которые вы хотите включить в один фрагмент карты. Как видно на рис. 13.10, я выбрал группу граней в верхнем левом углу сетки. Эти грани будут образовывать первую область карты.

Когда все нужные грани выбраны, снова щелкните по вкладке Groups и выберите Regroup. Обратите внимание, что создана новая группа

(рис. 13.11).

Рис. 13.11. Создана новая группа граней

Поздравляю! Вы создали вашу первую область карты. Щелкните по группе Regroup01, снимите выбор со всех граней, и начинайте выбирать грани для следующего фрагмента карты. Продолжайте выбор граней и их перегруппировку, пока вся карта не будет разделена на различные группы.

Для карты примера я разбил сетку на четыре индивидуальных группы, представляющих верхний левый, верхний правый, нижний левый и нижний правый углы уровня. Итоговый файл карты вы найдете в примере программы из этой главы. Пойдемте дальше, запишем вашу карту и экспортируем ее в файл .X (используйте экспортер файлов .X, созданный мной и поставляемый на диске с этой книгой).

netlib.narod.ru

643

Соседние файлы в папке GameProg