GameDev.ru
/ GameDev.ru / Пользователи / Andrey / Сообщения на форуме пользователя Andrey (229 стр.)

Сообщения на форуме пользователя Andrey (229 стр.)

Пять вопросов по исключениям в C, C++ и Windows2 фев. 200512:16#6
Demiurg-HG

>Вопрос №3:
>Чем отличаются try...except от try...catch?

>Вопрос №4:
>В чем заключается реализация обработки исключений в
>try...except и try...catch. Т.е. какие команды стоят
>за этими ключевыми словами.

try...catch - стандартные исключения языка C++

__try ... __except - это для обработки системных исключений, расширения языка С++ для Windows

пример по исключениям

#include <excpt.h>    //для работы блока __try ... __except
#include <exception>//для std исключений
#include <string>
using namespace std;

void func1()
{
try  {
//набор дествий
//тут могут возникнуть различный исключительные ситуации
}
//ниже перхват различных исключений
catch(const exception& e)  {
        MessageBox(NULL, e.what(), "Поймано исключение", MB_OK);
//дальнейшие действия
}
catch(int number)  {
        MessageBox(NULL, Исключение типа int, "Поймано исключение", MB_OK);
//дальнейшие действия

}
catch(const char* Message)  {
        MessageBox(NULL, Message, "Поймано исключение", MB_OK);
//дальнейшие действия
}
}
//строка для сообщений
string str;

void func2()
{
    __try {
          //вызов  функции с обработкой исключений С++
          func1();

  }
  __except (EXCEPTION_EXECUTE_HANDLER)  {
        //буфер
        char buf[10] = {'\0'};
        str =  "Серьезная исключительная ситуация, код исключения: ";
        itoa(GetExceptionCode(). buf, 10);//Возврат кода исключения в строку
//в десятичном виде,лучше возвращать в шестнадцатиричном,
//потом по спецфикации посмотреть что за исключение произошло
        str += buf;
        MessageBox(NULL, buf, "Ошибка", MB_OK);
        //дальнейшие действия
}

}
Моя первая консоль...2 фев. 200511:13#41
Magvaj
>P.S. Andrey Я тебе сырец скинул, проверь почту...
а я уже посмотрел
>Вывод: организую с помощью DirectX.
Дело не в том на каком API писать...
Небольшой вопрос по Octree1 фев. 200514:58#24
alex_r
//отображение дерева
void Octree::Draw(vector<Vector3D>& verticles, OctreeNode *&node, const Frustum& frustum)
{
	if (node == NULL)
		return;
	if (!frustum.BoundingBoxInFrustum(node -> GetBoundingBox()))
		return;
	node -> DrawBoundingBox();
	for (register int i = 0; i < 8; i++) {
		//получить дочерний узел
		OctreeNode *childNode = node -> GetChildNode(i);
		if (childNode != NULL)
			//проверка нахождения в пирамиде видимости
			if (frustum.BoundingBoxInFrustum(childNode -> GetBoundingBox())) {
				node -> Draw(verticles, frustum);
				//рекурсивное отображение остальных узлов
				Draw(verticles, childNode, frustum);
			}
	}
}
Небольшой вопрос по Octree1 фев. 200514:54#23
alex_r
>А ты как отрисовываешь? Код в студию (с)
вот как :
//отображение узла
void OctreeNode::Draw(vector<Vector3D>& verticles , const Frustum& frustum)
{
	glEnable(GL_TEXTURE_2D);
	glColor3f(1.0f,1.0f,0.0f);
	int j = 0;
	for(int i = 0; i < int(verticles.size()); i += 3) {
		//Проверка на попадание в frustum
		if (!frustum.TriangleInFrustum(verticles[i], verticles[i + 1], verticles[i + 2]))
			continue;
		glBegin(GL_TRIANGLES);
			glTexCoord2f(0.0f, 1.0f);
			glNormal3fv(&scene.GetNormals()[j][0]);
			glVertex3fv(&verticles[i][0]);
			glTexCoord2f(1.0f, 1.0f);
			glNormal3fv(&scene.GetNormals()[j][0]);
			glVertex3fv(&verticles[i + 1][0]);
			glTexCoord2f(1.0f, 0.0f);
			glNormal3fv(&scene.GetNormals()[j][0]);
			glVertex3fv(&verticles[i + 2][0]);
		glEnd();
		j ++;
	}
	glDisable(GL_TEXTURE_2D);
}

А построение правильное?

Небольшой вопрос по Octree1 фев. 200514:33#21
Keysall
>2 не передавай frustum тем более по ссылке а имей глобальный
блин у меня ООП подход.так уже не получиться...у меня все в классы инкапсулировано...
почему по ссылке плохо, тем более по константной?
>3 избавься в реалтайми от подобных вещей :node -> GetChildNode(i)
> получай доступ parent->childNode[i],childNode -> GetBoundingBox() на childNode->bbox
> ну для первого раза ... ;)
Ну спасибо вот над этим подумаю
насчет 19 поста у меня еще нету такого...я пока пробую по списку голых полигонов и 1 текстуре...
Небольшой вопрос по Octree1 фев. 200514:27#20
Keysall
Выводиться теперь геометрия и боксы тоже FPS был около 70-80 стал 30 и меньше...
чем больше глубина тем меньше Fps
Небольшой вопрос по Octree1 фев. 200513:41#15
Keysall
так только что исправил ошибку стало выводиться только появилась другая проблема.FPS дико упал...
Небольшой вопрос по Octree1 фев. 200513:37#14
загвоздка в том что ничего невыводиться.Ты можешь на код глянуть?
комментариев много я подскажу что нипонятно...
Небольшой вопрос по Octree1 фев. 200513:27#11
Keysall
спасибо конечно но ничео мне не помогло...ладно буду сам думать...
Небольшой вопрос по Octree1 фев. 200513:16#8
Еще я забыл сказать что Bounding Box'ы отображаются но дочерние отображаются только в одном месте.Счем это связано с отсутсвием полигонов или неправильным построением?
Небольшой вопрос по Octree1 фев. 200512:29#7
построение дерева:
//построение octree
void Octree::BuildOctTree(const vector<Vector3D>& verticles)
{
	if (root == NULL) {
		root = new OctreeNode;
                                 //Создать Bounding Box для коневого узла из набора вершин
		root -> GetBoundingBox().CreatFromVertices(verticles);
	}
	//начинаем с корневого узла
	ProcessingNode(verticles, root);
}
Вот так обрабатываю узел
//Обработка узла
void Octree::ProcessingNode(const vector<Vector3D>& verticles, OctreeNode *&node)
{
	//дерево построено
	if (build)
		return;
	//проверка числа узлов
	if (NumberNode > 4096) {
		//дерево построено
		build = true;
		MessageBox(NULL,"Зазбиение закончено", "Информация", MB_OK);
		return;
	}
	//обработка
	//разбить на 8 боксов бокс узла
	SplitterOn8BoundingBox(node);
	//увеличить число дочерних узлов
	NumberNode += 8;
	//цикл по 8 дочерним узлам
	for (int i = 0; i < 8; i++) {
		//получить указатель на i-го потомка узла
		OctreeNode *childNode = node -> GetChildNode(i);
		//получить указатель на ограничивающее тело
		AABB *BoundingBox = &childNode -> GetBoundingBox();
		//цикл по полигонам
		for (int j = 0; j < int(verticles.size()); j+=3) {
			//Вершина 1
			Vector3D vert0 = verticles[i];
			//Вершина 2
			Vector3D vert1 = verticles[i + 1];
			//Вершина 3
			Vector3D vert2 = verticles[i + 2];
			//проверить нахождение 3 точек полигона в ограничивающем теле
			if (BoundingBox -> contains(vert0, vert1, vert2))
				//добавить индекс в узел
				childNode -> AddIndexPoligon(j);
		}
		//Обработка дочернего узла узла
		ProcessingNode(verticles, childNode);//рекурсия
	}
}
вот так отображаю дерево:
//отображение дерева
void Octree::Draw(const vector<Vector3D>& verticles, OctreeNode *&node, const Frustum& frustum)
{
	if (node == NULL)
		return;
//проверка нахождения в ирамиде видимости
	if (!frustum.BoundingBoxInFrustum(node -> GetBoundingBox()))
		return;
//отображение Bounding Box'а для отладки
	node -> DrawBoundingBox();
//Цикл по дочерним узлам
	for (register int i = 0; i < 8; i++) {
		//получить дочерний узел
		OctreeNode *childNode = node -> GetChildNode(i);
		if (childNode != NULL)
			//проверка нахождения в пирамиде видимости
			if (frustum.BoundingBoxInFrustum(childNode -> GetBoundingBox())) {
				node -> Draw(verticles, frustum);
				//рекурсивное отображение остальных узлов
				Draw(verticles, childNode, frustum);
			}
	}
}
Вопрос у меня не отображается сцена.Скажите что я делаю неправильно?Если надо еще запостить какой-то колд скажите я запостю.
Спасибо всем заранее.
Прошу не пинать если что ни так,я реализацию Octree делаю в первый раз.Просьба не предлагать ссылки, я много почитал.
Я хочу знать что у меня не так в моем коде.
С уважением Андрей.
Небольшой вопрос по Octree1 фев. 200512:29#6
Привет всем!!
вот еще вопрос по построению дерева.Пока эксперементирую по готовому списку верши вот такого вида:

49.500000 0.000000 50.000000
49.500000 0.000000 -50.000000
50.500000 0.000000 -50.000000

3 вершины это полигон.надеюсь это понятно...
Узел Octree дерева выглядет вот так:

//класс узла octree
class OctreeNode {
private:
	//ограничивающее тело
	AABB Box;
	//индексы
	vector<int> indexs;
	//дети узла
	OctreeNode *child[8];
public:
	//отрисовка BoundingBox'а
	void DrawBoundingBox();
	//отображение узла
	void Draw(const vector<Vector3D>& verticles , const Frustum& frustum);
	//добавить индекс
	void AddIndexPoligon(const int index)
	{
		indexs.push_back(index);
	}
	//возвратить указатель на i-сына
	OctreeNode* GetChildNode(const int i)
	{
		return child[i];
	}
	//присвоить новый узел
	void SetChild(OctreeNode* node, int index)
	{
		child[index] = node;
	}
	//возвратить ограничивающее тело
	AABB& GetBoundingBox()
	{
		return Box;
	}
	OctreeNode()
	{
		//обнуление указателей
		ZeroMemory(child, sizeof(child));
	};
	~OctreeNode()
	{
		//рекурсивное уаление
		for (int i = 0; i < 8; i++) {
			if (child[i])
				delete child[i];
			child[i] = NULL;
		}
	};
};
само Octree дерево описываю вот так:
class Octree {
private:
	//массив вершин
	vector<Vector3D> verticles;
	//флаг окончания построения дерева
	bool build;
	//число созданных узлов
	int NumberNode;
	//узел дерева
	OctreeNode *root;
	//Разбиение родительского узла на Bounding Box'ы
	//по параметрам родительского узлана
	void SplitterOn8BoundingBox(OctreeNode *node);
	//Обработка узла
	void ProcessingNode(const vector<Vector3D>& verticles, OctreeNode *&node);
	//отображение дерева
	void Draw(const vector<Vector3D>& verticles, OctreeNode *&node, const Frustum& frustum);
public:
	//установка ссылки на вершины
	void SetVerticles(vector<Vector3D>& Verticles)
	{
		verticles = Verticles;
	}
	//отображения
	void Draw(Camera& camera)
	{
		Draw(verticles, root, camera.GetFrustum());
	}
	//построение octree
	void BuildOctTree(const vector<Vector3D>& verticles);
	Octree() : root(NULL), NumberNode(0), build(false) {};
	~Octree()
	{
		delete root;
		root = NULL;
	};
};

Обработка ошибок.1 фев. 20059:13#1
GrafLestat

я делаю в плагине экспорта ловлю исключения языка С++ и системные:

//Обработка узла
void ModelSaver::ProcessingNode(INode* node)
{
            try {

 //...
            }
            catch(const exception& e) {
		//Выход c сообщение об ошибке
		Exit(e.what(), 11);
	}

}



//функция экспорта
int ModelSaver::callback(INode *node)
{
	__try {
		ProcessingNode(node);
	}
	//перехват системных исключительных ситуаций
	__except (EXCEPTION_EXECUTE_HANDLER) {
		MessageBox(NULL, "Произошла серьезная исключительная ситуация",
		"Ошибка при экспорте", MB_OK);
		//Вывод в лог сообщения
		outLog << "Произошла серьезная исключительная ситуация код:" << GetExceptionCode() << endl;
		//Закрыть файлы
		Close();
		//выход
		PostQuitMessage(GetExceptionCode());
		//выход с неудачей
		return TREE_ABORT;
	}
	return TREE_CONTINUE;
}

При таком подходе(практически при любой ошибке) плагин корректно завершает свою работу  не сваливая 3D Studio Max.

Моя первая консоль...1 фев. 20059:03#38
dub
>Аккуратнее с матом (см. свой пост #31).
А какой мат? :))))
Архитектура движка1 фев. 20059:01#7
aruslan
>впрочем, рекомендую перечитать Песнь Песней, монологи Гамлета, четвертый сон Веры Павловны и Экклезиаста.
Ты как всегда :)))))
JlaMeP
Что могу посоветовать:
1.Для начала определись что ты хочешь от движка, поставь задачу.
2.Определи основные классы нужные для его реализации.
3.Распредели между ними обязанности и взаимодействие.Для этого можно нарисовать на бумаге их взаимодействие,либо изучить UML и с помощью диаграмм все изобразить это помогает
4.Для начала не пробуй писать супер-пупер навороченный движок.

Удачи.

Следующие темы >>

2001—2012 © GameDev.ru — Разработка игр