Программирование 3D-игр в DirectX на Delphi
 
         
    [Главная] [Новости] [Статьи] [Игры] [Проекты] [Автор]  
         
  Разработка загрузчика игровой сцены  
     
 

Начнём с того для чего вообще нужен загрузчик?

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

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

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

 
     
 

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

Сначала вспомним о природе всех игровых приложений: методы Render и FrameMove в них выполняются периодически через определенные интервалы времени. Вся логика приложения привязана к этой периодичности. Но загрузка ресурсов должна происходить лишь один раз (а не периодически повторяясь). Вот эту ГЛАВНУЮ! задачу и должен решать загрузчик, а уж показ заставки для пользователя - это, вообщем-то его второстепенная задача.

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

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

 
     
 

Не мудрствуя лукаво назовем наш класс загрузчика TSceneLoader.

Смысл загрузчика TSceneLoader - показ экрана загрузки во время фактической загрузки ресурсов сцены или преамбулы сцены. Основная задача: огранизация загрузки и уничтожения объектов игровой сцены во время ее создания или удаления ОДНОКРАТНО в отличие от периодически вызываемых методов Render и FrameMove.

 
     
 

Как создается и существует сам загрузчик?

Загрузчик является объектом приложения

Создается во время старта и инициализации

Уничтожается при уничтожении приложения

 
     
 

Организация процессов загрузки и уничтожения -

- Проверка поля State;

- StartGameScene -

- внутри StartGameScene:

- предварительное освобождение объекта в поле GameScene и очистка этого поля (EndGameScene)

- смена состояния на slLoading и выполнение фактической загрузки в объект GameScene;

- по завершении загрузки смена состояния на slLoaded

- инициализация загруженного объекта

- переключение в состояние отрисовки (Render) и подготовки кадра (FrameMove) для загруженного объекта

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

 

 
     
 

Реализация загрузчика

Во время старта приложения создается объект загрузчика -

TD3DGameApp.Create -

SceneLoader := TSceneLoader.Create;
GameUI.Add(SceneLoader);

в методах Render и FrameMove во время установки состояния m_dwAppState - asSceneLoader вызываются соответствующие методы загрузчика (см. ниже)

При создании объекта загрузчика его поля устанавливаются в исходное состояние

Методы Init, Restore, Invalidate, Delete вызываются объектом GameUI приложения

При переходе в состояние выбора игровой сцены - asActive выбор соответствующей игровой сцены (если она доступна) вызывает установку для свойства загрузчика нужной сцены -

SceneLoader.Scene := sScenePre1;

и переключение в состояние приложения asSceneLoader

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

Внутри его метода DoRender происходит отображение экрана загрузки или нужной игровой сцены в зависимости от состояния FState

Внутри метода DoFrameMove

методом NewScene фиксируется смена указателя загружаемой сцены (Scene) при этом

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

запускается метод StartGameScene

внутри него очищается от старой сцены объект GameScene, методом LoadScene загружается новая сцена

метод FrameMoveScene производит формирование анимации и другие полезные действия в зависимости от состояния загрузчика

 
     
 

 

 
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  [Назад] [Все уроки]  
     
    [Главная] [Новости] [Статьи] [Игры]    
         
(c) Мега Информатик 2006-2008    
Hosted by uCoz