Author Topic: Nuke3D - Конструктор олдскульных FPS  (Read 363 times)

0 Members and 1 Guest are viewing this topic.

Offline Vuvk

  • Friends
  • Baron (-ess)
  • *
  • Posts: 344
  • Reputation 34
  • Lokemundux Desco Domus Shaantitus
Привет. Провел небольшие эксперименты с рисованием текстур на экране для отключения сглаживаний всяких. Нашёл в заголовке пару нужных мне функций.
Беру 2д-материал и отключаю ему сглаживания и фильтрации:
Code: [Select]
    wMaterial* material2d = wEngineGet2dMaterial ();
    wMaterialSetAntiAliasingMode(material2d, wAntiAliasingMode.wAAM_OFF);
    wMaterialSetFlag(material2d, wMaterialFlags.wMF_ANISOTROPIC_FILTER, false);
    wMaterialSetFlag(material2d, wMaterialFlags.wMF_ANTI_ALIASING,      false);
    wMaterialSetFlag(material2d, wMaterialFlags.wMF_BILINEAR_FILTER,    false);
    wMaterialSetFlag(material2d, wMaterialFlags.wMF_TRILINEAR_FILTER,   false);

Затем включаю его перед обработкой оружия и выключаю после:
Code: [Select]
    wEngineSet2dMaterial(true);
    WeaponUpdate();
    wEngineSet2dMaterial(false);

В функции WeaponUpdate в том числе и рисование графики. И я заметил, что материал РАБОТАЕТ с функциями wImageDraw и wImageDrawEx, но не работает с wImageDrawAdvanced, где доступно вращение объекта. Что-то можно с этим сотворить?  ???
Crudux Cruo!

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 880
  • Reputation 61
Насчет wGuiSetVisible я посмотрю, wGuiSetEnable- это для кнопок, чекбоксов и прочих контролов, но не для картинок.  По идее если скрыть картинку- просто не рисуй ее. Есть же wGuiObjectDraw.

wGuiSetVisible будет работать, вероятно, если ты рисуешь ВСЕ объекты через wGuiDrawAll().

Для wEngineGet2dMaterial, т.е. для 2d-материалов, в описании сказано, что не все флаги материалов поддерживает. По моему, нет освещения и еще чего-то. Можно уточнить...
« Last Edit: June 18, 2018, 12:06:39 PM by Nikolas - WS3D Developer »
Под лежачий камень мы всегда успеем...

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 880
  • Reputation 61
wImageDrawAdvanced- не родная функция иррла. Я ее откопал на оф. форуме.  Там для рисования вращающейся картинки создается полигон и на него натягивается текстура.  Поэтому и не работает.  По идее на это должен повлиять глобальный антиалайсинг. Попробуй включить его в wStartAdvanced.
« Last Edit: June 18, 2018, 12:02:17 PM by Nikolas - WS3D Developer »
Под лежачий камень мы всегда успеем...

Offline Vuvk

  • Friends
  • Baron (-ess)
  • *
  • Posts: 344
  • Reputation 34
  • Lokemundux Desco Domus Shaantitus
Quote
По идее на это должен повлиять глобальный антиалайсинг. Попробуй включить его в wStartAdvanced.
Пробовал, фокус не удаётся.
Quote
в описании сказано, что не все флаги материалов поддерживает. По моему, нет освещения и еще чего-то.
Да, там ещё и туман работать не будет. Да оно мне и не надо...
Crudux Cruo!

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 880
  • Reputation 61
Я посмотрю в wImageDrawAdvanced, сравню с оригинальными функциями рисования, может, что выяснится...

============
Добавил параметр сглаживания в  wTextureDrawElement, забыл добавить в  wTextureDrawElementAdvanced в то, что выслал. Но оно там есть, нужно просто дописать.
« Last Edit: June 18, 2018, 01:03:33 PM by Nikolas - WS3D Developer »
Под лежачий камень мы всегда успеем...

Offline Vuvk

  • Friends
  • Baron (-ess)
  • *
  • Posts: 344
  • Reputation 34
  • Lokemundux Desco Domus Shaantitus

Всем привет! Некоторым могло показаться, что разработка заморозилась, но это не так. Я стараюсь еженедельно отписываться о прогрессе в своем паблике, а дублировать текст оттуда как-то лениво. Что ж, пришло время это исправить.
В редакторе:
- полностью готово окно редактирования оружия, как подбираемых объектов, оружия в руках, настройка типа пуль (лучи или видимые снаряды), настройка анимации, урона и т.д.
- полностью готово окно редактирования видимых пуль - текстур, анимации, размеров  и прочих параметров;
- исправлено несколько досадных ошибок;
- появился режим "показ пола" при рисовании стен - для удобства.


В среде запуска:
- загрузка оружия и пуль вместе с их параметрами;
- исправлено несколько досадных ошибок;
- создание объекта по имени из скрипта (ещё работаю над всеми фишками этого создания);
- обработка паузы в скриптах (все объекты замирают);
- загрузка скриптов по типам в память и их дублирование объектам при их создании, т.е. объекты берут скрипты ранее загруженные, а не загружают каждый раз необходимый - это было временное решение и я наконец-то от него избавился;
- занялся чисткой кода раннера от мусора (старых комментариев, ненужных блоков, временных костылей и т.д.);
- подключение и инициализация библиотеки PhysFS: реализация оберток для удобной загрузки файлов из архивов/папок, загрузка всех ресурсов с использованием нового метода работы с внешними источниками.


Прилагаю видео-отчеты в порядке по давности видео от старого к новому.
RGC 180618
RGC 180620
RGC 180629
RGC 180717
На последнем видео я рассказываю о баге создания объектов - уже решено.
Crudux Cruo!

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 897
  • Reputation 36
  • Game making is my hobby for life!

Привет.
На 1-м из этих видео ты говоришь о баге коллизии. Да, видно, что коллизия срабатывает, но не сразу. Уже решил проблему? Просто интересно, какой или какими функциями пользуешься для луча. Какие там параметры у этих функций задействованы? В конструкторе ещё нет фич для коллизий? Если бы были, то легче было бы отловить баги с коллизиями.
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline Vuvk

  • Friends
  • Baron (-ess)
  • *
  • Posts: 344
  • Reputation 34
  • Lokemundux Desco Domus Shaantitus

Quote
Да, видно, что коллизия срабатывает, но не сразу. Уже решил проблему?
Если речь о коллизии луча с объектами, то да, решил. Проблема оказалась в том, что луч реагирует на столкновение со всеми нодами, даже с биллбордами. Для решения проблемы я сделал отдельную пустую ноду и её сделал родительской для всех объектов, столкновения с которыми ДОЛЖНЫ обрабатываться. Таким образом отфильтровал всякий мусор.


Привожу код на языке D:
Code: [Select]
/*
g_WorldCollider - коллайдер мира, т.е. это коллизия всех твердых объектов на сцене
g_SolidObjects - пустая нода, к которой прицеплены объекты, которые должны обрабатываться при проверке коллизий
*/
if (wCollisionGetPointFromRay(g_WorldCollider, &start, &end, &collideAt, &normal, &tris))
{
wVector3f offset;
wVector3f point;


// для стопроцентного определения объекта немного сдвинем точку "вовнутрь"
offset = wMathVector3fNormalize(normal);
offset.x *= -0.01;
offset.y *= -0.01;
offset.z *= -0.01;
point = wMathVector3fAdd(collideAt, offset);


if (g_SolidObjects != null)
{
wNode* target = wCollisionGetNodeChildFromPoint(g_SolidObjects, 0, false, &point);
if (target != null)
{
// какие-то действия с этим объектом
}
}
}
Crudux Cruo!

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 897
  • Reputation 36
  • Game making is my hobby for life!
Quote
Для решения проблемы я сделал отдельную пустую ноду и её сделал родительской для всех объектов, столкновения с которыми ДОЛЖНЫ обрабатываться. Таким образом отфильтровал всякий мусор.
Оригинально. Хорошая идея.
У меня тоже в проектах бывает какая-нибудь проблема, в интернете не хочу или не могу найти решение - код, приходится анализировать, выдумывать, выкручиваться - в этом вся прелесть програмирования, - благо современные ЯП (даже ФБ) предоставляют много средств, способов/путей для решения задачи и это очень интересно.
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 880
  • Reputation 61
Quote
сделал отдельную пустую ноду и её сделал родительской для всех объектов

Кстати, такое решение использую сами разработчики irrlicht, достаточно взглянуть на кусок кода (21 пример Quake3Explorer)
Code: [Select]
// logical parent for the items
ItemParent = smgr->addEmptySceneNode();
if ( ItemParent )
ItemParent->setName ( "Item Container" );

ShaderParent = smgr->addEmptySceneNode();
if ( ShaderParent )
ShaderParent->setName ( "Shader Container" );

UnresolvedParent = smgr->addEmptySceneNode();
if ( UnresolvedParent )
UnresolvedParent->setName ( "Unresolved Container" );

FogParent = smgr->addEmptySceneNode();
if ( FogParent )
FogParent->setName ( "Fog Container" );

// logical parent for the bullets
BulletParent = smgr->addEmptySceneNode();
if ( BulletParent )
BulletParent->setName ( "Bullet Container" );

Потом в нужном месте перебирают детей только ЭТИХ родителей:

Code: [Select]
if ( ItemParent )
{
list<ISceneNode*>::ConstIterator it = ItemParent->getChildren().begin();
for (; it != ItemParent->getChildren().end(); ++it)
{
(*it)->setDebugDataVisible ( value );
}
}

if ( ShaderParent )
{
list<ISceneNode*>::ConstIterator it = ShaderParent->getChildren().begin();
for (; it != ShaderParent->getChildren().end(); ++it)
{
(*it)->setDebugDataVisible ( value );
}
}

if ( UnresolvedParent )
{
list<ISceneNode*>::ConstIterator it = UnresolvedParent->getChildren().begin();
for (; it != UnresolvedParent->getChildren().end(); ++it)
{
(*it)->setDebugDataVisible ( value );
}
}

if ( FogParent )
{
list<ISceneNode*>::ConstIterator it = FogParent->getChildren().begin();
for (; it != FogParent->getChildren().end(); ++it)
{
(*it)->setDebugDataVisible ( value );
}
}
Под лежачий камень мы всегда успеем...

Offline Vuvk

  • Friends
  • Baron (-ess)
  • *
  • Posts: 344
  • Reputation 34
  • Lokemundux Desco Domus Shaantitus

Уф, что-то я слишком давно не обновлял тему. На самом деле разработка не останавливалась и медленно, но верно движется к чему-то законченному.
Особо разглагольствовать не буду, т.к. кому интересна тема, тот может подробнее почитать инфо в моих пабликах:
VKontakte
Facebook


По сравнению с предыдущим постом:
- сменилось название на Nuke3D;
- разработка среды запуска переехала на язык программирования C++. Т.е. полностью был переписан код с D на плюсы, попутно исправлены кривости в архитектуре. Это было сделано намерено для бОльшей совместимости с существующими готовыми библиотеками. Хотя D и замечателен, как язык программирования, но всё ещё сырой;
- была разработана аудио-система на базе alure1.x + OpenAL. Её код вы можете взять здесь: audio_system.
Описание
Демонстрация
Поддерживаются форматы: WAV, OGG, FLAC, MP3, XM, MPTM, IT, S3M, MIDI
Поддержка прекэшированного и потокового воспроизведения как из папки, так и из архивов напрямую (спасибо библиотеке PhysFS)
2D и 3D звуки
- реализована работа со звуком: добавление звуков в редакторе, экспорт в пак, загрузка в среде запуска и управление звуками через скриптовую машину JavaScript


Последнее видео со средой запуска:
!!!СМОТРЕТЬ!!!


Старые видео в хронологической последовательности:
RGC 180824
RGC 180828
RGC 180919 видео-отчет
RGC 180926 видео-отчет
Nuke3D + OpenAL first run
Nuke3D sound in game
« Last Edit: November 09, 2018, 08:03:28 AM by Vuvk »
Crudux Cruo!

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 880
  • Reputation 61
Re: Nuke3D - Конструктор олдскульных FPS
« Reply #26 on: November 09, 2018, 04:01:53 PM »
Шикарно!   Есть у кого теперь спросить про новую звуковую библиотеку и по скриптам тоже  ::) Я вот никак не возьму в толк: есть ли смысл подключать скрипты для движка, если он не заточен под конкретный жанр? И если есть, то какие команды туда вставлять? Весь АПИ? Было-бы глупо, думаю.
Под лежачий камень мы всегда успеем...

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 897
  • Reputation 36
  • Game making is my hobby for life!
Re: Nuke3D - Конструктор олдскульных FPS
« Reply #27 on: November 09, 2018, 06:00:59 PM »
Привет. Да, я заметил новое название. Интересно, nuke - это ядерная бомба/электростанция.Вообще, когда есть звучное название, это привлекает внимание.
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline Vuvk

  • Friends
  • Baron (-ess)
  • *
  • Posts: 344
  • Reputation 34
  • Lokemundux Desco Domus Shaantitus
Re: Nuke3D - Конструктор олдскульных FPS
« Reply #28 on: November 12, 2018, 08:04:37 AM »
Quote
Я вот никак не возьму в толк: есть ли смысл подключать скрипты для движка, если он не заточен под конкретный жанр? И если есть, то какие команды туда вставлять? Весь АПИ? Было-бы глупо, думаю.
Ну "подключение" к скриптовому языку Python же есть, хоть и сырое. Есть множество движков, с которыми общение и разработка могут вестись через скрипты - Panda, Urho, LOVE и т.д.


Quote
nuke - это ядерная бомба/электростанция
Тут двойной смысл. Во-первых, как отсылка к Duke Nukem 3D, во-вторых, автор конструктора является работником атомной электростанции.  ;D
Crudux Cruo!