Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Давайте попробуем развить демку dceDemo из состава GLScene ?


Страницы:   1 2 3 4

Ктото ©   (2004-09-17 02:54:00) 

Потому, что она похожа на недоделанный игровой движок. (Графика плюс коллизии.) И можно попытаться его доделать. Или хотя бы обсудить чего ей нехвататет, чтобы стать игрой.

Сама демка dceDemo, если кто не знает, лежит тут :
http://cvs.sourceforge.net/viewcvs.py/glscene/Demos/behaviours/DCEDemo/

Я пока сделал небольшой редактор Джиэльсценовского мира, с возможностью сохранять/загружать отредактированный мир в ini-файл. Ini-файлы удобны тем, что их можно легко подредактировать ручками. Например, вставить несколько однотипных объектов с небольшим смещением координа, и таким образом получить, например забор, или несколько этажей здания. И т. п.

Скачать можно тут : http://dcegame.narod.ru/dcegame.html
Исходник к демке прилагается. В файле save.ini находится небольшой уровень, сделанный в редакторе.

Вопросы, пожелания ? СтОит ли ? Куда двигаться дальше ?


Darth   (2004-09-25 03:05:00) [41]

//Будет движок - будет и игра.
движок сам по себе это дай Бог 10% от игры


Ктото   (2004-09-25 03:00:00) [42]


> DeadMeat ©   (24.09.04 22:43) [38]
> force:=affinevectormake (actor.AbsoluteToLocal(vectormake
> (......)));
> GetOrCreateDCECollision (actor).AddForce(force);

А что в скобках ?


DeadMeat   (2004-09-24 22:43:00) [43]

Хе-хе... А ларчик та просто открывался...
Я тут начал было напрягать всяких математиков, а все проще оказалось. Причем намного проще. Да и вроде должно работать:


force:=affinevectormake (actor.AbsoluteToLocal(vectormake (......)));
GetOrCreateDCECollision (actor).AddForce(force);


---
...Death Is Only The Begining...


Ктото   (2004-09-24 03:24:00) [44]


> DeadMeat ©   (23.09.04 19:12) [36]
> http://www.deadmeat.fatal.ru/GLScene/Addins.rar

Да. С этим работает. И взрывы намного быстрее получаются, чем c FireFx. И натуральнее как-то.
А кто-такой этот RaveniX, который её написал ? У него сайт какой-то ?


> Насчет взрывной волны, попробую седня ченить замутить...

Попробуй. Взрывная волна особенно полезна была в Сэме. Там когда себе под ноги стреляешь, можно было взлететь на какой нибудь забор.


DeadMeat   (2004-09-23 19:12:00) [45]


> Ещё в той демке, которую ты на конкурс посылал есть в юзез
> какой-то модуль OffSetAnim. Откуда он ? А то без него не
> компилируется.

http://www.deadmeat.fatal.ru/GLScene/Addins.rar

Насчет взрывной волны, попробую седня ченить замутить...

---
...Death Is Only The Begining...


Ктото   (2004-09-23 02:42:00) [46]

Придумал как уничтожать объекты в FreeForm. Правда проверил только для 3ds файлов. Но с остальными наверно что-то аналогичное :

var
 M1   : TMeshObject;
begin
 // Gate - это фриформ в которую загружен фай gate.3ds содержащий ворота.
 M1 := Gate.MeshObjects.FindMeshByName('Stvorka'); // Stvorka - група Stvorka со створкой ворот.
 if M1 <> nil then begin
   beep;
   M1.Destroy; // Удаляем створку.
   F1.BuildOctree;
   F1.StructureChanged;
 end else ShowMessage('Створку не нашли');
end;


Достаточно выстрелить в створку ворот, прикрыть её огнём и дымом взрыва, чтобы невидно было как она исчезает. И можно этим кодом её просто убрать.


Ктото   (2004-09-23 01:36:00) [47]


> DeadMeat ©   (22.09.04 22:08) [33]
> Держать на том же уровне вложения что и актер такой же дамми
> куб с присобаченным к нему ДЦЕ с такимиже параметрами что
> и у актера.

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

Можно выдернуть код из самой функции и использовать его. Только сама функция малопонятная :
// PointTo
//
procedure TGLBaseSceneObject.PointTo(const absolutePosition, upVector : TVector);
var
  absDir, absRight, absUp : TVector;
begin
  // first compute absolute attitude for pointing
  absDir:=VectorSubtract(absolutePosition, Self.AbsolutePosition);
  NormalizeVector(absDir);
    //: Calculates the cross product between vector 1 and 2
  absRight:=VectorCrossProduct(absDir, upVector);
  NormalizeVector(absRight);
  absUp:=VectorCrossProduct(absRight, absDir);
  // convert absolute to local and adjust object
  if Parent<>nil then begin
     FDirection.AsVector:=Parent.AbsoluteToLocal(absDir);
     FUp.AsVector:=Parent.AbsoluteToLocal(absUp);
  end else begin
     FDirection.AsVector:=absDir;
     FUp.AsVector:=absUp;
  end;
  TransformationChanged
end;

Что такое VectorCrossProduct ? Ты понимаешь, чего там делается, нет ? Я не очень.
В общем, так ничего и не получилось у меня.

-----------
В твоей демке, если загрузить другую карту от Квэйка, Плэйер не пролезает в низкие проходы. Сделай его поменьше ростом.

Как быть с дверьми и разбиваемыми стёклами/решётками на уровнях ? Их можно как-то через GLScene прятат/показывать/сдвигать или что-нибудь в этом роде ? Какие-нибудь свойства типа Visible или чего-нибудь подобного у них есть ?

Ещё в той демке, которую ты на конкурс посылал есть в юзез какой-то модуль OffSetAnim. Откуда он ? А то без него не компилируется.


DeadMeat   (2004-09-22 22:08:00) [48]

Вариант на вскидку (правда извращенский как и все другие мои решения).
Держать на том же уровне вложения что и актер такой же дамми куб с присобаченным к нему ДЦЕ с такимиже параметрами что и у актера. Т.е. копия. При взрыве ставим его в теже координаты, что и актер, но с нужным нам дирекшином. Дирекшин вычисляем так - направляем его в сторону взрыва (что то типа, PointTo) и инвертируем. Теперь наш дамми куб стоит там где надо и смотрит туда, куда надо. Прикладываем к ему силу и в каденсере ровняем координаты актера с его координатами. Получаем то, что нужно.
НО! Есть одно но. Надо понять, когда перестать ровнять координаты. Выставлять время либо копать ДЦЕ на предмет свойства типа IsMoving. Если нет (а скорее так и есть), то добавить.
Вариант не проверенный, слишком сегодня на работе устал, так что буду смотреть только завтра (если получиться). Пока что добавил проверку на столкновение снарядов со стенами. Вроде работает...

Кстати. Давайте выкладывать у кого, что есть на эту тему. Но не выкладывать то, что есть уже у всех. Например я буду выкладывать только *.PAS отдельно. Т.к. все остальное можно скачать также отдельно. Просто траффик сэкономлю немного...

---
...Death Is Only The Begining...


Ктото   (2004-09-22 05:33:00) [49]


> DeadMeat ©   (22.09.04 00:10) [30]

Пытаюсь сделать эффект, когда бы взрывная волна отбрасывала назад.
Делаю так :
var
 iPoint : TVector; // Центр взрыва
 Dist1  : Single;  // Расстояние до взрыва.
 BurstVector : TAffineVector; // Вектор взрывной волны.
...
begin
...
   // Задаём центр взрыва.
 iPoint := ... ;
   // Вычисляем расстояние до взрыва
 Dist1 := VectorDistance(iPoint, Player.AbsolutePosition);
   // Вычисляем вектор взрыва.
 BurstVector := NullVector;
 BurstVector[0] := (-iPoint[0] +Player.Position.X) *Dist1 *10;
 BurstVector[2] := (-iPoint[2] +Player.Position.Z) *Dist1 *10;
   // Добавляем вектор взрыва в качестве толкающей Плэера силы.
 TGLBDCEBody(Player.Behaviours.Behaviour[0]).AddForce(BurstVector);


И получается что Плэера после взрыва отбрасывает не назад, а куда попало. Сидел думал почему, оказалось, что потому, что AddForce добавляется с учётом Player.Direction. А вот как в нашем векторе взрыва учесть этот Player.Direction, я чего-то непойму. Может ты сообразишь ?


Ктото   (2004-09-22 01:26:00) [50]


> DeadMeat ©   (21.09.04 09:37) [27]
> А еще надо графику набить. Если со звуками все нормально
> (в нете можно кучу сэмплов найти бесплантых), то с модельками
> и картами придется повозиться... Ведь их (модельки) надо
> еще и анимировать. Это в начале можно использовать чужое,
> но потом придется всеравно свое...

Без движка, этим заниматься рано. Первый этап - это дужиок. Чтобы был качественный геймплэй. Вот если его удасться создать, то второй этап будет - создание игровых ресурсов.


> Видимость чего?

1 Как определить видимость монстра от центра взрыва ?
2 Как это сделать быстро ?
Даже когда просто стреляешь, то определение объекта по которому стреляешь слегка тормозит. А если просчитывать видимости всех монстров от всех взрывов могут быть и сильные тормоза.


> Можно конечно и ODE подключить, но это не целесообразно
> (ИМХО).

Да. Лучше без неё. Слишком сложно и трудоёмко.


DeadMeat   (2004-09-22 00:10:00) [51]

Залил http://deadmeat.fatal.ru/minishooter.rar
Гдето 1,27Mb
Там должно быть все...
Пока еще нет проверки на столкновение снарядов (они просто летают) и нет проверки на приседание... Времени не хватает. Чуть позже добью...


> Ктото

Я еще не проверял этот метод. Но так подумал, что могут возникнуть проблемы, если выстрел попадает в угол... Вообщем надо над этим поразмыслить... Можно конечно и ODE подключить, но это не целесообразно (ИМХО).

---
...Death Is Only The Begining...


DeFenix   (2004-09-21 16:45:00) [52]

Выложи minishhoter на fatal, а то на nightmail не скачиваеться!


DeFenix   (2004-09-21 16:44:00) [53]

Выложи minishhoter на fatal, а то там не скачиваеться!


DeadMeat   (2004-09-21 09:37:00) [54]


> У меня с найтмэйла нормально скачался. Один файл. Там раньше
> какие то глюки были. Вроде нельзя было называть файлы заглавными
> буквами, а то не скачивались. В остальном вроде ничего.

Странно... Раньше все нормально было... Ладно буду выкладывать на фатале и только маленькими буквами называть.


> А что ещё-то ? :)

А еще надо графику набить. Если со звуками все нормально (в нете можно кучу сэмплов найти бесплантых), то с модельками и картами придется повозиться... Ведь их (модельки) надо еще и анимировать. Это в начале можно использовать чужое, но потом придется всеравно свое...


> Расстояние от позишн взрыва, до позишн монстра определить
> можно. Но как проверить видимость ?

Видимость чего?

---
...Death Is Only The Begining...


Ктото   (2004-09-21 04:32:00) [55]


> DeadMeat ©   (21.09.04 03:44) [25]
> Кстати, куда выкладывать? На fatal.ru или на nightmail.ru?

У меня с найтмэйла нормально скачался. Один файл. Там раньше какие то глюки были. Вроде нельзя было называть файлы заглавными буквами, а то не скачивались. В остальном вроде ничего.

Насчёт стен - не очень понял. Расстояние от позишн взрыва, до позишн монстра определить можно. Но как проверить видимость ? Камеры то у нас нету и буфера тоже.


> А давайте все соберемся (все кто с GLScene) и напишем чегонить.
> Кто графику, кто еще что...

А что ещё-то ? :) Прежде чем писать игру, надо написать движок. Вернее понять как это делается. Накопить кусков кода, решить все эти проблемы с загрузками уровней, итемов, взрывами, стрельбой, монстрами и т. д. Будет движок - будет и игра.


DeadMeat   (2004-09-21 03:44:00) [56]


> А если я нехочу создавать сорок папок и раскидывать по ним
> текстуры ? Как сделать, чтобы всё из одной папки грузидось
> ?

Брать кваковский редактор и менять. Лучше не переделывать в другой формат, а поменять прямо в этом... Просто для кваки текстуры были общие, и поэтому их класиффицировали каждую в свою папку со своим названием "класса".


> У тебя внутри скобок два вызова функций clientwidth и clientheight

Ааа... Так вот про что ты говорил. Тогда да. Полностью согласен...


> Как по-твоему лучше всего сделать взрыв в смысле просчёта
> коллизий ?

Пока еще об этом не думал, но есть такая мысля (надо проверить).
При помощи RayCastIntersect (или кто там) получить координаты и нормаль в точке столкновения снаряда со сненой. Нормаль будет к стене. После этого считаем расстояние от точки взрыва до каждого монстра (VectorDistance). Даже если их много, то врядли перебор займет много времени. На крайний случай, можно использовать OctreeSphereSweepIntersect (кажись она).
Насчет стены.
Когда получим координаты и нормаль, то можно через PointIsInHalfSpace смотреть, кто где.

З.Ы. А давайте все соберемся (все кто с GLScene) и напишем чегонить. Кто графику, кто еще что... Мож чего и выйдед путного...? Я вот щас закончу с "приседанием" актера и выложу очередной вариант... Кстати, куда выкладывать? На fatal.ru или на nightmail.ru?

---
...Death Is Only The Begining...


Ктото   (2004-09-21 01:52:00) [57]


> DeadMeat ©   (20.09.04 19:50) [20]
> В нем указан относительный путь к каждой текстуре. Как и
> во всех моделях. Главное сами текстуры разместить правильно....,
> в смысле по папкам. А они изначально правильно лежат там
> все...

А если я нехочу создавать сорок папок и раскидывать по ним текстуры ? Как сделать, чтобы всё из одной папки грузидось ?


> Ээмм... Не совсем догнал... Во первых зачем FormKeyDown
> и FormResize если они будут вызываться, только в соответствующие
> моменты?

FormKeyDown чтобы отключать фиксацию мыши. Чтобы, например, изменить размер окна.

Когда ты делаешь :
 SetCursorPos(left +clientwidth div 2,top +clientheight div 2);
У тебя внутри скобок два вызова функций clientwidth и clientheight. Поставь брэйкпоинт на эту строку и посмотри сам в ассемблере Ctrl+Alt+C .
А если сделать так
 SetCursorPos(PosOfFixMouse.X, PosOfFixMouse.Y);
то вызовов функций внутри скобок небудет. Ибо вызов вынесен в ресайз, так как точка в которую надо каждый раз возвращать мышь, меняется только при изменении размеров формы.

Вообще в кадансере от всех лишних вызовов функций лучше уходить, потому, что они отжирают много времен.

-----------
Как по-твоему лучше всего сделать взрыв в смысле просчёта коллизий ? Просто перебирать координаты всех объектов и монстров ? Но если их слишком много ?
И как быть со взрывами за стеной ? Они тогда будут убивать также как и взрыв рядом.


DeadMeat   (2004-09-20 21:38:00) [58]

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1086063518&n=9&web=1
Пост [120]

---
...Death Is Only The Begining...


DeadMeat   (2004-09-20 21:35:00) [59]


> А вообще лучше сразу с CVS... Благо последний клиент, вроде
> через прокси может работать...


---
...Death Is Only The Begining...


DeFenix   (2004-09-20 20:59:00) [60]

А это-сработало! Кстати, где вы вообще берёте новые версии GlScene?!


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо