Login Form

СКАЧАТЬ ПРИМЕРЫ

СКАЧАТЬ АКТУАЛЬНЫЕ ИСХОДНИКИ

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

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

Туториал 1
Для работы надстройки создаем проект, и прописываем все тоже самое что и в обычном проекте на Xors3D, только еще добавляем хедер #include “object3d.h”, и кидаем в проект object3d.cpp.
Подключаем пространство имен using namespace Xors3Dext; чтобы юзать фичи.

Попробуем создать первую сцену и использовать скрипт.
Все объекты создаются с помощью класса Object3D и помещаются в контейнер SceneMgr например: Object3D* myobject = new Object3D(xLoadMesh(“mymesh.b3d”)); Ниже в листинге все описано и закомментировано

#include "Object3D.h"
#include "xors3d.h"

#pragma comment(lib, "xors3d.lib")

 

using namespace Xors3Dext;

 

 

class RotateScript : public Script                             //создаем скрипт вращения объекта наследуемый от Script

{

public:

        virtual void onCreate()                                        //стандартные функции, что будет делаться при загрузке скрипта

        {

 

        }

 

        virtual void onUpdate()                                        //что будет делаться при обновлении скрипта

        {

                this->object->Turn(Vector3(0,1,0));            //мы будем вращать объект которому принадлежит скрипт

        }

};

 

 

int _tmain(int argc, _TCHAR* argv[])

{

        xGraphics3D();                                                         //тут все как обычно

 

        SceneMgr* smgr = new SceneMgr();                                       //создаем менеджер сцены (обязательно что бы скрипты работали)

        Object3D* camera = new Object3D(xCreateCamera());      //создаем камеру

        smgr->AddObject3D(camera);                                                    //засовываем ее в менеджер сцены

        Object3D* light = new Object3D(xCreateLight());                //тоже самое со светом

        smgr->AddObject3D(light);

 

        camera->Move(Vector3(0,0,-10));                                        //отдаляем камеру назад

 

        Object3D* cube = new Object3D(xCreateCube());          //создаем кубик

        cube->setScript(new RotateScript());                           //добавляем скрипт кубу, создавая новый экземпляр скрипта new

        smgr->AddObject3D(cube);

 

       

 

        while(!xKeyDown(KEY_ESCAPE))

        {

                xCls();

 

                SceneManagersObjectsUpdate();                                  //обновляем все объекты во всех менеджерах сцен (относится к скриптам)

 

                xUpdateWorld();

                xRenderWorld();

 

                xFlip();

        }

        return 0;

}

 

 

Туториал 2
Надстройка умеет особым образом загружать сцены, так что бы ее объекты можно было использовать как обычные, созданные нами. Например сцена созданная в 3ds max имеет 9 объектов: ground, myobj_01…myobj_08, так вот при загрузке они будут созданы в менеджере сцены со своими именами, к ним можно получить доступ, изменять удалять и т.д. Так же можно выделить в другой менеджер сцены определенный набор объектов по маске, например начинающиеся со слов “myobj_”, что бы отделить их от основной сцены и использовать как-то отдельно. Ну можно назначить скрипт. Рекомендуется весь процесс игры делать на этих скриптак, это исключит так называемый плохой код (опять таки а-ля Unity3D). Привожу листинг:

// xors3dext.cpp: определяет точку входа для консольного приложения.

//

 

#include "stdafx.h"

#include "Object3D.h"

#include "xors3d.h"

#pragma comment(lib, "xors3d.lib")

 

using namespace Xors3Dext;

 

 

class RotateScript : public Script                             //создаем скрипт вращения объектаб наследуемый от Script

{

public:

        virtual void onCreate()                                        //стандартные функции, что будет делаться призагрузке скрипта

        {

 

        }

 

        virtual void onUpdate()                                        //что ьудет делаться при обновлении скрипта

        {

                this->object->Turn(Vector3(0,1,0));            //мы будем вращать объект

        }

};

 

 

int _tmain(int argc, _TCHAR* argv[])

{

        xGraphics3D();                                                         //тут все как обычно

 

        SceneMgr* smgr = new SceneMgr();                                       //создаем менеджер сцены (обязательно что бы скрипты работали)

        Object3D* camera = new Object3D(xCreateCamera());      //создаем камеру

        smgr->AddObject3D(camera);                                                    //засовываем ее в менеджер сцены

        Object3D* light = new Object3D(xCreateLight());                //тоже самое со светом

        smgr->AddObject3D(light);

 

        camera->Move(Vector3(0,30,-150));                                             //отдаляем камеру назад

 

        SceneMgr* level = new SceneMgr();                                      //создать отдельный менеджер сцены для уровня

        level->loadScene("level.b3d");                                         //загрузить уровень из файла (все объекты будут отдельными чилдами)

        Object3D* ground = level->getByName("ground");         //найдет объект ground.

        //у нас на уровне есть много объектов myobject_01 по myobject_08, это обычные кубы, и если мы сейчас загрузим уровень то увидим их

        //нужно вместо них создать например сферы, можно загрузить модели, создадим сферы

        SceneMgr* myobject = level->getObjectSet("myobj_");//в новый менеджер сцены выбрали эти объекты

        int cnt_myobject = myobject->getCount();                       //получаем количество

        for(int i=0;i<cnt_myobject;i++)                                        //замещаем

        {

                Object3D* tobj = myobject->getByIndex(i);

                if(tobj==NULL) continue;

                //создать новый в той позиции

                Object3D* tsphere = new Object3D(xCreateSphere());

                myobject->AddObject3D(tsphere);                                //добавить в этот менеджер

                tsphere->SetPosition(tobj->GetPosition());

                tsphere->SetRotation(tobj->GetRotation());

                tsphere->SetScale(Vector3(4,4,4));    

                //можно получить модель

                int model = tsphere->getModel();

                //и пользоваться как обычно

                int texture = xLoadTexture("kamen1.jpg");

                xEntityTexture(model, texture);

                //и можно задать скрипт

                tsphere->setScript(new RotateScript());

        }

        //удалить старые, с 1 по 8 объекты, далее 9, 10 и т.д. идут созданные нами сферы, они не будут тронуты

        for(int i=0;i<cnt_myobject;i++)

                myobject->remove(myobject->getByIndex(0), false);

       

 

        while(!xKeyDown(KEY_ESCAPE))

        {

                xCls();

 

                SceneManagersObjectsUpdate();                                  //обновляем все объекты во всех менеджерах сцен (относится к скриптам)

 

                xUpdateWorld();

                xRenderWorld();

 

                xFlip();

        }

        return 0;

}

 

 

Иллюстрации к листингу
  lesson 2 1 lesson 2 2

Опишу все функции надстройки:

 

Кэширование загрузки моделей, команда oLoadMesh и oLoadAnimMesh

Стандартные шейдеры:

Здесь вместо xRenderWorld нужно использовать xextRenderWorld

Требует каталога fx, можно его запаковать и монтировать это на ваше усмотрение

void Object3D::setPointReceiverFX(Object3D* light, float range, float intens);//установить на этот объект прием point освещения

это означает что этот объект принимает шейдерное освещение

Объект должен быть оттекстурирован одним материалом с одной текстурой или двумя для паралакса, иначе он будет оттекстурирован первой текстурой

InitializeBloomFX(camera);

Инициировать на эту камеру Bloom

Делается при создании игры

 

RenderBloomFX();

Отрисовывать Bloom

Делается после xRenderWorld, если не используется xextRenderWorld()


class Object3D

void setScript(Script* _script)

Установить объекту скрипт, скрипт выполнит команду onCreate

 

void setParent(Object3D* obj, bool glob=false)

Установить объекту родителя

 

Object3D* getParent()

Получить объект родителя

 

void *data

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

 

SceneMgr* smgr

Менеджер сцены которому принадлежит объект

 

string getName()

Получить имя этого объекта

 

void setId(int _id)

Установить идентификационный номер объекту

 

int getId()

Получить идентификационный номер объекта

 

bool setName(string _name)

Установить имя объекту, вернет получилось или нет

 

int getModel()

Получить модель ксорса

 

void SetAlpha(float alpha)

float GetAlpha()

Установить / получить альфу объекта

 

void Translate(Vector3 offset)

Переместить объект напр: obj->Translate(Vector(0,0,1.0f));

 

void Turn(Vector3 offset)

Вращать объект

 

void Move(Vector3 step)

Двигать объект, относительно локальной трансформации

 

void SetPosition(Vector3 pos, bool global=false)

Установить положение объекта

 

void SetRotation(Vector3 rot, bool global=false)

Установить вращение объекта

 

void SetScale(Vector3 scale, bool global=false)

Установить масштабирование объекта

 

void Target(Object3D* target)

Установить pointTo на объект

 

Vector3 GetPosition(bool abs=false)

Получить текущую позицию, вернет структуру Vector3, она содержит в себе x, y, z можно производить математические действия с этой структурой например vec3 = vec1 + vec2

 

Vector3 GetRotation(bool abs=false)

Получить поворот

 

Vector3 GetScale()

Получить масштаб

 

void setVisible(bool value)

bool isVisible()

Установить / получить видимость объекта

 

Object3D(int _model)

При создании объекта указать модель например

int model = xCreateCube();

Object3D* obj = new Object3D(model);

 

bool Update()

Принудительно обновить скрипт.

Вообще обновить все скрипты у всех объектов команда void SceneManagersObjectsUpdate()


Структура Vector3

Содержит в себе X Y Z. Что можно делать с векторами

bool equals(Vector3 vec)

Сравнить один вектор с другим

 

bool equalsRadius(Vector3 vec, float radius)

Сравнить вектор в радиусе, например входит ли в радиус вектора какой либо объект

 

bool equalsXZ(Vector3 vec)

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

 

Менеджеры сцены

 

void AllClear(int id=0,bool entities=true)

почистить все менеджеры сцен которые являются id, entities означает удалять ли отрисовываемые объекты

 

class SceneMgr

void setId(int _id)

Установить id сцене

 

int getId()

Получить id сцены

 

bool loadScene(string fileName)

Загрузка сцены с извлечением имен объектов

 

SceneMgr* getObjectSet(string mask)

сделать менеджер сцены в котором будут лежать ссылки на объекты чье имя начинается на mask

 

Object3D* Add(string name, int model)

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

 

bool AddObject3D(Object3D* obj)

Добавить уже готовый объект

 

Object3D* getByName(string name)

Получить объект по его имени (нет оптимизации типа hash map)

 

Object3D* getByIndex(int ind)

Получить объект по индексу

 

Object3D* getByModel(int model)

Получить объект по его модели, это надо для того например

Object3D* obj = smgr->getByModel(xCameraPick(cam,x,y));

 

Object3D* getObjectByPos(Vector3 pos, float radius=0)

Получить объект который находится в определенной позиции, может охватывать радиус.

 

void setObjectToIndex(Object3D* ptr, int index)

Заменить объект по индексу другим объектом

 

void remove(Object3D* obj, bool remove = true)

Удалить объект, из своего менеджера, remove означает, скрыть его и удалить из менеджера или xFreeEntity

      

int getCount()

Получить количество объектов из меенджера сцены

 

void clear(bool entities=true)

Очистить менеджер сцены

 

void setVisible(bool value)

Показать / спрятать все объекты из менеджера


class Script

Создать скрипт. Пример:
class myscript : public Script

{

Public:

 virtual void onCreate(){}

 virtual void onUpdate(){}

};


 

class Script

 

Создать скрипт. Пример:
class myscript : public Script

 

{

 

Public:

 

 virtual void onCreate(){}

 

 virtual void onUpdate(){}

 

 virtual void onFunction(std::string functionName, std::string params="")

 

};

 

 

 

onCreate что будет делаться при создании скрипта, точнее при назначении его объекту

 

onUpdate что будет делаться при обновлении всех скриптов

 

Что бы изменять объект принадлежащий этому скрипту можно писать так this->object->Turn(Vector3(0,1,0));

 

onFunction(std::string functionName, std::string params="") – выполнение, напремер скрипта чужого объекта, выглядит так:

 

class RotateScript : public Script                          //создаем скрипт вращения объектаб наследуемый от Script

 

{

 

………………………

 

       virtual void onFunction(std::string functionName, std::string params) //выполнить какуюлибо функцию

 

       {

 

             if(functionName=="rotatex") rotatex();

 

       }

 

 

 

       void rotatex()

 

       {

 

             this->object->Turn(Vector3(1,0,0));

 

       }

 

};

 

Obj->getScript()->onFunction(“rotatex”);

 

Выполнит функцию rotatex если есть

 

 

 

class Particler

Это не тот партиклер к которому все привыкли. Ото объект который содержит в себе сколько-то уже загруженных моделей, как бы кэширование. Например при создании нового противника на сцене что бы не грузить его с диска, он уже загружен в партиклер, мы его просто получаем, и засовываем в какой либо менеджер сцены и назначаем скрипт

 

Particler(int _master, int _cnt)

При создании, мастер объект, и количество кэшируемых.

Например:

int model = xLoadMesh(“enemy.b3d”);

Particler* enemyPar = new Particler(model, 30);

Далее нужно создать врага

Object3D* enemy = enemyPar->next();

Нюанс, так как мы создали всего 30 кэшируемых объектов, то при создании 31, удалиться первый объект. Так что будьте внимательны

 

Object3D* next()

Получение следующего объекта

 

void begin()

Начать сначала

 

SceneMgr* getManager()

Менеджер сцены где лежат кэшируемые объекты

 

class GuiText

Это текст гуи

 

GuiText(string _text, float _x, float _y)

Создать тект в определенной позиции

 

void Draw()

Отрисовывать текст

 

void SetText(string _text)

Установить новый текст

 

class GuiButton

Кнопка гуишная

 

int getBgWidth()

Получить ширину кнопки

 

int getBgHeight()

Получить высоту кнопки

 

int getImg()

Получить картинку кнопки

 

GuiButton(string fileImage, float _x, float _y)

Создание кнопки, имя изображения и положение

void Draw()

Рисовать кнопку

 

bool Moused()

Определение, навели мышкой на кнопку или нет (не путать с xKeyDown)

 

 

class GuiPanel

Это панель, которая может содержать в себе другие гуи объекты

void Clear()

почистить панель

 

GuiPanel(string fileImage, float _x, float _y)

Создать панель, имя картинки и позиция на экране

 

virtual void Draw()

рисовать все чилды

 

void Add(GuiDrawable* gd)

добавить гуи объект

 

GuiDrawable* Get(int index)

Получить гуи объект по индексу

 

void setAlpha(float alpha)

установить альфу

 

int getBgWidth()

получить ширину картинки фона

 

int getBgHeight()

получить высоту картинки фона

 

int childrenCnt()

получить количество чилдов