Войти
ПрограммированиеСтатьиГрафика

Урок 1 - первые шаги к изучению Project Anarchy

Внимание! Этот документ ещё не опубликован.

Автор:

Project Anarchy™
                                                                                                    Project Anarchy Logo | Урок 1 - первые шаги к изучению Project Anarchy

1.ВВЕДЕНИЕ
    Project Anarchy™ - это завершённый кроссплатформенный игровой движок* с набором инструментов от разработчиков Havok™. Включает в себя поддержку множество современных платформ - Xbox 360®**, PlayStation 3®**, PC Games for Windows**, PlayStation® Vita**, Wii™**, Wii U™**, Windows 8**, Android™,и iOS**. В бесплатной версии продукта доступна только платформа Android™, а PC версия необходима лишь для разработки конечного продукта.
    В данном уроке я не буду рассказывать об скачивания - установки Project Anarchy™, т.к. на данный момент существуют видео уроки как официальные, так и наши (русскоязычные). Для кого это будет проблемой вот ссылка на просмотр этих уроков . К данному видео я не имею ни какого отношения...
    Мои цели в данном уроке, рассказать и показать на пальцах что и как необходимо для первичной инициализации Win приложения с нуля.

PS На данный момент, я такой же как и вы новичок. Будем вместе учиться, создавать и осваивать данный продукт.

*  На данный момент 03/01/2014 существует AnarchyDownloadManager_20131218. (это версия 2013.2.5, скачать можно здесь)

** Всё эти платформы поддерживаются при наличии полной версии Project Anarchy™, более подробней информацию вы можете прочитать здесь .

2.Создание проекта в MVS 2010
    Первое что нам необходимо это открыть MVS->Файл->Создать->Проект.
                                                                1 | Урок 1 - первые шаги к изучению Project Anarchy
    Далее нам необходимо, выбрать в шаблонах тип приложения Win32->Проект Win32->Указать Имя проекта->Путь проекта->Имя решения(оно может совпадать с именем проекта)->OK

2 | Урок 1 - первые шаги к изучению Project Anarchy

    Следующим шагом будет выбор параметров приложения, выберем Приложение Wndows->Пустой проект->Готово

3 | Урок 1 - первые шаги к изучению Project Anarchy

    Теперь в существующий проект мы можем добавить наш главный файл (MAIN) где будет находится исходный код запускаемого проекта.

4 | Урок 1 - первые шаги к изучению Project Anarchy

вот код который необходимо расположить в main.cpp

#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers

#include <Vision/Runtime/Engine/System/Vision.hpp>
#include <Vision/Runtime/Framework/VisionApp/VAppImpl.hpp>

// Гобальные указатели
VisMeshBuffer_cl    *pMesh    = NULL;
VCompiledShaderPass *pShader  = NULL;

// Структура представления формата одной вершины
struct MySimpleFormat_t
{
  float pos[3];
  DWORD color;
};

// Главный запускаемый класс приложения
class TutorialApp : public VAppImpl
{
public:
          TutorialApp()  {}      // Конструктор
  virtual ~TutorialApp()  {}      // Деструктор

  virtual void  SetupAppConfig(VisAppConfig_cl& config)    HKV_OVERRIDE;  // функция конфигурайий
  virtual void  Init()      HKV_OVERRIDE;  // Функция инициализации
  virtual void  AfterSceneLoaded(bool bLoadingSuccessful)  HKV_OVERRIDE;  // Функция иницидаизации посе загрузки сцены
  virtual bool  Run()      HKV_OVERRIDE;  // Функция запуска приожения
  virtual void  DeInit()      HKV_OVERRIDE;  // Фукция деинициализации
};

// Вместо WinMain
VAPP_IMPLEMENT_SAMPLE(TutorialApp);

// функция конфигурайий
void TutorialApp::SetupAppConfig(VisAppConfig_cl& config)
{
  DEVMODEA deviceMode;

  // Установка пути расположения файлов (по умочанию)
  config.m_sFileSystemRootName = "template_root";

  // Установка размеров окна (только для Windows версии)
  config.m_videoConfig.m_iXRes = 768;    // установка размера окна по горизонтали
  config.m_videoConfig.m_iYRes = 576;    // установка размера окна по вертикали

  // Установка имени окна
  config.m_videoConfig.m_szWindowTitle = "Triangle";

  // Установка отсутствия огранения fps (отключение вертикальной синхронизации)
  config.m_videoConfig.m_bWaitVRetrace = false;
  
  // Установка расположения окна по центру экранна ( зависимость от размера окна)
  deviceMode = Vision::Video.GetAdapterMode(config.m_videoConfig.m_iAdapter);                // узнаём текущего данные адаптера
  config.m_videoConfig.m_iXPos    = (deviceMode.dmPelsWidth - config.m_videoConfig.m_iXRes) >> 1;    // устанока расположения окна по горизонтали
  config.m_videoConfig.m_iYPos    = (deviceMode.dmPelsHeight - config.m_videoConfig.m_iYRes) >> 1;  // устанока расположения окна по вертикали
  config.m_videoConfig.m_bFullScreen  = false;                              // оконный режим
}

// Функция инициализации
void TutorialApp::Init()
{
  // Установим имя загружаемой сцены
  VisAppLoadSettings settings("Empty.vscene");

  // Установим путь к этой сцене
  settings.m_customSearchPaths.Append(":template_root/Assets/Scenes");

  // Загрузка сцены
  LoadScene(settings);
}

// Функция иницидаизации посе загрузки сцены
void TutorialApp::AfterSceneLoaded(bool bLoadingSuccessful)
{
  // Создадим упровление камерой мышью (выше земли, так чтобы мы могли видеть что на земле)
  Vision::Game.CreateEntity("VisMouseCamera_cl", hkvVec3(0.0f, 0.0f, 170.0f));

  // Настроим формат дискриптора вершин
  VisMBVertexDescriptor_t MyFormatDescriptor;
  MyFormatDescriptor.m_iPosOfs  = offsetof(MySimpleFormat_t, pos) | VERTEXDESC_FORMAT_FLOAT3;
  MyFormatDescriptor.m_iColorOfs  = offsetof(MySimpleFormat_t, color) | VERTEXDESC_FORMAT_BYTE4;
  MyFormatDescriptor.m_iStride  = sizeof(MySimpleFormat_t);

  // Создание нового буфера меша
  pMesh = new VisMeshBuffer_cl();

  // Установка коичества верин для наего треугольника
  pMesh->AllocateVertices(MyFormatDescriptor, 3);

  // Заблокируем участок памяти для золнения его данными
  MySimpleFormat_t *pVertex = (MySimpleFormat_t *)pMesh->LockVertices(VIS_LOCKFLAG_DISCARDABLE);

  // Заполняем данными для каждой вершины
  for (int i=0;i<3;i++,pVertex++)
  {
    int x = i==0?1:0;
    int y = i==1?1:0;
    VColorRef color(x*255, y*255, 255);
    pVertex->pos[0] = (float)x*100;
    pVertex->pos[1] = (float)y*100;
    pVertex->pos[2] = 0;
    pVertex->color = color.GetNative();
  }

  // Разблокируем участок памяти (для GPU)
  pMesh->UnLockVertices();

  // Установка камеры в центре сцены
  VisBaseEntity_cl *pCamEntity  = Vision::Game.CreateEntity("VFreeCamera", hkvVec3(200,200,200));
  hkvMat3 lookAt;
  lookAt.setLookInDirectionMatrix( hkvVec3(-200,-200,-200));
  pCamEntity->SetRotationMatrix(lookAt);

  // Регистрация нашего класса отвечающего за рендер
  VisRenderContext_cl *pContext  = pContext  = Vision::Contexts.GetCurrentContext();  // узнаем текущий контекст рендера
  TestRenderLoop *pMyRenderLoop  = new TestRenderLoop();                // создадим наш класс
  pContext->SetRenderLoop(pMyRenderLoop);                        // регистрируем его

  // Создание Шейдера (по умолчанию)
    VCompiledTechnique *pTech = Vision::Shaders.CreateTechnique("PositionColor", NULL);
    pShader = pTech->GetShader(0);
    VASSERT(pShader);
}

// Функция запуска приожения
bool TutorialApp::Run()
{
  // Возвращаем true, чтобы указать, что мы не хотим выйти из цикла игры
  return true;
}

// Фукция деинициализации
void TutorialApp::DeInit()
{
}

// Класс отвечающий за рендер сцены
class TestRenderLoop : public IVisRenderLoop_cl
{
public:
  virtual void  OnDoRenderLoop (void *pUserData)
  {
    // Очистка сцены
    Vision::RenderLoopHelper.ClearScreen();

    // Начало отрисовки меша
    Vision::RenderLoopHelper.BeginMeshRendering();
    
    // Укажем какие данные присутсвуют в нашем дескрипторе формата вершин
    Vision::RenderLoopHelper.AddMeshStreams(pMesh, VERTEX_STREAM_POSITION | VERTEX_STREAM_COLOR);

    // Рисуем меш
    Vision::RenderLoopHelper.RenderMeshes(pShader, VisMeshBuffer_cl::MB_PRIMTYPE_TRILIST , 0, 1, 3, false);

    // Завершение отрисовки меша
    Vision::RenderLoopHelper.EndMeshRendering();
  }
};

Вот в принципе и всё...

PS. Возможно данный примерчик поможет кому то начать работать с данным продуктом!
      Ещё одним важным моментом является настройка проекта (указания всех библиотек, хэдеров, препроцессорных определений). И наличие стандартной Папки -> Data (скорей всего там находятся файлы инициализации по умолчанию). Настроенный проект с примером можете скачать здесь.

Вот что получилось:

#Project Anarchy, #tutorial

14 декабря 2013 (Обновление: 5 янв. 2014)

Комментарии [10]