Storm54, не пойму почему у тебя такой негатив к разработчикам движков? Это же форум разработчиков игр. Ты цепляешься к словам, как будто нет опыта в общении. Я например пришел в разработку игр из software разработки. Да я уже состоявшийся разработчик, но я не знал как движки делать и конечно же будут тупняки. Почему я тебе должен как тупому объяснять? Ты вообще игру свою походу до сих пор делаешь, и ещё смеешь придераться к более сложным задачам. Если людям нравиться, то почему такой хейт на форуме разработчиков игр? Ты наверное очень сильно завидуешь, что люди умнее тебя и делают потрясающие вещи, а ты только и можешь, что делать диалоги с помощью готовых инструментов. Вообще мне не нравиться с тобой общаться, я начинаю нервничать. Ты как критикан, который думает, что его мнение самое правильное, но на самом деле каждый занимается тем чем хочет. Если ты видишь, что я его подбадриваю и пишу как это круто, а ты начинаешь критиковать, то ты до..баеб.
BADCOIQ, вообще этот форум стал каким-то токсичным. Здесь есть всего несколько человек, которые нормально относятся к любым выборам разработки, будь то движок или игра. Но есть такие придурки, которые топят только за construct и unity и всё остальное отрицают. Им не важно что ты умный, им важно что они за счет твоего унижения будут чувствовать себя не такими тупыми какими являются.
Я думаю, я даже видел интервью, где разработчик говорил что очень плохая ошибка размещать свои проекты на gcup. И это действительно так. Здесь не ценят твой труд, здесь только смотрят на картинку и если она им не нравиться, то польется тонна говна, что ты ничего не стоишь.
BADCOIQ, ты кстати можешь ещё заработать на уроках по своему движку, если сделаешь видео и выложишь на https://coursebook.ru/ , это замена онлайн площадки по видео урокам udemy. Здесь я почти ничего не заработал, но директор говорит, что некоторые зарабатывают по 100 000. Вот мой профиль, профиль Вот какие темы я затрагивал, но кстати о разработке движка как видео урока тоже можно будет замутить как только доведу до ума.
afq, Да нет никакого хейта. Но, ты пишешь в духе: Разрабатывать движки круто, их делают состоявшиеся разработчики, а все остальные - лошки. В следующем предложении: невозможно придумать, мало опыта, пишешь каждый раз заново. Вот и назревает вопрос: что ты сам то сделал, чтобы выдвигать такие умозаключения? Выглядит как пустозвонство. И никто не обязан соглашаться с твоими выводами (как и с моими), если пруфов никаких нет.
По курсам: я предлагал тебе еще пару лет назад сделать курс по написанию майнкрафта на C, с разбиением на чанки, с батчинком, достойной оптимизацией. Я даже честно оплатил бы его в качестве поощрения за развитие, если он стоящий.
Сообщение отредактировал Storm54 - Вторник, 04 Июля 2023, 20:39
По курсам: я предлагал тебе еще пару лет назад сделать курс по написанию майнкрафта на C, с разбиением на чанки, с батчинком, достойной оптимизацией. Я даже честно оплатил бы его в качестве поощрения за развитие, если он стоящий.
Storm54, я в 3d мало развиваюсь и если и буду, то мы должны договориться насчет твоего заказа. на kwork можешь оплатить. только не 20 000, это мало. Такие деньги очень маленькие для игр, которые тебе требуются. Ты не правильно оценил мой труд и у меня пропал интерес этим заниматься. На kwork у меня бывают заказы, где я за дней 5 могу 50 000 урвать, а ты мне предлагаешь 3d майнкрафт, где я не развивался и ещё хочешь чтобы я тебе сделал за такую сумму. Понимаю, если бы у меня был свой интерес, не денежный, то я бы развился и возможно для меня это было бы легко и я сделал бы и за 20 000, если бы было уже что-то готовое. но за 20 000, когда кто-то предлагает и не закрепляет это документально, ну наслово я не верю уже давно. только друзьям доверяю, но никак не форумчанам, которые просто хотят взять на слабо.
Разрабатывать движки круто, их делают состоявшиеся разработчики, а все остальные - лошки.
Storm54, даже если ты и лошок, то я тебя никак не пытаюсь унижать. Я к тому, что некоторые хотят чего-то большего, чем просто логику для игр делать. Ну вот что ты можешь сделать кроме логики на unity? Если уж на то пошло. Ведь состоявшийся разработчик, это тот, который много что умеет, ведь так? Если ты умеешь только передвигать персонажа по карте и выводить бонусы, то ты себя тоже считаешь состоявшимся разработчиком? Если да, то пожалуйста, я не навязываю своё мнение, я только хочу делать свои продукты или игры и не слушать тех, кто против того, что я делаю. Мне не нравиться критиканство типа как графика говно, ничем не обосновывая. такие люди даже не умеют рисовать скорее всего и всё по нейросетях делают. Да, они могут сказать что игрокам пофиг, но здесь такие люди, которые вообще труд не ценят. Таким разработчикам неважен какой труд был принесен человеком, они просто все обсирают. Если бы предложили спецификации по графике, то это было бы интересно, а когда какому то нехудожнику не понравилась картинка, то как ты думаешь, с психологической точки зрения, стоит ли писать что графика говно? Или лучше помочь улучшить, раз это форум разработчиков? Если не можешь подсказать советом, то зачем мне твое мнение слушать, кто ты такой, чтобы я к тебе прислушивался? если я буду зависеть от мнения разных людей, то это будет капец. так что у меня есть люди, которых я знаю хорошо и могу прислушаться, а эти, которых я не знаю и они сразу так пишут, как будто эксперты, то их мнение ничего для меня не стоит. Да я зацепился сначала, но понял что они просто токсики. а мне с моей инвалидностью не нужен вообще негатив, так как это плохо сказывается на психике. Но я понимаю, что эти токсики, они же ну такие, типа высказал негатив и пусть человек отвечает на него, чтобы токсик получил кайф.
Задумка была оформить тебе это как курс и продавать, чтобы тебе же получить небольшой бонус я бы его купил первым, чисто ради поддержки и может какого-нибудь фидбека. О каком-то формате фриланса, естественно, речи быть не может, для меня такие поделки какой-либо ценности не представляют. Выше я уже написал, какие алгоритмы нужно использовать, чтобы это создать, как бы намекая, что я в этом разбираюсь.
Цитатаafq ()
Я к тому, что некоторые хотят чего-то большего, чем просто логику для игр делать
В этом то и заключается главное недопонимание. Ты думаешь, что помимо написания движка больше нет каких-то технически сложных задач. Отсюда и тезисы про "передвижение персонажа по карте, вывод бонусов и т.п.". Открой тот же Unity, который ты воспринимаешь как конструктор, и посмотри, какой там функционал вообще есть. Да, там не нужно всегда писать свой рендер луп (хотя при необходимости можно, даже на плюсах, на чем крупные проекты и базируются), да, в Unity не нужно заниматься полным менеджментом ресурсов и добавлять свою библиотеку с математикой или писать свой скиннинг на GPU. Это уже есть. Но, когда дело доходит до разработки РЕАЛЬНОЙ игры, то оказывается, что нужно реализовать уйму дополнительных вещей: Кастомный батчинг; тонны оптимизированных шейдеров; Если игра с большим открытым миром: упаковка локаций в специальный формат, желательно оптимизированный для последовательного чтения; кастомный поиск пути для большого открытого мира; Если делается игра по типу гонок: то физическое поведение машины, с учетом поведения двигателя, коробки передач и трения шин, управление такой машиной через AI; Если делается стратегия: Lockstep детерминированная симуляция мира, система применения команд и все что на этом строится, от сохранения игры, до мультиплеера. Если же говорим про мультиплеер в жанрах RPG/FPS, то сразу куча дополнительных тем: Авторитарный сервер, Reliable/Unreliable сетевой трафик, lag compensation and reconciliation. Это лишь немногие из направлений, с которыми лично я работал за последние 10 лет и поэтому мне смешно и одновременно грустно читать этот треш про разработку движка в 600 строк и мысли, что если проект базируется на каком-то коммерческом игровом движке, то в нем лишь примитивный код. Ну и последнее: с чего ты взял, что я вообще работаю с Unity?) Последний проект, который я скидывал и который ты посмотрел, на самописном плюсовом движке, самописном мультиплеере с поддержкой 2K CCU на сервер, системой реплеев, сражениями в 300x300 юнитов и вдовесок системой автообновления клиента, автообновления сервера и самописным античитом и обфускатором кода. Вот и получается, что я критикую сообщения, потому что мне действительно есть что сказать на большинство тем геймдева, т.к. я в этом варюсь уже очень и очень долго.
Сообщение отредактировал Storm54 - Вторник, 04 Июля 2023, 23:48
Это лишь немногие из направлений, с которыми лично я работал за последние 10 лет и поэтому мне смешно и одновременно грустно читать этот треш про разработку движка в 600 строк и мысли, что если проект базируется на каком-то игровом движке, то в нем лишь примитивный код.
Ну ok, если ты мой код понимаешь, значит я его хорошо написал. А чем плох движок в 600 строк кода, если игра работает и всё что в ней нужно есть? Я ничего лишнего не написал, всё что нужно для игры всё есть. Если столкнусь с более сложными задачами, то и их решу. Но нужно придумать игру.
Цитата
Последний проект, который я скидывал и который ты посмотрел, на самописном плюсовом движке, самописном мультиплеере с поддержкой 2K CCU на сервер, системой реплеев, сражениями в 300x300 юнитов и вдовесок системой автообновления клиента, автообновления сервера и самописным античитом и обфускатором кода. Вот и получается, что я критикую сообщения, потому что мне действительно есть что сказать на большинство тем геймдева, т.к. я в этом варюсь уже очень и очень долго.
А это ты сам всё написал или твоя команда? Ты критикуешь чужой код, когда как сам код своего движка не можешь показать. Что это за позиция такая?
Storm54, подожди, мы ведь когда обсуждали мой движок, ты зацепился насчет камеры и потом ты сказал, что не знаешь как должно быть, но в других играх несколько камер. Я не очень понимаю тогда что именно ты делаешь. Ну имею ввиду что именно ты знаешь, а то критикуешь движок, хотя не знаешь как должна камера работать, хотя не видел ни один движок с несколькими камерами, а в unity пример привел с камерами, но не знаешь как внутри это работает.
Ну ok, если ты мой код понимаешь, значит я его хорошо написал. А чем плох движок в 600 строк кода, если игра работает и всё что в ней нужно есть? Я ничего лишнего не написал, всё что нужно для игры всё есть. Если столкнусь с более сложными задачами, то и их решу. Но нужно придумать игру.
Ничем он не плох, просто это очень маленький объем работы и движком это назвать нельзя, ведь в такое количество кода какие-то серьезные вещи не вмещаются по определению, что уже подразумевает, что это не движок, а тонкая обертка над OpenGL.
Цитатаafq ()
А это ты сам всё написал или твоя команда
Оригинальный движок одиночной игры я не писал. Все остальное написано лично мной за последние 3.5 года - примерно 200к строк кода. Еще 150к строк написано присоединившейся командой (2 человека) за 2 года.
Цитатаafq ()
Что это за позиция такая?
Позиция очень простая: есть продукт и он работает, клиент обновляется, сервера функционируют с 99% аптаймом. В него можно зайти и поиграть, а это уже говорит само за себя.
Оригинальный движок одиночной игры я не писал. Все остальное написано лично мной за последние 3.5 года - примерно 200к строк кода. Еще 150к строк написано присоединившейся командой (2 человека) за 2 года.
Не ну смотри, ты движки не писал, зато критикуешь по части архитектуры, будто ты спец. Позиция твоя, что ты только критикуешь чужой движок, но свой не можешь показать, показывает что ты лишь любишь сливать негатив, так как еще раз повторяю, ты не вкурсе как движки писать и не надо меня учить и вообще что-либо писать в теме которой ты не разбираешься. И я сделал вывод, что твои сообщения тоже не буду читать так как ты неадекватный. Понимаю если бы ты разбирался, а тут критикуешь то, в чем не разбираешься. Всё давай, до свидания. Можешь даже больше мне ничего не писать, я всё-равно читать не буду.
Не ну смотри, ты движки не писал, зато критикуешь по части архитектуры, будто ты спец
Ок, приведи пример в котором я ошибся. Если видение ситуации отлично от твоего, то это не значит, что ты автоматом молодец, а все остальные - нет. Веди дискуссию: приводи аргументы, обсуждай озвученные тезисы, а не уходи в обидку, как ты обычно делаешь, скипая большую часть каждого из написанных сообщений.
Storm54, да так и есть он несет сплошной бред не обращая внимания что ему пишут по существу, указывая на недочеты, а после когда ответить нечего то как ребенок просто убегает. Он походу живет в своем выдуманном мирке где кроме него никого нет. Когда мне по моей игре указывали на недочеты или ошибки то я как баран не писал им в ответ что они ничего не понимают и пускай сами попробуют сделать а читал и вникал и как ни странно потом исправлял если аргументы реально значимые. Да еще и благодарил что помогли. Но этот ничего слушать не хочет, даже когда ему указывают на проблемы, он же пуп земли ))))))) А ему всего то показывают реальное положение дел его игры чтобы помощь ему ее улучшить. Но видимо до него этого не доходит и прикол в том что потом в еденичных отзываю, причем с положительным уклоном указывали на то же что и я изначально.
Сообщение отредактировал MagicHero - Среда, 05 Июля 2023, 19:34
Нужно где-то хранить размеры, например, ширину и высоту. И ещё надо хранить 4 значения обозначающих прямоугольную область. Нужны
Код
bqPoint bqRect
Куда их сунуть? Где написать? Добавлю новый .h файл inc/badcoiq/common/bqBasicTypes.h Напишу туда.
Код
template<typename T> class bqPoint_t { public: bqPoint_t() {} bqPoint_t(T X, T Y) : x(X), y(Y) {}
T x = 0; T y = 0; };
using bqPoint = bqPoint_t<int32_t>; using bqPointf = bqPoint_t<float>;
template<typename T> class bqRect_t { public: bqRect_t() {} bqRect_t(T Left, T Top, T Right, T Bottom) : left(Left), top(Top), right(Right), bottom(Bottom) {}
T left = 0; T top = 0; T right = 0; T bottom = 0; };
using bqRect = bqRect_t<int32_t>; using bqRectf = bqRect_t<float>;
Окно
При создании окна ничего указывать не надо. Просто Призовём окно. Все настройки будем делать методами. Окну нужен коллбэк, оно будет вызывать методы когда с окном что-то случиться.
inc/badcoiq/system/bqWindow.h
Код
// Когда с окном что-то происходит, оно будет вызывать эти коллбэки // При создании окна мы обязаны послать указатель на коллбэк class bqWindowCallback { public: bqWindowCallback() {} virtual ~bqWindowCallback() {}
// Когда переключились к этому окну virtual void OnActivate(bqWindow*) {} // Когда переключились к другому окну virtual void OnDeactivate(bqWindow*) {}
// После изменении размера virtual void OnSize(bqWindow*) {} // Пока изменяем размер virtual void OnSizing(bqWindow*) {} // when resizing
// Свернули окно virtual void OnMinimize(bqWindow*) {} // Развернули на весь монитор virtual void OnMaximize(bqWindow*) {} // Восстановили (из Maximized и Minimized в обычное) virtual void OnRestore(bqWindow*) {}
// Когда окно перерисовывается virtual void OnDraw(bqWindow*) {}
// Когда двигается virtual void OnMove(bqWindow*) {}
// Когда кликается кнопка закрытия virtual void OnClose(bqWindow*) {} };
Окна для разных ОС имеют что-то общее. Нужно сунуть общие данные в структуру.
Код
struct bqWindowCommonData { // тут хранится указатель на коллбэк bqWindowCallback* m_cb = 0;
// размер рамки bqPoint m_borderSize;
// минимальный размер окна bqPoint m_sizeMinimum;
// текущий размер окна (клиентской области) bqPoint m_sizeCurrent;
// окно видимо или нет bool m_isVisible = false;
// данные специфичные для ОС void* m_implementation = 0; };
Данные специфичные для ОС могут понадобиться. Надо добавить ещё одну структуру, которая видна только для Windows платформы.
Надо добавить отдельный .h файл, для Windows данных, так как нужно подключать windows.h, а лишний раз это делать не нужно (я за скорость компиляции). inc/badcoiq/system/bqWindowWin32.h
// Установить заголовок void SetTitle(const char*);
// Скрыть\показать void SetVisible(bool v);
// Узнать, видимо ли окно. // Можно скипать рисование если окно например свёрнуто. bool IsVisible() { return m_data.m_isVisible; }
// Развернуть в полный экран void Maximize(); // Свернуть void Minimize(); // Восстановить оконное состояние (ну типа оконное, не полный экран) void Restore();
// Тут, указатели для того чтобы получить их и сохранить где-то, и // не вызывать эти методы каждый раз, так как в таком случае потребуется // вызывать постоянно. // Получить минимальный размер окна. bqPoint* GetSizeMinimum() { return &m_data.m_sizeMinimum; } // Получить размер рамки bqPoint* GetBorderSize() { return &m_data.m_borderSize; }
// Получить данные bqWindowCommonData* GetData() { return &m_data; }
// Установить позицию и размер void SetPositionAndSize(int x, int y, int sx, int sy); };
void bqWindow::SetPositionAndSize(int x, int y, int sx, int sy) { BQ_ASSERT_ST(m_data.m_implementation); #ifdef BQ_PLATFORM_WINDOWS bqWindowWin32* w32 = (bqWindowWin32*)m_data.m_implementation;
Добавлено (06 Июля 2023, 18:45) --------------------------------------------- Delta time Вычисление Delta Time реализую в bqFramework::Update
Код
static clock_t then = 0; clock_t now = clock();
g_framework->m_deltaTime = (float)(now - then) / CLOCKS_PER_SEC; then = now;
для clock_t надо подключить <time.h>
User Data Бывает объектам нужно добавить поля GetUserData SetUserData Добавлю базовый класс.
inc/badcoiq/common/bqUserData.h
Код
// Если для какого-то класса нужен user data, то можно наследовать этот класс class bqUserData { void* m_data = 0; public: bqUserData() {} virtual ~bqUserData() {}
Добавлено (07 Июля 2023, 22:40) --------------------------------------------- Математика
Хочу использовать заранее вычисленные значения для sin cos atan2 и т.д. Нецелесообразно вычислять большой диапазон. Функции принимают значения например от -1 до +1, от -Пи до +Пи и т.д.
// Expect value from -PI to +PI // It will do this // if (v > 3.141f) v = 3.141f; // if (v < -3.141f) v = -3.141f; static float Cos(float); static double Cos(double); static float Sin(float); static double Sin(double); static float Tan(float); static double Tan(double);
// wikipedia: // Imprecise method, which does not guarantee v = v1 when t = 1, due to floating-point arithmetic error. // This method is monotonic. This form may be used when the hardware has a native fused multiply-add instruction. // // типа, Lerp1 не гарантирует что x станет равным y (...Lerp2 тоже) // ... имеет 1 умножение. Lerp2 имеет 2 умножения. static float Lerp1(float x, float y, float t); static double Lerp1(double x, double y, double t);
// wikipedia: // Precise method, which guarantees v = v1 when t = 1. This method is monotonic only when v0 * v1 < 0. // Lerping between same values might not produce the same value static float Lerp2(float x, float y, float t); static double Lerp2(double x, double y, double t);
// Находится ли точка в прямоугольной области static bool PointInRect(const bqPoint&, const bqRect&); };
Опять класс со статическими методами(...очень удобно). Постепенно будут добавлены множество других методов когда появятся вектор, матрица, кватернион.
template<typename T2> bqVec4_t<T2> operator*(T2 v)const { bqVec4_t<T2> r; r.x = x * v; r.y = y * v; r.z = z * v; r.w = w * v; return r; }
template<typename T2> bqVec4_t<T2> operator+(const bqVec4_t<T2>& v)const { bqVec4_t<T2> r; r.x = x + v.x; r.y = y + v.y; r.z = z + v.z; r.w = w + v.w; return r; } ... T x = static_cast<T>(0); T y = static_cast<T>(0); T z = static_cast<T>(0); T w = static_cast<T>(0); T* Data() { return &x; } };
В bqForward.h добавил
Код
template<typename T> class bqVec2_t; template<typename T> class bqVec3_t; template<typename T> class bqVec4_t; template<typename T> class bqMatrix4_t;
using bqVec2 = bqVec2_t<bqReal>; using bqVec2f = bqVec2_t<float>; using bqVec2i = bqVec2_t<int32_t>; using bqVec3 = bqVec3_t<bqReal>; using bqVec3f = bqVec3_t<float>; using bqVec3i = bqVec3_t<int32_t>; using bqVec4 = bqVec4_t<bqReal>; using bqVec4f = bqVec4_t<float>; using bqVec4i = bqVec4_t<int32_t>; using bqMat4 = bqMatrix4_t<bqReal>;
так-же некоторые функции для векторов добавил в класс bqMath, чтобы не нагружать bqVector.h
Матрица Матрица для 3D мира это четыре 4D вектора
Код
vec4 matrix[4];
Ещё называют матрица 4на4
Есть матрица 3на3 Матрица 3на3 является как бы частью матрицы 4на4 Та часть что 3 на 3 это базис. Он отвечает за вращение. Раньше делали игры на матрицах 3на3. ХЗ как сейчас, везде 4 на 4. Необходима позиция, например, объект на сцене перемещается изменяя позицию. В матрице 4на4 указывается эта позиция. А при использовании матрицы 3на3 видимо посылали позицию отдельно, я честно не изучал это.
и в памяти он должен занимать это так-же, вот почему вектр должен НЕ содержать ничего лишнего.
Вот эта часть (помечено единичками) отвечает за положение точки в пространстве, ориентация, всмысле вращение относительно центра, так-же там находится так называемый масштаб
Если поставить 2 то моделька увеличиться\координата сдвинеться. Если 0.5 то уменьшится\сдвинеться в обратную сторону. Если там будут нули и мы рисуем модель то модельки не будет видно.
В углу должна стоять единица, для математической магии.
Matrix4x4 Position = Matrix4x4( 0,0,0,0, 0,0,0,0, 0,0,0,0, x,y,z,1 );
Matrix4x4 World = Position * Rotation * Scale; // справа на лево - масштабируем, вращаем, и устанавливаем на позицию.
Матрица нужна для преобразования 3D координаты... например позиция [132.25][2556.23][1.52] ...в 2D координаты куда идёт рисование (напрямую на экран, или в текстуру)...назавём "холст" а координатная система холста от -1 до +1
Позиция умножается на матрицу - получается нужное значение.
Нужно создать удобный класс.
Код
// кратко template<typename T> class bqMatrix4_t { public: bqMatrix4_t() { Identity(); }
Что такое кватернион не объяснить, ибо это высшая математика, комплексное число. Читайте википедию.
Простыми словами, кватернион хранит вращение, наверно более корректно - ориентацию. Указываем углы, получаем кватернион, преобразуем в матрицу вращения. Вращать объект кватернионом можно в любое направление. Главное я покажу в будущем, во "Вращение объектов"
Добавлено (07 Июля 2023, 22:49) --------------------------------------------- Кватернионы можно интерполировать. Обычно такая функция называется Slerp
на форуме тупизм, невозможно продолжить публиковать сообщения пока кто-то другой не напишет статейки пишутся в текстовый документ, будут опубликованы позже, тут или где-то ещё.
Добавлено (25 Ноября 2023, 21:37) --------------------------------------------- Для начала добавить простое 2D api для разных рендеров. Сейчас реализовано для opengl 1.2 и 3.3
Добавлено (08 Декабря 2023, 11:03) --------------------------------------------- BADCOIQ, Продолжение будет?