forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Blitz3D engine (http://forum.boolean.name/showthread.php?t=4682)

H@NON 11.10.2007 19:59

Re: Blitz3D engine
 
Аффтар жжошь, давай есчо!

ЗЫж под впечатлением этой статейки:http://boolean.name/showthread.php?p=60767#post60767

XenuS 11.10.2007 20:01

Re: Blitz3D engine
 
2H@NON хех=))

сорри, поправления к посту №75...
вот еще и текст=)))

#include "Blitz3D.h"

B3DImage taverna;
B3DImage pricel;
B3DText texts;

void main(int argc, char *argv[])
{
InitBlitz3DDevice(argc, argv);
Graphics3D(1024, 768, 32, 0);
AppTitle("Blitz3D engine by ~XenuS~");

taverna.LoadImage("image.bmp");
pricel.LoadImage("pric.bmp");

texts.LoadFont("Comic Sans MS",30,15,0,0,0);

StartMainBlitzLoop();
}

void MainBlitzLoop()
{
RenderWorld();

taverna.DrawImage(0,0);
pricel.DrawImage(712,384);

Color(255,255,0);
texts.Text(100,50,"Это демонстрация Blitz3D engine by ~XenuS~");

Flip();
}

void KeyboardEvent(unsigned char key, int x, int y)
{
if (KeyDown(key,B3D_ESC))
End();
}

void MouseEvent(int button, int x, int y, int scale)
{
}

заметьте, текст поддерживает русский в любом случае...=)

jimon 11.10.2007 20:13

Re: Blitz3D engine
 
XenuS
почему нельзя определить функцию
B3DImage * LoadImage(B3D_string * file_name); ?

в добавок хочется определенный конструктор
типа чтобы можно было вот так писать :
B3DImage * img = new B3DImage("image1.bmp");

убери наконец то StartMainBlitzLoop(); и прочий бред

в блице самое важное было ПРОЦЕДУРНОЕ программирование
так что давай делай функции типа DrawImage и тд
имхо лутче зделай как в BlitzMax - все функции в классах
но есть простые процедурные реализации

типа :
Код:

class foo
{
public:
foo(B3D_string * yo)
{
LoadImage(yo);
}

~foo(){}
void LoadImage();
};

B3DImage * LoadImage(B3D_string * string)
{
return New foo(string);
}

конешно маразм, но двиг у нас b3d like

да кстати хотелось бы видеть хоть какое то подобие управления памяти
хотя бы как в Irrlicht
в добавок еще нужно переопределить ВСЕ типы переменных,
для кроссплатформности

ну типа
#define B3D_Int int
и тд

потом весь платформнозависимый код (а его надо точно определить)
вынести в отдельные блоки

попробуй хотя бы скомпилировать ето чудо на MinGW
поймеш что MSVC6 далек от стандартов и нифига просто так не будет компилится

и еще хочется какой нибудь но фреймворк
классы типа B3D_String и прочее

XenuS 11.10.2007 20:42

Re: Blitz3D engine
 
ок, насчет процедурного программирования, я попробую исправить...так реально будет красивее и код и более похож на блиц...
переопределение типов(базовых) уже есть=))
класс B3DString есть....но его я сделал для удобства работы со строками...сложить, = и т.п. но из него получаешь указатель на текст...и работаешь как с простым массивом char...
например:
B3DString str;
str="Это ";
str+="строка";
cout << str.getPointer();
прост я это не показывал=)

а зачем управление памяти, как в иррлихт? я стараюсь сделать двиг, который будет элементарно выучить, не углубляясь в само программирование...(в блице3Д именно так)....

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

jimon 11.10.2007 20:47

Re: Blitz3D engine
 
XenuS
когда память потечет узнаеш зачем управление памятью ;)

XenuS 11.10.2007 20:55

Re: Blitz3D engine
 
ааа.....ты про это=)))
не, у мня для каждого объекта есть метод Delete...
вот когда надо, тогда кодер и будет удалять=)))

moka 11.10.2007 21:52

Re: Blitz3D engine
 
XenuS, а такой варриант:

Энтити1=ЗагрузитьМешь(...)
Энтити1=ЗагрузитьМешь(...)

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

XenuS 11.10.2007 22:51

Re: Blitz3D engine
 
оо, я еще демку не выложил, а вы уже баги нашли=)))спс)
ну в таком случае я сделаю так:
......
int B3DMesh::loadMesh(char *f)
{
.....
//model - указатель на модель
if (model!=NULL)
delete []model;
.....
}
......

как нибудь так...сейчас буду это вписывать в 2Д изображения=)

jimon 11.10.2007 23:12

Re: Blitz3D engine
 
XenuS
хм, ты вообще работал с указателями, ссылками, обьектами и статическими елементами ?
понимаеш о чем я говорю ?

в новосозданом обьекте model в любом случае у тебя == NULL
ну и как же ты будеш проверять что УКАЗАТЕЛЬ затерся ?

для примера
Код:

foo * a1;
a1 = new foo;
a1 = new foo;

класс foo - любой
определи что тут указатель затерся ... ;)

ps. можно узнать сколько ты программируеш на C++ ?
и вообще с чем работал и что писал ?

ps2. сверх сложно перенести стиль blitz на c++ не ограничивая возможностей ООП

XenuS 11.10.2007 23:57

Re: Blitz3D engine
 
C++ я знаю 2 года....вот учусь ему=)
нет, ты мня не понял, я имел ввиду так:
первая модель загрузилась...значит то, во что она загрузилась, стало равно не NULL...а перед загрузкой пишем: если то, во что она должна загрузиться != NULL, тогда удаляем это....
ЗЫ а работал я с паскалем, вижуал басиком, блицом....вот С++ теперь(я ему учусь в инс-те)....а что? =)
ЗЫ2 я и не хочу полностью переносить стиль блица, у меня будут классы и все, что связано с ООП, но идея в том, что бы были функции\методы блица...не надо писать инициализацию окна, можно написать Graphics3D...не надо писать полностью код просмотра директории, можно написать:

B3DDirectory dir("C:/");
dir.ReadDir();
cout << dir.firstFile() << endl;
for (int i=0;i<dir.getCountOfFiles();)
{
char *k;
k=new char[255];
k=dir.nextFile();
cout << k;
cout << endl;
delete []k;
}
dir.CloseDir();
}
вот так=)))

jimon 12.10.2007 00:18

Re: Blitz3D engine
 
XenuS
эм, мы друг друга не понимаем :)
я просто говорю что ето не катит

ты предпологаеш что юзер выполнит такой код :
Код:

B3DImage img1;
img1.LoadImage("a1.bmp");
...
img1.LoadImage("a2.bmp");

тогда ты прав, и моделька очистится

а я предпологаю что юзер выполнит такой код :
Код:

B3DImage * img = new B3DImage;
img->LoadImage("a1.bmp");
...
img = new B3DImage; //тут затерся ойойой указатель на img :)
img->LoadImage("a2.bmp");

так что особой нужды в твоей проверке нету, но она нужна
в принципе НИКТО не пишет такие вещи прямо обьектами
обычно все такие обьекты хранятся в связаном списке

можно для начала добавить менеджер по принципу reference counting
тоесть есть начальный класс от которого все наследуется
потом если обьект где либо используется (на него есть ссылка)
то reference = 1, если обьект используется еще где-то
то reference = сколько обьектов юзает етот обьект

когда какому либо обьекту наш обьект не нужен
то его reference уменьшается на 1

когда какому либо обьекту наш обьект понадобился
то соответственно reference ++

когда reference достигает 0 - обьект само удаляется

в принципе реализация гарантирует, при прямых руках,
отсутствие утечек памяти, но руки реально нужны прямые :)

в принципе вот пример такого базового класса из того же irrlicht
Код:

        class IUnknown
        {
        public:

                IUnknown()
                        : ReferenceCounter(1), DebugName(0)
                {
                }

                virtual ~IUnknown()
                {
                }

                void grab() { ++ReferenceCounter; }

                bool drop()
                {

                        --ReferenceCounter;
                        if (!ReferenceCounter)
                        {
                                delete this;
                                return true;
                        }

                        return false;
                }


        private:

                s32        ReferenceCounter;
        };

просто надо гарантировать что при вызове "delete Engine;"
очистится все что выделял движок

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

ps. я даю советы, потому что не одну шишку набил на етих проблемах
реально если неправильно зделать базовую архитектуру,
то потом все 400 кб кода прийдется тупо удалять ....
я один и тот же проект 3 раза переписывал,
только из-за того что не правильно делал менеджемент памяти

а теперь я пишу код который выдерживает самые жосткие проверки типа
Код:

while 1
Game = new Game
Game.Init()
Game.Update()
Game.Draw()
Game.Free()
Game = null
wend

и память не течет ... а твой проект так сможет ? ;)

dimanche13 12.10.2007 15:54

Re: Blitz3D engine
 
ппц, ну я так и не получил ответа, зачем нам еще один движек похожий синтаксисом на Блиц?

XenuS 12.10.2007 16:21

Re: Blitz3D engine
 
аааа, все, понял=))) ок, сейчас я буду переделывать структуру создания окна в процедурный и т.д., вот и это переделаю...
ЗЫ: главное, что я въехал сейчас, когда там не так много в двиге написано, а то потом все переделывать - это пипец! +)

затем, что это будет двиг под С++!!! обычный двиг использует в основном ООП, а тут можно будет как процедурно, так и ООП....
и в 3-х, мне хочется сделать такой двиг....я думаю, что этого достаточно для того, чтобы сесть и написать его, хотя бы в свое удовольствие...

Данил 12.10.2007 16:45

Re: Blitz3D engine
 
Цитата:

что это будет двиг под С++!!!
То есть отдельного IDE мы не увидим? и придеццо писать все с с++ синтаксисом?

dimanche13 12.10.2007 16:55

Re: Blitz3D engine
 
Вообще я обеими руками за ООП. Но процедурное программирование проще, что уж тут говорить. Я бы сказал процедурное для новичков. И раз тебе так хочется, то и вопросов нет. Пиши! Главное чтоб не перегорел.
ЗЫ. Мне б стока энтузазизма скока у тебя - я б тоже нечто подобное писал ;)


Часовой пояс GMT +4, время: 10:18.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot