Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
0 / 0 / 0
Регистрация: 07.01.2013
Сообщений: 7

Подключаюсь к Си, пишу свой движок для игр

11.01.2025, 21:29. Показов 7330. Ответов 24

Студворк — интернет-сервис помощи студентам
Здравствуйте ребята.
Вливаюсь в Си.
Сам опытный разработчик с 13 годами стажа.
Делаю игры на Unity год назад сделал там свой движок и делал игры этот год только на нем.

Вот решился написать следующую версию без Unity с нуля так сказать.

Начал хорошо, написал корень движка, с первых секунд влюбился в язык Си - он волшебный!
Но вот беда, возникают проблемы с подключением библиотек, каждой что то свое надо.
SDL2, OpenGL, Glew подключить вышло и теперь даже знаю порядок что да как делать.

И настало время поработать с UI в виду того что Nucklear написан на Си без привязки к C++ и довольно обширен, решил воспользоваться им. Но большая беда с ним, он не хочет работать, очень много разных ошибок собака выводит.

В итоге я вроде понял что надо просто файл nuclear.h закинуть в проект и путь к нему указать.
Но все равно все время какие то проблемы возникают и так я и не вывел все еще ничего из него на экран.


Буду весьма благодарен если получу помощь, может совет какой по смене nuklear на что то более подходящее.

Отговаривать и говорить что глупо писать свой движок не надо)) все знаем и учитываем и решение принято на очень трезвую голову и со смыслом.

Если опытный человек в Си помог бы при звонке, ответив на вопросы то я бы с радостью оплатил бы данную помощь.
Буду очень рад желающим.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.01.2025, 21:29
Ответы с готовыми решениями:

Движок для игр
Всем привет!!!, хотел узнать возможно ли создать движок на C++ чтобы экспортировать модели из 3ds...

Движок для игр на основе С++
Всем привет. Подскажите движок для создания игр на основе с++. Без встроенных графических...

Подскажите пожалуйста движок для создания игр с пониманием основ языка Cи и С++.
Подскажите пожалуйста движок для создания игр с пониманием основ языка Cи и С++. Для начала, с чего...

24
Модератор
Эксперт Java
 Аватар для alecss131
2896 / 1402 / 412
Регистрация: 11.08.2017
Сообщений: 4,489
Записей в блоге: 2
08.06.2025, 15:25
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Я взял файл nuklear_sdl_gles2.h из папки demo/sdl_opengles2
Смысл брать OpenGL ES который вне arm процессоров не работает? То есть на винде на х86 эта штука по определению не рабочая. Для того чтобы это заработало надо ставить трансляторы в нативные апи.
Цитата Сообщение от 8Observer8 Посмотреть сообщение
nuklear-opengl-sdl3-c.zip
Ну нафига так делать? Главное достоинство cmake в создании независимых сборок, а тут наглухо гвоздями прибито к путям и файлам которых никого кроме автора данного файла нету.
Цитата Сообщение от 8Observer8 Посмотреть сообщение
работает на Windows
У меня эта поделка не работает на Windows, появляется на несколько секунд черное окно и закрывается без ошибок.

Добавлено через 33 секунды
С горем пополам собрал, подсунув туда ему glad, результат написал выше

Добавлено через 1 минуту
То что Qt подсовывал простой OpenGL вместо ES версии тут не работает.
0
9987 / 2959 / 497
Регистрация: 05.10.2013
Сообщений: 8,110
Записей в блоге: 243
08.06.2025, 16:21
Цитата Сообщение от alecss131 Посмотреть сообщение
Смысл брать OpenGL ES который вне arm процессоров не работает? То есть на винде на х86 эта штука по определению не рабочая. Для того чтобы это заработало надо ставить трансляторы в нативные апи.
Я временно взял на скорую руку, что у них было в примерах близко к шейдерному OpenGL 2.1. У меня на Intel x86_x64 всё собирается и запускается. Суть проблемы в нерабочем Edit Box, где нельзя ввести текст. Я никаких трансляторов не ставил. Я вообще не погружался в тему этих трансляторов. Для Desktop я использую OpenGL 2.1 без ES на GLAD, а в уже Emscripten собирает в WebGL, но там уже препроцессор выбирает использовать десктопный GLAD или OpenGL ES 2.0 для браузера:

C
1
2
3
4
5
#ifdef __EMSCRIPTEN__
#include <SDL3/SDL_opengles2.h>
#else
#include <glad/glad.h>
#endif // __EMSCRIPTEN__
Цитата Сообщение от alecss131 Посмотреть сообщение
Ну нафига так делать? Главное достоинство cmake в создании независимых сборок, а тут наглухо гвоздями прибито к путям и файлам которых никого кроме автора данного файла нету.
Конкретно в данном случает я не включил папку libs откуда можно было подключить библиотеку, но я описал как это поправить. Наверняка автор темы разберутся если вернётся и попробует. Включить lib и подключить по относительным путям - это самый простой способ, как человеку, незнакомому с CMake, объяснить, как собрать проект с помощью батников. Автор хочет подключить библиотеки, а я показал, как это сделать в инструкции. У меня предыдущие уже включали в себя папку libs с библиотеками. Он легко бы разобрался, если бы вернулся и я ему подсказал, если что. CMake таким образом супер понятна.

Библиотеки в одной папке libs внутри проекта. Вот я подключаю cglm по относительному пути ./libs/cglm-0.9.6/include в CMakeLists.txt:

Code
1
target_include_directories(app PRIVATE ./libs/cglm-0.9.6/include)
Вот исходники GLAD и исходники подключаю:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Check for Windows
if (WIN32)
    target_include_directories(app PRIVATE ./libs/glad-2.0.8/include)
 
    target_sources(app PRIVATE
        ./libs/glad-2.0.8/src/glad.c
        src/line-drawer.h
        src/line-drawer.c
        src/main.c
        src/math-helper.h
        src/math-helper.c
        src/shader-program.h
        src/shader-program.c
    )
Это наиболее понятно будет автору темы, кто ниразу не работал в CMake. Ему достаточно будет скачать мой пример и ввести две команду: config-exe и build-exe и будет собрат EXE, который можно запустить командой dist\win\app Можно открыть CMakeLists.txt в Qt Creator, KDevelop, CLion, VSCode - и проект запустится. Я сам проверял во всех этих IDE и редакторе VSCode. Я считаю, что это максимально понятно, когда выкладываешь примеры на форуме и человек не знаком с CMake. Даже если он не знает CMake, то по моей инструкции он быстро соберёт.
0
9987 / 2959 / 497
Регистрация: 05.10.2013
Сообщений: 8,110
Записей в блоге: 243
08.06.2025, 18:08
Лучше писать своё маленькое GUI для своих игровых демко, которые базируются на разных известных играх: Змейка, Арканойд, Тетрис, Бомберман, Супер Марио и т.д. Кнопка - это одна или две текстуры - текстура для не нажатой и текстура нажатой кнопки. Текст - это прямоугольники с текстурой. Прямоугольник с текстурой - больше ничего не надо от OpenGL для начала тренировок в программировании игр. Лучше всего использовать какие-нилудь туториалы по созданию простых извесных игр типа: NoobTuts Snake game,, NoobTuts Pong game - это на PySDL3, то несложно будет переписывать их на C и OpenGL.

Ряд игровых демок (Змейка, Арканоид, Тетрис и т.д.) можно написать, умея рисовать только прямоугольника с заданными координатами, размерами, цветами и углами поворота.

В этом примере я вынес вынес в отдельные файлы (rectangle-draw) рисование прямоугольника:

Название: 533cc3f8bfdd03acd1799bb65655c064f4155ff3.png
Просмотров: 89

Размер: 2.2 Кб

В файле main.c я подлкючаю rectangle-draw.h:

C
1
#include "rectangle-drawer.h"
Создаю "rectangleDrawer" в функции SDL_AppInit():

C
1
2
    rectangleDrawer = RectangleDrawer_getInstance();
    RectangleDrawer_init(rectangleDrawer, shaderProgram, projViewMatrix);
А в функции SDL_AppIterate() вызываю функцию RectangleDrawer_draw():

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    glClear(GL_COLOR_BUFFER_BIT);
 
    // First rectangle
    vec3 position = { 20.f, 0.f, 0.f };
    float angle = 10.f;
    vec3 size = { 40.f, 20.f, 1.f };
    vec3 color = { 0.2f, 0.7f, 0.3f };
    RectangleDrawer_draw(rectangleDrawer, position, angle, size, color);
 
    // Second rectangle
    memcpy(position, (vec3) { -30.f, -20.f, 0.f }, sizeof(vec3));
    angle = -20.f;
    memcpy(size, (vec3) { 30.f, 10.f, 1.f }, sizeof(vec3));
    memcpy(color, (vec3) { 0.9f, 0.5f, 0.5f }, sizeof(vec3));
    RectangleDrawer_draw(rectangleDrawer, position, angle, size, color);
Я спросил в ChatGPT, какой аналог класса в Си и желательно Singleton, то была предложена рабочая схема:

rectangle-draw.h

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#ifndef RECTANGLE_DRAWER_H
#define RECTANGLE_DRAWER_H
 
#include <cglm/cglm.h>
 
#ifdef __EMSCRIPTEN__
#include <SDL3/SDL_opengles2.h>
#else
#include <glad/glad.h>
#endif // __EMSCRIPTEN__
 
typedef struct
{
    GLuint shaderProgram;
    GLuint vertPosBuffer;
    GLint aPositionLocation;
    GLint uColorLocation;
    GLint uMvpLocation;
    mat4 projViewMatrix;
    mat4 modelMatrix;
    mat4 mvpMatrix;
} RectangleDrawer;
 
// Initialization (constructor-like)
void RectangleDrawer_init(RectangleDrawer* self, GLuint shaderProgram,
    mat4 projViewMatrix);
 
// Get the rectangle drawer instance
RectangleDrawer* RectangleDrawer_getInstance(void);
 
// Setters
void RectangleDrawer_setProjViewMatrix(RectangleDrawer* self, mat4 projViewMatrix);
 
// Draw function
void RectangleDrawer_draw(RectangleDrawer *self, vec3 position, float angle,
    vec3 size, vec3 color);
 
// Cleanup (destructor-like)
void RectangleDrawer_cleanup(void);
 
#endif // RECTANGLE_DRAWER_H
Библиотеки подключены по относительным путям, поэтому собирается по инструкции.

То есть, если у вас установлен MinGW и CMake, то достаточно зайти в папку с примером и выполнить в CMD две команды: config-exe и build-exe и можно запустить EXE командой: dist\win\app

А если установлен Emscripten, то можно ввести config-web и build-web и сгенерированную папку мышкой перетащить на бесплатный хостинг Netlify. Вы получаете бесплатный домен для своего веб-приложения. Не надо иметь разные ОС у себя и собирать исполняемые файлы для каждой ОС. Собрал командой build-web и закинул на Netlify и любой читает форум с Android или iOS может тыкнуть пальцем, поиграть в демку и вернуться обратно на форум.

Демка в браузере



Архив весит 7.66 MB, потому что библиотеки уже подключены по относительным путям.

Прикрепил EXE - 140 KB, а рядом с EXE лежит SDL3.dll - 2.34 MB Архив весит чуть больше 1 MB, то есть ещё 20 с лишним MB есть запаса для ассетов, потому что на форуме ограничение для архива 25 MB, если не разбивать архив на части.

Название: 4e823edb669431e287677573551d84d6873afbde.png
Просмотров: 86

Размер: 2.0 Кб

Миниатюры
Вложения
Тип файла: zip rectangle-drawer-cglm-opengl-sdl3-c.zip (7.66 Мб, 0 просмотров)
Тип файла: zip rectangle-drawer-cglm-opengl-sdl3-c-exe.zip (1.01 Мб, 0 просмотров)
0
9987 / 2959 / 497
Регистрация: 05.10.2013
Сообщений: 8,110
Записей в блоге: 243
08.06.2025, 18:59
Рисование прямоугольников с текстурами

Смысл тот же, что и выше. Например, здесь вместо файлов "rectangle-drawer" находятся файлы "texture-drawer". Здесь TextureDrawer тоже аналог класса-синглона из C++. Совсем чуть-чуть ООП - это удобно.

Название: 083ff82ff3bf2c0b131e80aa83f44966be5e71ae.png
Просмотров: 88

Размер: 1.9 Кб

Библиотеки уже подключены по относительным путям:

Название: 444fa04ed72f17824ac8ef76700588762db58e92.png
Просмотров: 85

Размер: 1.3 Кб

Например, подключение SDL3 и остальных библиотек:

config-exe.bat

Bash
1
2
3
cmake -G "MinGW Makefiles" -S . -B dist/win ^
-DSDL3_DIR=./libs/sdl-3.1.6-prefix/win/lib/cmake/SDL3 ^
-DCMAKE_BUILD_TYPE=Debug
CMakeLists.txt

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
target_include_directories(app PRIVATE ./libs/cglm-0.9.6/include)
target_include_directories(app PRIVATE ./libs/stb_image-2.30/include)
 
# Check for Windows
if (WIN32)
    target_include_directories(app PRIVATE ./libs/glad-2.0.8/include)
 
    target_sources(app PRIVATE
        ./libs/glad-2.0.8/src/glad.c
        src/main.c
        src/shader-program.h
        src/shader-program.c
        src/texture-drawer.h
        src/texture-drawer.c
        src/texture-loader.h
        src/texture-loader.c
    )
endif()
 
find_package(SDL3)
target_link_libraries(app PRIVATE SDL3::SDL3)
Это значит, что можно ввести команды config-exe и build-exe, чтобы получить EXE или config-web и build-web, чтобы получить веб-приложение (index.html, app.js, app.wasm)

В папку с EXE добавилась папка assets с тектурами, а EXE стал в 2 раза больше (на 160 KB больше), потому что добавился файл stb_image для загрузки текстур.

Название: 6357464bf163af6999302e7fd51c2200741f3619.png
Просмотров: 85

Размер: 2.3 Кб

WASM-демка в брузере

WASM-демка весит столько 3.57 MB в Debug сборке и 1.29 MB в Release-сборке:

Название: f359e975714e78d221f55dcb648d0c4277ab625b.png
Просмотров: 85

Размер: 1.4 Кб

Debug-сборка:

Название: 8d9078b712b417fb628692c63942b1e517904eff.png
Просмотров: 85

Размер: 2.1 Кб

Release-сборка:

Название: 70d361b27a167b8803439b9df4a1c508ce0093a9.png
Просмотров: 85

Размер: 2.0 Кб

Текстура зашивается внутрь wasm-файла, благодаря этим строкам кода в CMakeLists.txt:

Code
1
2
3
4
5
# Check for WebAssembly
if (CMAKE_SYSTEM_NAME MATCHES "Emscripten")
 
    target_link_options("app" PRIVATE "SHELL:--embed-file ${CMAKE_CURRENT_SOURCE_DIR}/assets/images/crate.png@/assets/images/crate.png")
    set_property(TARGET "app" APPEND PROPERTY LINK_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/assets/images/crate.png")
Так можно зашить в WASM разные файлы: JSON, XML, аудио-файлы и т.д. Это ещё служит хорошей защитой от извлечения ассетов, если хочется защитить спрайты, 3D модели и т.д. от скачивания. Извлечь, конечно, можно, но это гораздо сложнее, чем просто зайти в Dev Tools браузера и скачать любые ассеты из вкладки Network. Запекание ассетов в WASM даёт простую в реализации защиту от скачивания ассетов всеми подряд, кто умеет открывать Dev Tools браузера на Ctrl+Shift+J и вкладку Network - после обновления страницы можно скачать все ассеты.

Демка в браузере


Миниатюры
Вложения
Тип файла: zip texture-drawer-cglm-opengl-sdl3-c-exe.zip (1.51 Мб, 0 просмотров)
Тип файла: zip texture-drawer-cglm-opengl-sdl3-c.zip (6.98 Мб, 0 просмотров)
0
9987 / 2959 / 497
Регистрация: 05.10.2013
Сообщений: 8,110
Записей в блоге: 243
08.06.2025, 19:28
Определение клика по прямоугольнику

Чтобы сделать кнопку, то нужно определять клик по кнопки. Так же как, чтобы написать игру Крестики-Нолики нужно тоже определять по какому элементу игры был сделан клик. Лучше всего начинать с таких простых игр, как Крестики-Нолики. Вам не нужен для этой игры графический дизайнер. Можете нагуглить ассеты, а можете сами нарисовать. Можно от руки в Paint'е нарисовать. Вам не нужен гейм дизайнер. У меня есть демка консольной игры Крестики-Нолики в блоге на C# откуда можно взять логику игры на двоих за одним компьютером. В следующей демке в месте объекта появляется текстура с рамкой, а в середине текстура прозрачная.

WASM-демка в браузере (1.2 MB в релизе)

Я проверял, демка работает на Android 13 из браузера, если из форума тапнуть по ссылке выше.



Миниатюры
Вложения
Тип файла: zip x-o-selection-cglm-opengl-sdl3-c-exe.zip (1.10 Мб, 0 просмотров)
Тип файла: zip x-o-selection-cglm-opengl-sdl3-c.zip (6.58 Мб, 0 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.06.2025, 19:28

Как правильно изучать язык C++ для разработки игр? + какой игровой движок посоветуете?
Здравствуйте! Хочу задать уже не раз, наверное, заданный вопрос, на который хотел бы получить...

под движок Source делаю свой мод
Всем здрасте! Есть вопрос: я программирую под движок Source делаю свой мод, вот только проблема в...

как написать свой движок для сайта?
Всем привет. Дорогие форумчане, меня интересует один несрочный вопросец - как написать свой движок...

Написать свой движок с нуля
Как написать свой движок с нуля при помощью C++. Заранее спасибо.

Закрепить в проект свой движок
Добрый день, можете объяснить или дать ссылку как &quot;закрепить&quot; свой движок в проект. Есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru