|
|
|
Канал Игры Мечты: «API для графического движка» |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Вот, например, есть графический движок - вы ничего не знаете про OpenGL DirectX и вообще графику. Ваша задача - писать игру.
Какой для вас будет самый удобный интерфейс, для использования графического движка? Опишите как можно подробнее, пожалуйста.
_________________ MOV topka, C++ |
|
|
Sh.Tac.
151 EGP
  Рейтинг канала: 5(108) Репутация: 14 Сообщения: 1426
Зарегистрирован: 27.07.2005
 |
|
самый удобный?
гы, WYSIWYG канешна, када сцены ляпаются драг-н-дропом в редакторе, и потом подписываются какие-то мои функции на триггер
а потом недоумённо спрашиваем, почему такие игры получаются
_________________ This is what you get ...
(c) Radiohead |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Sh.Tac. : |
а потом недоумённо спрашиваем, почему такие игры получаются
|
Ну это зависит от программиста, который игру пишет
Ну хорошо перефразирую, не "самый удобный" а самый лучший. (Понимайте как хотите, но за слова больше не цепляйтесь )
_________________ MOV topka, C++ |
|
|
himem
210 EGP
  Репутация: 24 Сообщения: 343 Откуда: Дзержинск- Нижегородский Зарегистрирован: 24.01.2004
 |
|
Имхо чтоб удобно было - нуна создать скрипт язык, из которого интерпретатор буит управлять движком... тока как это буит тормозить и скока времени займет изучение этого языка для написания скриптов (см IW2)
PS И есть опасность что кому то не хватит всех команд - а делать его расширяемым...
_________________ -Что ты чувствуешь став богатым?
-Опустошенность.
-Да,ты подойдешь для Темного Колеса.Это точно! |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Ну не совсем.. Я имею ввиду при написании самой игры! Т.е. когла пишут код на каком либо языке программирования - не скриптах (все на скриптах не написать).
Т.е. банальная загрузка какой-либо текстуры и/или модели.
Напишите хотяб псевдокодом.(Потому что надо решать это срочно)
_________________ MOV topka, C++ |
|
|
Sh.Tac.
151 EGP
  Рейтинг канала: 5(108) Репутация: 14 Сообщения: 1426
Зарегистрирован: 27.07.2005
 |
|
обычно API предлагает разработчик, в случае, если интерфейсы неудобные, количество желающих воспользоваться библиотекой стремится к нулю, больше тут никто ничего не скажет
кста, библиотека будет опен-сорс или нет?
если закрытой, то сама даже постановка вопроса неправомочна
_________________ This is what you get ...
(c) Radiohead |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Sh.Tac. : |
обычно API предлагает разработчик, в случае, если интерфейсы неудобные..
|
ДЫк, а нафик я эту тему открыл? Я ж и хочу сделать чтоб был нормальный интерфейс, у вас собсно, появилась возможность самим придумать АПИ.
Насчет библтотеки - то она уже частично опен - сорс.
http://www.elite-games.ru/art/program/jurlessindex.shtml
_________________ MOV topka, C++ |
|
|
Pavlon
80 EGP
 Репутация: 15 Сообщения: 107 Откуда: Киев Зарегистрирован: 18.06.2006
 |
|
Хм, однако это очень сложный вопрос
Слушай, а нипиши, что за игра хоть намечается, 3Д косомсим?
Если так, то... не знаю
Ну можно например как в ГЛ, только на шаг выше. (это, я ГЛ не знаю поэтому не бейте больно)
1. Работа с моделями, имхо, без неё нкуда.
- Загрузить модель
- Загрузить текстуру для модели
...
- Загрузить/Выгрузить/Сдампить/Ещё чего-нибудть саму модель и/или все рюшечки к ней.
- Включить/Выключить все опции модели. (ну там бамп, фильтрацию и ещё чего-то)
- "Поставить" модель на сцену (координаты и повороты передаются)
2. Работа с большими объектами (как то планеты, звёзды...)
- Нарисовать объект
- Включить/Выключить опции объекта (сам не знаю что тут может быть)
3. Работа с ландшавтом (это ежели над планетой летать)
- Ввести координаты, где ты находишься на планете
- Не забываем про опции (например дальность горизонта)
- Ещё можно ввести, что-то вроде способа детализации микрорельефа:
1. При помощи заготовленных текстур микрорельефа (тогда нужно вводить ещё, когда начинать их использовать, т.е. на какой дальности от ландшавта, чтоб переход не заметен был). Ещё Проблема швов: а) все текстуры сделаны так, что швов нет (так вроде хочет делать Кладов, у которого я и спёр идею текстур микрорельефа) б) Спец процедурка "шлифовки" швов, их может быть несколько, какая работает - определяет соответствующая опция.
2. Чистый рандом. Тогда вводится тип ландшавта (можно брать из глобальной текстуры) и начальное число, от которого пляшет рандом.
- Ещё наверное нужна процедура формирования глобальной(ых) текстуры/текстур для планет, которые полностью рандомные.
- Туманность атмосферы и её цвет.
3. Работа с рендером/сценой
- Включать/выключать вскяки рюшечки (типа стенсил теней)
- Установка силы и направления глобального освещения (от звезды).
- Механизм расчёта видимых/невидимых обектов/треугольников. (может расчёт видимых/невидимых объектов выполняет общая глобальная функция, а триугольниками занимается каждый отдельно взяты объект)
- Конечно, нарисовать сцену.
4. Работа с артефактами
- Установить/убрать конкретный артефакт для конкретного объекта
(например передаётся номер артефакта и номер объекта. Или вызывается метод SetArtefact(int ArtefactNumber) нужного тебе объекта)
Отрисовка артефакта производится при отрисовке объекта. Хотя можно и вообще отдельно рисовать артефакты, как самостоятельные объекты. А функци просто вычисляет, к примеру, по планетарным координатам глобальные координаты и разворот города.
5. Всё остальное Ну там АИ, Физика...
Конечно эта схема далека от совершенства, и даже есть подозрение, что вообще не работает
Например, отсечение невидимых треугольников можно делать опционально для каждого объекта (типа вкл/выкл). Ещё фрустум распил треугольников тоже можно опциональным сделать (тоже вкл/выкл).
Ну вот. Предлагаю дорабатывать эту схему кто чем хочет. Чтоб в итоге получить нормальное АПИ.
Кстати, АПИ это предлагается делать объектным или процедурным?
|
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Ок. Ща я опишу что есть. А есть у нас объектно ориентированный графический движок.
Есть архитектура Игровых объектов:
--------------------------
JLSceneObj - основной тип-родитель. Вообще абстрактный класс.
-IdName:string; (ну, уникальное имя - по нему объект можно найти)
-Trans,locTrans:JLTransformation; (JLTransformation - класс, в котором описывается трансформация. В данный момент это - позиция+матрица поворота)
-Static:boolean; (Статичен ли объект по отношению к камере)
-disToCam:single; (Расстояние до камеры)
-Parent:string; (IdName родителя - для модульной системы, т.е. можно привязать к какому-то объекту, например, радар вращающийся к крейсеру)
-countChild:integer; (кол-во детей)
-Children:array of string; (массив детей)
procedure Render; virtual; abstract;
procedure Update; virtual;
procedure LoadFromFile(var f:file); virtual; abstract;
procedure SaveToFile(var f:file); virtual; abstract;
procedure Assign(a:JLSceneObj); virtual;
procedure AddChild(a:JLSceneObj);
procedure AddStrChild(s:string);
function GetIndxChild(Id:string):integer;
procedure DelChild(i:integer);
procedure ClearChild;
procedure AssignChild(a:JLSceneObj);
--------------------------
От этого основного типа наследуются следующие типы (описывать не буду подробно - если надо - в приват):
-Камера
-Геометрия
-Спрайт
-Система частиц
-Источник света
Есть класс-контейнер, который хранит это дело. Поскольку у меня все классы наследники одного объекта, то я использую метаклассы( JLMetaObj=class of JLSceneObj ).
У этого класса есть
FData: array of JLSceneObj;
и через процедуру AddObj я добавляю любой объект в массив
procedure JLObjArray.AddObj(O:JLSceneObj);
var me:JLMetaObj;
s:string;
begin
s:=GetUniqId(o.IdName);
Count:=Count+1;
me:=JLMetaObj(O.ClassType);
if me<>JLParSystem then Fdata[count-1]:=me.Create;
Fdata[count-1].Assign(O);
Fdata[count-1].IdName:=s;
SetChanged;
end;
Кроме того есть такие классы (не наследники JLSceneObj, а вобще отдельные), как
-JLMesh (информация о геомерии - вершины, нормали, тангенс, бинормаль, текс. координаты - имеет IdName)
-JLTexture (загружает из файла и обрабатывает в GL текстуру - имеет IdName)
-JLShader (загружает шейдер из файла, компилит и управляет инфой о шейдере - имеет IdName)
-JLMaterial - массив на 10 текстур (пока хватит ), имя шейдера и настройки поверхности (Color/Ambient/Diffuse/Specular и т.д.)
-JLBoundingObj и JLBoundingVolume(как бы массив JLBoundingObj) - это для проверки столкновений
-JLLensFlare - для спрайтов. Свечение линз
Ну там консоль, команды консоли, обертка над 2д графикой, там текст, меню и т.п. (меню пока не сильно)
Всё.. Выдал.. А теперь расскажите что не так, я не знаком с другими движками, чтоб сравнивать.
_________________ MOV topka, C++ |
|
|
Sh.Tac.
151 EGP
  Рейтинг канала: 5(108) Репутация: 14 Сообщения: 1426
Зарегистрирован: 27.07.2005
 |
|
ну так а кто мешает ознакомиться с другими движками?
вот к примеру, изделие, на которое один человек угробил четыре года, API достаточно хорошо структурировано, хотя в части гуи пользоваться не очень удобно
http://irrlicht.sourceforge.net/docu/hierarchy.html
меня, например, када я писал прототип движка, пёрло от идеи мастеров и подмастерьев, что типа подмастерье умеет что-то рисовать, планеты там, скайбоксы, неважно что, но что-то одно, а мастер умеет обрабатывать ввод пользователя и наносить, что называется "последние штрихи" на картину, созданную бригадой подмастерьев
в результате main () программы выходил очень компактным, завели объект мастера сцены, добавили к нему в помощь мастера по рисовке задникоа в PBuffer, задали каждому по бригаде, например Ландмастеру не надо подмастерьев, рисующих планеты, нужны те, кто умеет рисовать ландшафт, деревья, здания и прочее ...
ну а дальше берём набор объектов из файла инициализации, мастера, быстренько разгребают какой объект в чью епархию попадает, с какими ресурсами связан, и всё это потом культурно отображается
Как разработчик двигла, ты можешь навязать какую-угодно идеологию работы, метафору, главное чтобы это было проведено железной рукой, без дрожи
_________________ This is what you get ...
(c) Radiohead |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Вот пример, как я использую граф. движок в игре:
структура аналогична граф.движку:
основной класс-родитель для всех игровых классов
GameObj=class
engUnit:string; (IdName объекта в граф.движке)
IdName:string; (уникальное имя для идентификации)
OnCreate,
OnDead,
OnMove,
OnUpdate,
OnAssign:GameEvent; (события, для расширения возможностей - например, чтоб вынести их в ДЛЛ)
// ActiveScript:PGameScript; (ну тут я хотел скрипты забацать, но забил)
constructor Create; virtual;
destructor Destroy; override;
procedure Update; virtual;
procedure Assign(a:GameObj); virtual;
// procedure ScriptUse(nam:string);
// procedure ScriptSetUp;
function GetGlobalPos:TDotVector3; (возвращает координаты в мире = GetEngUnit.trans.pos)
function GetEngUnit:JLSceneObj; (возвращает объект из граф.движка под именем engUnit)
end;
PGameObj=^GameObj;
тип "корабль", например.
GameShip=class(GameObj)
autoPilot:boolean;
MaxShield,
Shield,Hull:single;
Inertial:integer; /// масса
MaxTra, /// макс скорость
MaxRot, /// макс маневренность
ImpTra, /// импульс скорости
ImpRot, /// импульс поворота текущий
Speed, /// скорость
SpeedAim:TDotVector3; /// целевая скорость (для инерции нада)
rocReady:single; (когда можнол ракетой пусить)
Engines:array [0..Game_Max_Engine-1] of string;
EngiSpr:array [0..Game_Max_Engine-1] of string;
Weapons:array [0..Game_Max_Weapon-1] of GameWeap;
OnMove:GameEvent;
OnDamage:GameDamageEvent;
OnFire:GameFireEvent;
OnRocketUse:GameRockEvent;
Tag:integer;
constructor Create; override;
procedure Damage(sh,hul:single);
procedure Update; override;
procedure Assign(a:GameObj); override;
procedure Move(rot,tra:TDotVector3;const trPar:PJLTransformation = nil);
procedure LookAt(const pLook:TDotVector3;const trPar:PJLTransformation = nil);
function MoveTo(const pMove:TDotVector3; const range:single=10):boolean;
procedure Fire;
procedure RocketUse(aim:GameObj);
end;
PGameShip=^GameShip;
Вот.. Пока стека команд нету.. Скоро будет.
Как я работаю с кораблем в связке с граф.движком?
Фух.. ща попробую описать..
-загружаю геометрию
-создаю/загружаю инфу о корабле
-связываю корабль с геометрией, т.е. игровой модуль с граф.движком
-- корабль.engUnit:=геометрия.IdName;
ну а дальше работаю как хочу.. не вспоминая об граф.движке, кроме тех моментов, когда нужно работать с координатами или поставить какие либо флаги рендера, например.
_________________ MOV topka, C++ |
|
|
Trident
610 EGP
    Рейтинг канала: 2(16) Репутация: 106 Сообщения: 4415 Откуда: Загнивающий Запад Зарегистрирован: 03.05.2003
 |
|
Jurec : |
А теперь расскажите что не так, я не знаком с другими движками, чтоб сравнивать.
|
Ну, хм... Имхо, контейнер выбран неудачно. Тут куда более в тему что-то что даёт как быстрый последовательный перебор, так и поиск по ID. Например хэширование+красно-чёрное дерево... http://en.wikipedia.org/wiki/Red-black_tree Вообще при программировании "среднеуровневых" библиотек типа игровых движков разные деревья сильно жизнЮ облегчают, особенно если есть чужая и не баганутая реализация. (у меня нет.)
По игровому коду, - сейчас лениво полностью формулировать, но как у старого жабера он у меня вызывает лёгкое неприятие в том, что касается событий и опять-таки ассоциативные структуры рулят
О дельфях, нежно любимых... Посмотри библиотечку KOL. http://bonanzas.rinet.ru/ Как таковая она для геймдева не очень полезна, но автор очень подробно обьясняет, как писать компактный и быстрый ОО-код. Вообще узнал я про неё, кога уже от дельфей отошёл, так что может оно того и не стоит теперь.
_________________ Злостный РетроГад(tm) и конверсатор. И да, пуркуа гнобэ-ву наших нубов? |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Trident : |
Посмотри библиотечку KOL
|
Ага, смотрел, автор - Владимир Кладов (и Новосибирская Элита - его работа) - тут в соседней ветке обитает
Trident : |
Например хэширование+красно-чёрное дерево...
|
Да, я знаю. Эта структура не годится для поиска, может потом переделаю - ведь есть класс-контейнер, а значит - переделать не особо сложно.
Trident : |
По игровому коду, - сейчас лениво полностью формулировать, но как у старого жабера он у меня вызывает лёгкое неприятие в том, что касается событий и опять-таки ассоциативные структуры рулят
|
Поясняй
_________________ MOV topka, C++ |
|
|
Protectorat
70 EGP
 Рейтинг канала: 1(1) Репутация: 15 Сообщения: 170 Откуда: Москва Зарегистрирован: 13.10.2006
 |
|
Jurec : |
Вот, например, есть графический движок - вы ничего не знаете про OpenGL DirectX и вообще графику. Ваша задача - писать игру.
|
Найдите человека, который разбирается в DirectX или OpenGL, и пусть он занимается рендерингом! Не теряйте времени зря!
|
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Protectorat : |
Найдите человека, который разбирается в DirectX или OpenGL, и пусть он занимается рендерингом! Не теряйте времени зря!
|
Jurec : |
Вот, например, есть графический движок - вы ничего не знаете про OpenGL, DirectX и вообще графику. Ваша задача - писать игру.
|
Это я писал не про себя. Я как раз хорошо знаю OpenGL.
_________________ MOV topka, C++ |
|
|
Protectorat
70 EGP
 Рейтинг канала: 1(1) Репутация: 15 Сообщения: 170 Откуда: Москва Зарегистрирован: 13.10.2006
 |
|
Jurec : |
Это я писал не про себя. Я как раз хорошо знаю OpenGL.
|
А я и не имел в виду вас Я отвечал на вопрос
|
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Protectorat : |
Я отвечал на вопрос
|
*осматривая всю темку заново* На какой?
_________________ MOV topka, C++ |
|
|
Protectorat
70 EGP
 Рейтинг канала: 1(1) Репутация: 15 Сообщения: 170 Откуда: Москва Зарегистрирован: 13.10.2006
 |
|
Jurec : |
Protectorat : |
Я отвечал на вопрос
|
*осматривая всю темку заново* На какой?
|
Ну не на вопрос точнее, а оспаривал постановку задачи, вот!
|
|
|
NRG
2526 EGP
        Рейтинг канала: 3(32) Репутация: 435 Сообщения: 10010 Откуда: Odessa, Ukraine Зарегистрирован: 07.02.2001
 |
|
с флудом полегше, а то пятница, 13-е, не знаю, кто переживет этот день, а кто - нет
_________________ Единица измерения равнодушия - один хер. |
|
|
Protectorat
70 EGP
 Рейтинг канала: 1(1) Репутация: 15 Сообщения: 170 Откуда: Москва Зарегистрирован: 13.10.2006
 |
|
NRG : |
с флудом полегше, а то пятница, 13-е, не знаю, кто переживет этот день, а кто - нет
|
На меня намекаете?
Нет, сугубо на флуд
А уж кто будет его инициатором - мне не так уж и важно
NRG
|
|
|
|
|
|
Канал Игры Мечты: «API для графического движка» |
|