ria pc game
fle game engine - движок для создания игр
fle game engine - движок для создания игр


Balls and holes PC game / Balls and Holes PC игра
Вакансии
Игродельня
Сегодня
17 февраля 2019 20:50
Вход Регистрация Забыли пароль ?

megainformatic - Костя Коробкин - В гостях у тёти Светы часть 2 Живые машины (kk as) - онлайн комикс - страница 15
Костя Коробкин - В гостях у тёти Светы (kk as) - онлайн комикс - страница 15 Онлайн-комикс Костя Коробкин - В гостях у тёти Светы - интерактивный комикс (kk as). - Привет ! - О ! Привет !
подробнее...

Теги создание сайтов, создание игр, дизайн, игры, информатика, уроки photshop, php, c++, музыка, delphi, cms, робосайт
Статьи сайта
megainformatic - Уроки Photoshop - Чудеса - Коллаж от нуля - страница 2

megainformatic - Уроки Photoshop - Чудеса - Коллаж от нуля - страница 3

megainformatic - Уроки Photoshop - Чудеса - Коллаж от нуля - страница 4

megainformatic - Купить Уроки Photoshop - Чудеса

megainformatic - Уроки Photoshop

megainformatic - Уроки Photoshop - Рисуем волка из мультфильма

megainformatic - Уроки Photoshop - Рисуем волка из мультфильма стр 2

megainformatic - Уроки Photoshop - Рисуем волка из мультфильма стр 3

megainformatic - Уроки Photoshop - Рисуем волка из мультфильма стр 4

megainformatic - Уроки Photoshop - Анимируем волка из мультфильма

megainformatic - Уроки Photoshop - Анимируем волка из мультфильма стр 2

megainformatic - Уроки Photoshop - Анимируем волка из мультфильма стр 3

megainformatic - Уроки Photoshop - Анимируем волка из мультфильма стр 4

megainformatic - Эмулятор игры Ну, Погоди!

megainformatic - Оплата заказа через Сбербанк

megainformatic - Пример игры с исходным кодом Donuts3D

megainformatic - Как создать игру ВЕСЕЛЫЙ БУКВОЕЖКА - программируем сами

megainformatic - Как создать игру ВЕСЕЛЫЙ БУКВОЕЖКА - создаем игровую оболочку

megainformatic - Открытый Полный Исходный код игры Дорога в Город

megainformatic - Как создать игру - Веселый Единственный Буквоежка - программируем основу будущей игры

megainformatic - Как создать игру - Веселый Единственный Буквоежка - выводим заставку

megainformatic - Как создать игру - Веселый Единственный Буквоежка - игровое меню

megainformatic - Как создать игру - Веселый Единственный Буквоежка - движение и анимация героя

Как Создать игру ВЕБ - Веселый Единственный Буквоежка - Программируем сами

Как Создать игру ВЕБ - Веселый Единственный Буквоежка - Программируем сами

megainformatic - Примеры моих работ

megainformatic - Музыкальные темы

megainformatic - Уроки Photoshop - Чудеса

megainformatic - Купить Уроки Photoshop - Чудеса

megainformatic - Онлайн Обучение, Репетитор

megainformatic - Уроки Photoshop - Рисуем и Анимируем

megainformatic - Уроки Photoshop - Рисуем и Анимируем - Урок 1 - Старт

megainformatic - Уроки Photoshop - Рисуем и Анимируем на AllSoft.ru

megainformatic - DirectX 9c - Изучаем пример MultAnimation

megainformatic - megainformatic cms Система Управления Контентом

megainformatic - Темы для WordPress

megainformatic - Что нужно для создания собственного сайта ?

megainformatic - Макет дизайна Вашего сайта

скачать megainformatic cms

megainformatic - Итоги 2010 года

megainformatic - Что нужно для создания собственного сайта ?

megainformatic - как создать инсталлятор для собственной cms

megainformatic - Новости - страница 2

Нововведения в megainformatic cms

Web Администрирование

Уроки Верстки

Система автоматизированной е-майл рассылки

Система автоматизированной е-майл рассылки

megainformatic - Выгрузка файла на сайт

megainformatic - выпадающее меню на html и css

megainformatic - Использование checkbox

Краеугольная особенность работы Web-form на примере смены состояния checkbox

Технологии WEB

Технологии WEB - AJAX-запросы

Часто Задаваемые Вопросы

Продукты

подробнее

     
  Мастер-класс: Создание модели и текстуры Коммандного Центра (как в StarCraft 2)  
     
  модель коммандного центраСкачать готовую модель вы можете кликнув по картинке.  
     
  Этот объемистый урок расскажет Вам как научиться создавать нечто подобное: всем известно, что вышла игра StarCraft 2 компании Blizzard. Об этой игре ходят легенды. Но не дожидаясь когда вам удастся засесть за игру, а также для того, чтобы пополнить свои навыки и умения попробуем вообразить себя "крутым дизайнером" (прямо как из Blizzard) и попробовать создать модель и текстуру для коммандного центра из StarCraft 2.  
     
 

Часть 5

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

 
     
  О создании текстурных разверток подробно рассказывалось в статье - Создание текстурной развертки для модели автомобиля .  
     
  Стоит только добавить, что в качестве вспомогательной текстуры более удачной можно считать примерно такую текстуру -  
     
   
     
  Почему нужно использовать примерно такую вспомогательную текстуру (или подобную ей)? При создании текстурной развертки Вы сможете наблюдать данную текстуру на поверхности самой модели. Размер и форма узора из треугольников на текстуре позволят Вам задавать для проецируемых на развертку граней примерно сопоставимые размеры - т.е. избежать излишнего уменьшения или увеличения отдельных элементов. Отслеживать этот процесс позволяет именно размер и форма получаемого узора на поверхности модели.  
     
  В результате Вашей работы Вы должны получить следующую текстурную развертку для модели Коммандного Центра -  
     
  скачать модель и развертку (356 Кб)  
     
  Модель с готовыми текстурными координатами также можно скачать здесь. (356 Кб).  
     
  Для вывода созданной текстурной развертки в файл нужно выполнить следующую последовательность действий -  
     
  - Выбрать в сцене объект для которого осуществляется вывод (в нашем случае это например Основа Коммандного Центра).  
     
  - Осуществить команду Render > Render To Texture и в открывшемся диалоговом окне осуществить последовательно настройки как показано на рисунке  
     
   
     
 

1) Добавление элемента для отрисовки, откроется новый диалог в котором нужно выбрать Диффузный цвет, т. е. DiffuseMap

2) Задаете имя и расширение для создаваемого файла

3) Задаете результирующий слот в настройках текущего материала куда будет помещена созданная текстура

4) Задаете размер текстуры в пикселях (все текстуры квадратные)

5) Осуществляете процесс вывода изображения развертки в файл

 
     
  Вот например предварительный вид текстурной развертки Основания Коммандного Центра -  
     
   
     
  Теперь можно слегка видоизменить созданную текстуру в Photoshop для обеспечения бесконфликтного наложения разверток последующих объектов составляющих Коммандный Центр - например так -  
     
   
     
  И в редакторе материалов заменить использованную вспомогательную текстуру на созданную -  
     
   
     
   
     
  Обратите также внимание: Если для вспомогательной текстуры Вы использовали Tiling установив флажки Tile и указав количество тайлов по U и V, то для новой созданной текстуры тайлинг уже использовать не нужно, т.к. развертка не будет тайловой!!! Вам нужно установить параметры тайлинга как показано на рисунке выше (Tiling U = 1; V = 1)  
     
  Далее повторяете данную последовательность действий постепенно добавляя на текстуру развертки всех составляющих Коммандный Центр объектов.  
     
  Вот что примерно может получиться в результате -  
     
   
     
  Цвет текстуры задавался для отдельных разверток посредством корректирующего цветного слоя в Photoshop.  
     
  Как видите получилась достаточно компактная, но не использующая всего пространства текстурная развертка, поэтому придется повторить процесс снова уделив каждому из объектов максимум пространства.  
     
  Вот что примерно должно получиться в итоге -  
     
   
     
  Теперь по изображению полученной развертки можно приступить к самому интересному - рисованию текстуры! Этим мы и займемся далее.  
     
  [назад] [далее - рисуем текстуру по развертке]  
     
подробнее

     
  [Все уроки 3ds max] [Галерея моделей] [назад] [далее]  
     
 

Продолжаем Создание скелета для данной модели

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

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

 
Итак, вот цепочка костей для левой руки -
 
кости левой руки
 
При создании костей со значениями размеров по умолчанию они будут слишком большими (0,254m). Чтобы этого избежать предварительно задайте нужный размер или используйте панель модификаций (Modify). Расположите цепочку костей так, чтобы она лежала наиболее естественно и находилась внутри руки (кроме концевой кости - она носит вспомогательный характер, поэтому должна находиться снаружи модели и это нормально! далее поймете почему). На виде сверху видно что цепочка костей идет не строго прямо, а слегка под углом, что соответствует модели руки персонажа.
 
Переименуйте кости так, чтобы к ним в дальнейшем было легко обращаться, например так - плечо-предплечье-кисть-кончик - что будет соответствовать 3ds max'овскому - LArm_Bone_shoulder - LArm_Bone_forearm - LArm_Bone_fingers - LArm_Bone_tip
 
Названиям следует уделять такое пристальное внимание потому, что имея сложную модель Вам легче будет ориентироваться в составляющих ее объектах.
 
Для того, чтобы сгиб руки происходил естественно применим к цепочке костей инструмент IK - HI Solver.
 
Выберите кость LArm_Bone_shoulder. Она будет корнем иерархии костей левой руки. Выберите пункт меню Animation > IK Solvers > HI Solver и щелкните на кости LArm_Bone_tip
 
иерархическая цепочка костей левой руки с примененным HI Solver
 
Откройте панель Motion, переименуйте IK Chain01 в LArm_IK_Chain, там же несколько уменьшите размер Целевой (Goal) точки IK -
 
изменение размеров указателя целевой (goal) точки прикрепления HI Solver
 
Что нам дает созданный IK - Hi Solver? А попробуйте теперь выбрать Целевую (goal) точку и перемещать ее инструментом Select And Move добиваясь даже сгиба руки.
 
Инструмент IK Solver - HI Solver моделирующий сгиб руки
 
Как видите сгиб связки костей происходит, но не с точки зрения того как на самом деле сгибается рука. Такой изгиб костей для нормальной руки выглядит неестественным. Следовательно мы расположили кости не совсем правильно. Как это исправить?
 
Сначала проведем небольшой эксперимент по созданию цепочки из трех костей, коррекции их положения и применения инструмента HI Solver.
 
экспериментальная цепочка костей с примененным HI Solver
 
Как видно из рисунка для достижения правильного сгиба кости должны располагаться не строго в одну линию, а с небольшим сгибом в ту сторону, в которую мы хотим сгибать их при помощи IK HI Solver.
 
Удалите все экспериментальные и созданные для левой руки кости и переделайте работу так, чтобы сгиб руки в горизонтальном направлении происходил правильно.
 
новая цепочка костей левой руки с корректным сгибом
 
Для того, чтобы легче было манипулировать перемещением используем вспомогательный объект Dummy. Это пустой (не отрисовываемый) объект, который можно использовать как ручку для управления конечностью модели.
 
Выберите панель Create нажмите кнопку Helpers и создайте объект Dummy. Расположите его так, чтобы он охватывал Целевую точку (goal) инструмента инверсной кинематики (LArm_IK_Chain) для левой руки.
 
создание вспомогательного управляющего объекта
 
Сам по себе объект Dummy не играет никакой роли, но если осуществить привязку к нему нужных объектов (в нашем случае LArm_IK_Chain), то он действительно будет работать как удобная рукоятка - смещая LArm_Dummy (так его можно назвать) вы будете смещать LArm_IK_Chain, который будет в свою очередь смещать все связанные с ней кости левой руки. Впоследствии, когда Вы осуществите привязку вершин модели к скелету, смещения костей будут вызывать смещения связанных с ними вершин. Таким образом получится иерархическая цепочка, но результатом будет - смещая LArm_Dummy вы сместите нужные вершины модели относящиеся к руке.
 
Привязка (link) осуществляется от подчиненного (привязываемого объекта) к главному (в нашем случае - от LArm_IK_Chain к LArm_Dummy).
 
Выберите LArm_IK_Chain и нажмите кнопку Select and Link на панели инструментов -
 
ние движения курсора для установления связи
 
И протащите связывающий курсор мыши от подчиненного объекта (LArm_IK_Chain) к главному (LArm_Dummy). При этом Dummy на какое-то мнгновение станет выделенным, а потом выделение исчезнет. Проверьте что связь работает - перемещения LArm_Dummy должны приводить к соотвествующим перемещениям скелета левой руки. Если это не так или если Вы ошибочно связали LArm_Dummy с другим объектом, то можно выделить оба неверно связанных объекта и разорвать связь кнопкой Unlink Selection (правее от Select and Link).
 
Для того, чтобы визуально удостовериться в правильности сделанной связи можно открыть окно схематического вида - Graph Editors > New Schematic View
 
окно схематического вида сцены
 
В нём Вы визуально проследите все имеющиеся в сцене иерархические связи. На рисунке стрелка идет от LArm_Dummy к LArm_IK_Chain - значит связь установлена верно. Можете закрыть окно Схематического вида.
 
Если Вы экспериментировали с перемещением LArm_Dummy и связанной с ним цепочки скелета левой руки - отмените сделанные перемещения, чтобы скелет руки располагался в первоначальной позиции.
 
Аналогичным путем можно создать скелет для правой руки. Советую потренироваться еще. Если Вы уже преуспели в создании костей скелета, применении HI Solver и установлении связей с управляющим Dummy-объектом, то можете просто клонировать и зеркально отобразить всю цепочку объектов скелета левой руки (кости, HI Solver и Dummy) и расположить их для правой руки. Не забудьте только переименовать созданные объекты, чтобы они соответствовали наименованиям для правой руки - RArm_Bone_shoulder, RArm_Bone_forearm, RArm_Bone_fingers, RArm_Bone_tip, RArm_IK_Chain, RArm_Dummy.
 
Подобным же образом Вам нужно построить скелет для левой и правой ног, спины и головы. Окончательно всё это будет выглядеть так -
 
готовый скелет модели
 
Щелкнув по данному изображению Вы можете скачать готовую модель с внедренным скелетом.
 

Архив имеет размер 204 Кб. Текстуру к нему Вы можете взять из архива nn. Архив включает следующие файлы -

fedja_skinned_char.max - готовый скелет модели и привязка посредством модификатора Skin

fedja_anim.max - готовый к анимации персонаж

fedja_anim_go.max - анимация хотьбы

 
Изучив модель скелета и установленные связи между объектами (их можно посмотреть в схематическом виде - Schematic View) вы увидите, что корнем иерархии является объект Body_Dummy. К нему привязаны все остальные объекты Dummy, которые в свою очередь привязаны к IK цепочкам костей. У костей спины (Spine_Bone, Head_Bone) вы увидите выступы. Они создаются для облегчения наблюдения за ориентацией кости. Чтобы создать их в панели модификаций кости установите в группе Bone Fins соответствующие нужным выступам флажки, если требуется - откорректируйте их размеры.
 
создание выступов кости
 
Следующие важные моменты. Под ногами модели персонажа вы увидите схематичный рисунок человечка. Он означает, что все относящиеся к скелету объекты - кости, IK HI Solver, Dummy были выделены в сцене и преобразованы в персонаж (Character) командой меню Character > Create Character (это было актуально в более ранних версиях 3ds max, в более современных нужно
добавить на панель инструментов кнопку Create Character (об этом чуть ниже).

create a character

Кстати если у вас на панелях инструментов нет кнопки Create a Character - её нужно добавить -
Customize - Customize User Interface

Toolbars

Category - Characters

и перетащить элемент Create a Character
на нужную панель инструментов. После этого можно будет её нажимать - предварительно выделив в сцене

все, что будет объединено в группу Character.



далее -

Такое формирование позволяет теперь обращаться ко всем объектам скелета как к единому целому - отвечающему за скелет персонажа.
 
Для привязки скелета к модели персонажа используется модификатор Skin. После применения модификатора в него добавляются все объекты скелета, которые будут влиять на модель данного меша. Это делается кнопкой Add в панели модификаций в группе Parameters с последующим выбором нужных объектов скелета.
 
настройка огибающих костей скелета
 
Далее осуществляется настройка огибающих костей скелета (Envelopes). И ведется настройка степени влияния каждой кости на вершины модели, т.е. осуществляется настройка весовых коэффициентов. Внутренний (красный) контур огибающей задает степень влияния всех попадающих в нее костей дополняя сумму весовых коэффициентов до 1. Внешний (коричневый) контур представляет отсутствие влияния (спад влияния до 0).
 
Обратите внимание - настройка огибающих осуществляется только инструментов Select And Move (остальные будут недоступны). Полезными функциями в группе Envelope properties в окне параметров модификатора Skin при открытом и выбранном узле Envelope (см. рисунок - в стеке модификаций выбран желтым пункт Envelope) являются Copy и Paste. Они позволяют Вам копировать огибающие костей для одной конечности (например для выбранной кости левой руки) и вставлять ее в аналогичную (или подобные) кости правой руки. Это значительно ускоряет процесс настройки огибающих.
 
Для настройки огибающих выбирайте внутренние обработчики (серые квадратики) для смещения огибающих и внешние (на красной и коричневой области) для масштабирования области огибающей.
 
В окне параметров вы также найдете и другие полезные функции, в том числе Weight Table которая позволяет задать или изменить весовые коэффициенты для каждой вершины и влияющих на нее костей вручную. Это бывает полезно для тех вершин, которые плохо охватываются огибающими.
 
Перед экспортом в формат X обязательно задайте следующие параметры модификатора Skin -
 
установка подходящих для экспорта параметров модификатора Skin
 
Установите флажок для выбора вершин, выделите все вершины, установите параметры Rigid, Rigid Vertices. Количество костей одновременно влияющих на одну вершину (Bone Affect Limit) не задавайте более 4. Меньшие значения сделают анимацию вершин менее плавной, но и сократят сложность анимации и количество вычислений на обработку и вывод анимации.
 
     
  [Все уроки 3ds max] [Галерея моделей] [назад] [далее]  
     
     
подробнее

     
 

Видео урок посвященный созданию игры Ну, Погоди ! - рождение игры часть 3.

Покажет Вам простейшую элементарную игру и особенности её создания в delphi 7 на directx 8.1 api.

 
     
 
Урок 3 Оконный и полноэкранный режимы работы D3D-приложения. Управление игрой средствами DirectInput8
 
О том, что потребуется для данного урока читайте в основном разделе - уроки delphi directx 8.1
 
Далее у читателя подразумевается наличие базовых знаний языка Delphi.
 
[назад] [страница 1] [далее] [к содержанию]
 
 
 

Оконный и полноэкранный режимы работы имеются во всех современных играх написанных и в OpenGL и в DirectX.

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

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

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

Если Вам ясен весь материал, изложенный в 2х предыдущих уроках, то в общих чертах работа D3D-приложения в оконном режиме Вам тоже должна быть понятна.

Размер рабочей области окна D3D в оконном режиме определяется размерами того окна, чей обработчик (Handle) задан при передаче параметров во время создания объекта IDirect3DDevice8

В этом легко убедиться заглянув в код методов TD3DGameApp.Create_ и TD3DGameApp.CreateDisplayObjects

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

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

В случае оконного режима это может быть обычный пункт меню TMainMenu. В полноэкранном режиме ситуация несколько сложнее - в этом режиме главное меню окна не отображается, именно поэтому для выхода из полноэкранного режима нужно использовать какую-либо клавишу (комбинацию клавиш), причем обрабатываемую средствами DirectInput, можно также использовать игровое меню, реализуемое средствами Direct3D без использования TMainMenu.

О том, как создать и использовать такое меню описано в статье - Создание игрового меню

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

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

Использование DirectInput8 для того, чтобы пользователь мог быстро управлять игрой, а игра быстро реагировать на команды пользователя сводится к следующему -

в пункт uses секции interface нужно подключить модуль DX8_DIUtil8.pas из библиотеки Delphi DirectX 8.1

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

const

ChangeWindowModeKey = isButton1; //константа isButton1 определена в модуле DX8_DIUtil8.pas

в описании класса D3D-приложения (класс TD3DGameApp в нашем случае) добавить поле

m_DXInput: TDXInput; //управление игрой через DirectInput

Также в описании класса нужно добавить несколько новых методов -

// Input functions
procedure SetDefaultDefKeys;
procedure CreateInputObjects;
procedure DestroyInputObjects;
procedure UpdateInput;

 

Далее в секции implementation нужно реализовать код данных методов -

procedure TD3DGameApp.SetDefaultDefKeys;
begin
FCustomKeyAssign := DefineDefaultKeys;
//процедуру DefineDefaultKeys нужно определить как локальную для модуля //главной формы Вашего проекта
end;

в секции интерфейса она записывается как

function DefineDefaultKeys: TKeyAssignList;

а в секции реализации как

function DefineDefaultKeys: TKeyAssignList;
begin
FillChar(Result, SizeOf(Result), 0);

AssignKey(Result, ChangeWindowModeKey, [Ord('W'), VK_F6]); //к данному действию привязываются клавиши W и F6

end;

далее реализуем код оставшихся методов

procedure TD3DGameApp.CreateInputObjects;
begin
SetDefaultDefKeys;
m_DXInput := TDXInput.Create(Self);
end;

procedure TD3DGameApp.DestroyInputObjects;
begin
FreeAndNil(m_DXInput);
end;

procedure TD3DGameApp.UpdateInput;
var
CurrentState: TUserInput;
begin
if not Assigned(m_DXInput) then Exit;

m_DXInput.Update;

if ChangeWindowModeKey in m_DXInput.States then {выполнить нужное действие};

end;

вызов метода CreateInputObjects нужно добавить внутри TD3DGameApp.OneTimeSceneInit

вызов метода DestroyInputObjects нужно добавить внутри TD3DGameApp.FinalCleanup или другом методе освобождения ресурсов, который вызывается из FormDestroy

вызов метода UpdateInput, в котором осуществляется обновление состояния устройств DirectInput и вызов методов обработки тех или иных действий пользователя нужно добавить внутри метода TD3DGameApp.FrameMove

 
Итак, переключение полноэкранного/оконного режимов D3D-приложения будет происходит по действию ChangeWindowModeKey. Данное действие будет вызываться клавишами [W] или [F6]. Можете использовать другие клавиши, если хотите.
 

Остается в строке кода

if ChangeWindowModeKey in m_DXInput.States then {выполнить нужное действие};

комментарий {выполнить нужное действие}

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

Таким методом является следующий -

procedure TOptionsMenu.AcceptOptions;
var
ScreenSizeMetric: TScreenSizeMetric;
begin
if g_d3dApp = nil then Exit;
ScreenSizeMetric := GetScreenSize;
if (not g_d3dApp.m_bFullScreen = Windowed) and
(g_d3dApp.m_dwScreenWidth = ScreenSizeMetric.Width) then Exit;

g_d3dApp.SwitchDisplayModes(not Windowed, ScreenSizeMetric.Width,
ScreenSizeMetric.Height);
end;

В данном случае такой метод реализован как метод объекта меню TOptionsMenu и вызывается при подтверждении смены заданных настроек приложения. В данном случае настройки достаточно просты. Проверяется заданное в настройках разрешение экрана и если произошла смена режима оконный/полноэкранный или изменилось заданное разрешение будет вызван метод SwitchDisplayModes объекта g_d3dApp, который является экземпляром класса TD3DGameApp.

В простейшем случае можно рассмотреть реализацию переключений между оконным режимом приложения и полноэкранным режимом с разрешением например 800x600 пикселей и максимальной частотой покадровой развертки поддерживаемой монитором (100 Hz или выше).

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

function SwitchDisplayModes(bFullScreen: Boolean;
dwWidth, dwHeight: Cardinal): HRESULT;

Затем реализуйте его в коде следующим образом -

function TD3DGameApp.SwitchDisplayModes(bFullScreen: Boolean;
dwWidth, dwHeight: Cardinal): HRESULT;
var
hr: HResult;
begin
if not m_bIsActive or not m_bDisplayReady then begin
result := S_OK;
Exit;
end;

// Check to see if a change was actually requested
if bFullScreen then
begin
if ((m_dwScreenWidth = dwWidth) and (m_dwScreenHeight = dwHeight)) and
(m_bFullScreen = bFullScreen ) then
begin
result := S_OK;
Exit;
end;
end
else
begin
if not m_bFullScreen then begin
result := S_OK;
Exit;
end;
end;

// Invalidate the old display objects
m_bDisplayReady := FALSE;
InvalidateDisplayObjects;

// Set up the new presentation paramters
if bFullScreen then
begin
m_d3dpp.Windowed := FALSE;
m_d3dpp.hDeviceWindow := m_hWndMain;
m_dwScreenWidth := dwWidth;
m_d3dpp.BackBufferWidth := dwWidth;
m_dwScreenHeight := dwHeight;
m_d3dpp.BackBufferHeight := dwHeight;
m_d3dpp.BackBufferFormat := m_d3dfmtFullscreen;
end
else
begin
m_d3dpp.Windowed := TRUE;
m_d3dpp.hDeviceWindow := 0;
m_d3dpp.BackBufferWidth := 0;
m_d3dpp.BackBufferHeight := 0;

m_dwScreenWidth := dwWidth;
m_dwScreenHeight := dwHeight;

m_d3dpp.BackBufferFormat := m_DesktopMode.Format;
end;

// Reset the device
hr := m_pd3dDevice.Reset( m_d3dpp );
if SUCCEEDED(hr) then
begin
m_bFullScreen := bFullScreen;
hr := RestoreDisplayObjects;
if SUCCEEDED(hr) then
begin
m_bDisplayReady := TRUE;
result := S_OK;
Exit;
end;
end;

// If we get here, a fatal error occurred
PostMessage( m_hWndMain, WM_CLOSE, 0, 0 );
result := E_FAIL;
end;

Все недостающие поля, описанные в реализации данного метода необходимо добавить в класс TD3DGameApp и инициализировать их в методе конструктора TD3DGameApp.Create и других необходимых методах, где это понадобится.

Заметьте, что внутри данного метода каждый раз при переключении между полноэкранным/оконным режимами или при смене разрешения полноэкранного режима происходит инвалидация InvalidateDisplayObjects всех зависимых от Direct3DDevice ресурсов, вызывается метод сброса устройства Direct3DDevice, а затем происходит восстановление ресурсов RestoreDisplayObjects

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

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

 
Для лучшего понимания этих важных моментов, Вам обязательно нужно познакомиться с исходным кодом игры [Пример игры Donuts3D], а также со статьями и исходниками посвященными работе над проектом Нечто: Необъяснимое
 
В качестве практики предлагаю Вам внедрить вышеописанные технологии в код проекта своего D3D-приложения посвященного практической работе над данным уроком.
 
[назад] [страница 1] [далее] [к содержанию]
 
 
 
 
     
     
     
     
     
подробнее

     
  Веселый Буквоежка - игра  
     
 

Как создать игру ? - Программируем сами.

Рассмотрение программирования игр под DirectX 9c на C++ с использованием среды разработки MSVS 2005 или выше.

 
     
  [содержание] [назад] [страница 4] [далее]  
     
  Введение в 2d-игры - создаем заставку для игры  
     
  Итак, мы создали основу нашей будущей игры. Теперь займемся изучением принципов вывода и использования статичных и анимированных изображений из файлов jpg и tga на примере вывода титульной заставки игры.  
     
  пример вывода титульной заставки игры  
     
 

Помимо этого мы рассмотрим как создать класс приложения и все необходимые для работы дополнительные классы, в частности мы покажем объявление классов:

CGameAppLoader

CD3DGameApp

и рассмотрим как применяется класс

CD3D9Sprite для работы со спрайтами и статичными 2d-изображениями.

 
     
  Вы воочию увидите как создаются и применяются данные классы.  
     
 

Классы CGameAppLoader, CD3DGameApp объявляются в заголовочном файле Fle.h

Класс CD3D9Sprite полностью реализован в модулях D3DGUI.h и D3DGUI.cpp и представляет класс для использования 2d-изображений и спрайтов в d3d-приложениях и играх, полностью его код Вы найдете в исходном коде, если закажете ПОЛНЫЙ ИСХОДНЫЙ КОД игры Веселый Единственный Буквоежка за 200 рублей.

 
     
 
 
 
     
  Здесь и далее мы рассмотрим код указанных классов только с точки зрения необходимых нам для решения задач данного урока возможностей, если Вы хотите увидеть их ПОЛНЫЙ ИСХОДНЫЙ КОД - закажите его.  
     
  Параллельно мы коснемся основ использования DirectInput8, т. к. он на понадобится для управления нашей игрой.  
     
 

В модуле Fle.h

в самом начале файла после строки -

#include "resource.h" // main symbols

набрать следующий код -

#include <d3d9.h>
#include <d3dx9.h>

#include "D3DGUI.h"
#include "diutil.h"

#include "AdventureGame.h"

#include "d3dfont.h"

описать возможные состояния загрузчика -

// загрузчик


enum LOADINGSTATES{
LOADSTATE_BEGINSTARTLOGO,
LOADSTATE_STARTLOGO,
LOADSTATE_ENDSTARTLOGO,

LOADSTATE_BEGINMENU,
LOADSTATE_MENU,
LOADSTATE_ENDMENU,

LOADSTATE_BEGINADVENTUREINTRO,
LOADSTATE_ADVENTUREINTRO,
LOADSTATE_ENDADVENTUREINTRO,

LOADSTATE_BEGINLOADADVENTUREGAME_LOCTEX,
LOADSTATE_ADVENTUREGAME_LOCTEX,
LOADSTATE_ENDADVENTUREGAME_LOCTEX,

LOADSTATE_BEGINLOADADVENTUREGAME_CREATURE,
LOADSTATE_ADVENTUREGAME_CREATURE,
LOADSTATE_ENDADVENTUREGAME_CREATURE,

LOADSTATE_BEGINLOADADVENTUREGAME_SUBJECTS,
LOADSTATE_ADVENTUREGAME_SUBJECTS,
LOADSTATE_ENDADVENTUREGAME_SUBJECTS,

LOADSTATE_BEGINLOADADVENTUREGAME_SUBJECTS_PLATES,
LOADSTATE_ADVENTUREGAME_SUBJECTS_PLATES,
LOADSTATE_ENDADVENTUREGAME_SUBJECTS_PLATES,

LOADSTATE_BEGINLOADADVENTUREGAME_SUBJECTS_PLATES_LETTERS,
LOADSTATE_ADVENTUREGAME_SUBJECTS_PLATES_LETTERS,
LOADSTATE_ENDADVENTUREGAME_SUBJECTS_PLATES_LETTERS,

LOADSTATE_BEGINLOADADVENTUREGAME,
LOADSTATE_ADVENTUREGAME,
LOADSTATE_ENDADVENTUREGAME

};

и сам загрузчик -

class CGameAppLoader
{
public:
CGameAppLoader();
~CGameAppLoader();
//поля и методы загрузчика

CPtrArray* m_pLoaderTexturesArray;

void Start(CPtrArray* TxArray, LPCTSTR TexFilesPath, LPCTSTR TexFilesListTxt);
void LoadingProcess(CPtrArray* TxArray, LPCTSTR TexFilesPath,
LPD3DXSPRITE pSprite = NULL);
void LoadingResProcess(CPtrArray* TxArray, LPCTSTR TexFilesPath,
LPD3DXSPRITE pSprite);
void LoadingLtProcess(CPtrArray* TxArray, LPCTSTR TexFilesPath,
LPD3DXSPRITE pSprite = NULL);
void End();
void NextLoadStage();


//вывода ротора

float m_fRotorAngle;

void LoadLoaderTextures();
void DrawLoaderScreen();

void RestoreLoaderScreen();
void InvalidateLoaderScreen();
void FreeLoaderTextures();
void AnimateRotor();


void RenderLoaderText();


LPD3D9FONT m_pLoaderFont_2d;
void CreateFont_2d();
void FreeFont_2d();
void RestoreFont_2d();
void InvalidateFont_2d();
void RenderLoaderText_2d();


void Load1GameTexture(CPtrArray* TxArray, LPCTSTR TexFilesPath,
int* CurrentFileIndex, LPD3DXSPRITE pSprite);
void Load1GameTextureRes(CPtrArray* TxArray, LPCTSTR TexFilesPath,
int* CurrentFileIndex, LPD3DXSPRITE pSprite);
void Load1LetterPlate(CPtrArray* TxArray, LPCTSTR TexFilesPath,
int* CurrentFileIndex, LPD3DXSPRITE pSprite);


void OpenGameTexturesListFile(/*CPtrArray* TxArray, */LPCTSTR TexFilesPath,
LPCTSTR TexFilesListTxt);
void CloseGameTexturesListFile();

CStdioFile* m_pTextFile;

//статистика загрузки
int m_iCurrentIndex;
float m_fLoadingProgressStep;
float m_fLoadingProgress;
int m_iFilesNum;
TCHAR m_sTexFileName[MaxPath2];
char m_chTexFileName[MAX_PATH];

//смена загружаемых ресурсов
DWORD m_dwLoaderState;

void Loading();
int CountNumberOfFiles();

float m_fRotateProcessTimeCounter;


};

после строк -

//название приложения
#define GameAppName L"Веселый Буквоежка"

добавить строки -

#define ParamDelimeter ';'

#define GAMEERR_NOINPUT 0x00000006
#define GAMEERR_OUTOFMEMORY 0x00000007


// файл списка текстур загрузчика
#define TexturesPath L"\\Media\\textures\\"
#define LoaderTexFilesPath L"\\Media\\textures\\initial\\"
#define LoaderTexFilesTxt L"\\Media\\textures\\initial\\loader_texlist.txt"

#define LoaderFontFileName L"\\Media\\fonts\\BALTICA.TTF"
#define LoaderFontHeight 18
#define LoaderFontWidth 10
#define LoaderFontRescaleCorrect 1.0f

#define LoaderFont2DFileName L"\\Media\\fonts\\MSSansSerif.tga"
#define LoaderFont2DFileName_CoordData L"\\Media\\fonts\\MSSansSerif.dat"

#define LoaderBackTexIndex 0
#define LoaderRotorTexIndex 1
#define LoaderStatorTexIndex 2

#define RotateProcessTimeLimit 0.01f

#define RotationStep D3DX_PI * 0.1f

#define RotationSpeed 3.0f

//ресурсы стартовой сцены (логотип, заставка, начало)
#define StartupLogoFilesPath L"\\Media\\textures\\startlogo\\"
#define StartupLogoTexFilesTxt L"\\Media\\textures\\startlogo\\start_texlist.txt"

объявляем класс CD3DGameApp -

 

class CD3DGameApp
{

public:

HWND m_hWndMain;

DWORD m_dwScreenWidth; // разрешения для полноэкранных режимов
DWORD m_dwScreenHeight;

float m_fResolutionRescale;

bool m_bIsActive; // активность приложения
bool m_bDisplayReady; // признак инициализации класс устройства отображения

FLOAT fAspectRatio;

BOOL m_bMouseVisible; // видимость указателя мыши

DWORD m_dwAppState; // текущее состояние приложения
DWORD m_dwAppStateAfterLoad; // состояние после завершения экрана
// загрузки

// Объекты Direct3D

LPD3DXSPRITE m_pSprite;

bool m_bShowFPSOn;

bool m_bPaused;

float m_fElapsedTime;


CD3DGameApp();

HRESULT FrameMove();
HRESULT Render();

CGameAppLoader* m_pLoader; //загрузчик игровых ресурсов

public:
void GetStrParam(CString* aCurrentStr,
int *aCurrentCharNum, CString* ParamStr);

void ReadFileParam(const CString* ParamStr,
CString* Name, D3DXVECTOR3* Pos, D3DXVECTOR2* Scale, bool* bAnimParam = NULL,
int* Width = NULL, int* Height = NULL, int* TexOffsetX = NULL,
int* TexOffsetY = NULL, int* FramesPerLine = NULL, float* fMaxFrame = NULL,
float* Delay = NULL);

void LoadGameTextures(CPtrArray* TxArray, LPCTSTR TexFilesPath,
LPCTSTR TexFilesListTxt);

void FreeGameTextures(CPtrArray* TxArray);


void CleanupAndDisplayError(DWORD dwError);

void Cleanup3DEnvironment();

HRESULT InvalidateDisplayObjects();
HRESULT DestroyDisplayObjects();
HRESULT RestoreDisplayObjects();

void CalcResolutionRescale();

//поля и методы стартовой сцены (логотип, название, начало)

CStartLogo* m_pStartLogo;

void LoadStartRes();

//поля и методы меню

CGameMainMenu* m_pGameMenu;

void LoadMenuRes();

//поля и методы игрового режима Приключение

CIntroComics* m_pIntroComics;
void LoadIntroComics();

CAdventure* m_pAdventure;
void LoadAdventure();
void ContinueAdventure();


// Функции ввода
HRESULT CreateInputObjects();
void DestroyInputObjects();
void UpdateInput( UserInput* pUserInput );

// Объекты DirectInput
CInputDeviceManager* m_pInputDeviceManager; // Класс для управления устройствами // // DInput
DIACTIONFORMAT m_diafGame; // Формат действий для геймплея

UserInput m_UserInput; // структура для хранения ввода от пользователя

HRESULT InputAddDeviceCB( CInputDeviceManager::DeviceInfo* pDeviceInfo, const DIDEVICEINSTANCE* pdidi );
static HRESULT CALLBACK StaticInputAddDeviceCB( CInputDeviceManager::DeviceInfo* pDeviceInfo, const DIDEVICEINSTANCE* pdidi, LPVOID pParam );
BOOL ConfigureInputDevicesCB( IUnknown* pUnknown );
static BOOL CALLBACK StaticConfigureInputDevicesCB( IUnknown* pUnknown, VOID* pUserData );


void PlayGameSound(int Index, CPtrArray* SoundsArray);
HRESULT LoadSoundList(CPtrArray* SoundsArray,
LPCTSTR SoundsResourcePath, LPCTSTR SoundFilesList);
void FreeSoundList(CPtrArray* SoundsArray);

HRESULT CreateSoundObjects();
void DestroySoundObjects();

void TestGlobalAppState();

};

__declspec(selectany) CD3DGameApp g_d3dApp;

 
     
  Я намеренно не привожу здесь все комментарии, многое Вам будет понятно исходя из дальнейшего изучения кода. Код приведенный выше мы частично реализуем, остальное при желании Вы найдете в ПОЛНОМ ИСХОДНОМ КОДЕ игры.  
     
 

Чтобы не пугать Вас обилием кода на данной странице отсылаю Вас к ПОЛНОМУ ИСХОДНОМУ КОДУ.

Здесь мы рассмотрим как выводится 2d-изображение на экран.

 
     
 

Вот фрагмент кода из метода void CStartLogo::DrawIntroStoryBackScreen()

LPD3D9SPRITE spr = GetElement(IntroStoryScreen); //получаем объект спрайта по его // //индексу IntroStoryScreen

//в данном примере - вычисляем пиксельные координаты изображения по векторным, а //вообще такой пересчет должен выполняться в методе анимации, но в данном случае

//это выполняется здесь

D3DXVECTOR2 pt1;
Vector2Screen(&D3DXVECTOR2(
m_fIntroScr_x1,
IntroScr_y1),
&pt1);

pt1.x *= spr->m_fResolutionRescale; //пересчетный коэффициент применяется для // // // //корректного вывода
pt1.y *= spr->m_fResolutionRescale;

// выводим 2d-изображение в указанную позицию x, y, z; x и y - пиксельные координаты, // но представленные типом float; с данным масштабом xScale, yScale и с данной // // // // полупрозрачностью alpha

spr->Draw2(pt1.x, pt1.y, spr->m_Position.z,
spr->m_Scale.x * spr->m_fResolutionRescale,
spr->m_Scale.y * spr->m_fResolutionRescale,
spr->Alpha );

 
     
  Но прежде нужно загрузить нужное изображение из файла, это делается следующим образом -  
     
 

LPD3D9SPRITE Sprite;

HRESULT hr;

Sprite = new CD3D9Sprite(); // создаем объект для работы со спрайтами и 2d-// // // // // // изображениями

hr = Sprite->LoadTextureFromFile(
DXUTGetD3D9Device(), pSprite, TexFileFullName ); // выполняем загрузку изображения из // // файла в объект, pSprite - это LPD3DXSPRITE - интерфейс для работы спрайтов, // // // // TexFileFullName - полное имя файла (включая путь) загружаемого изображения

 
     
 

После использования - при освобождении ресурсов приложения нужно освободить ресурсы, выделенные для использования объектов, это делается так -

SAFE_DELETE(Sprite);

 
     
 

Возникает вопрос: как загружать и использовать не одно - несколько изображений. Для этого Вам нужно создать текстовый файл, содержащий список загружаемых изображений и их параметров, а для работы со списком объектов использовать например класс CPtrArray.

Всё это есть в ПОЛНОМ ИСХОДНОМ КОДЕ игры.

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

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

Это также показано в ПОЛНОМ ИСХОДНОМ КОДЕ игры.

 
     
     
     
     
  [содержание] [назад] [страница 4] [далее]  
     
Содержимое данной страницы доступно только зарегистрированным пользователям.



Пожалуйста войдите на сайт - Вход

или пройдите процедуру регистрации - Регистрация

megainformatic live chat
Начать беседу
X
 

Оставленные комментарии



fle game engine - движок для создания игр
fle game engine - движок для создания игр


Something: Unexplained 2 captive of desires / Нечто: Необъяснимое 2 в плену желаний
Костя Коробкин Комикс Коллекционное издание - 6 комиксов, 81 страница, 220 mp3 треков
megainformatic Размещение баннерной рекламы у нас
Время загрузки: 0,0941