Я сейчас задумываюсь о том, какие улучшения сделать в модуле Input (он хранит и обрабатывает ввод и события с клавиатуры и мыши).
Если вы уже разрабатывали игру или программу или только задумывались об этом, какие бы данные вам могли понадобиться?
Например, чтобы реализовать взаимодействие с графическим пользовательским интерфейсом (GUI), нужно знать координаты курсора (cursorPosition).
Чтобы реализовать перемещение элементов интерфейса курсором, например, виртуальных окошек, нужно знать на сколько пикселей он сдвинулся относительно значения в предыдущем кадре — дельту курсора (cursorMove).
Но для перемещения камеры cursorMove не подойдёт.
Это неточный способ, на него действует акселерация windows, а так же область движения будет ограничена размером экрана или окна.
Для более точного движения камеры без ограничений я использую raw input, это сырые данные без обработки напрямую с мыши, клавиатуры и не только.
Назвал эту переменную mouseMove.
ссылка на канал | ссылка на группу
Если вы уже разрабатывали игру или программу или только задумывались об этом, какие бы данные вам могли понадобиться?
Например, чтобы реализовать взаимодействие с графическим пользовательским интерфейсом (GUI), нужно знать координаты курсора (cursorPosition).
Чтобы реализовать перемещение элементов интерфейса курсором, например, виртуальных окошек, нужно знать на сколько пикселей он сдвинулся относительно значения в предыдущем кадре — дельту курсора (cursorMove).
Но для перемещения камеры cursorMove не подойдёт.
Это неточный способ, на него действует акселерация windows, а так же область движения будет ограничена размером экрана или окна.
Для более точного движения камеры без ограничений я использую raw input, это сырые данные без обработки напрямую с мыши, клавиатуры и не только.
Назвал эту переменную mouseMove.
ссылка на канал | ссылка на группу
❤1
This media is not supported in your browser
VIEW IN TELEGRAM
Ударил по столу и появились такие помехи на мониторе.
Прикольный эффект, я бы хотел повторить его, используя openGL.
ссылка на канал | ссылка на группу
Прикольный эффект, я бы хотел повторить его, используя openGL.
ссылка на канал | ссылка на группу
🔥1
Часто ли вы сталкивались с проблемами вывода кириллицы в консоль?
Что думаете насчёт написания статьи, которая ответит на вопросы: почему так происходит, как это можно решить?
Что думаете насчёт написания статьи, которая ответит на вопросы: почему так происходит, как это можно решить?
Anonymous Poll
62%
Нужна
38%
Не нужна
Недавно я включил отображение всех предупреждений, строгое соответствие стандарту C++ без расширений gnu и рассмотрение предупреждений, как ошибок.
(
У MinGW на windows я столкнулся с одной неудобной особенностью.
Во время runtime отладчик gdb не может остановиться на только что созданной точке останова.
С некоторыми ухищрениями это можно сделать, но в некоторых ситуациях это слишком неудобно или вовсе невозможно.
Поэтому я пользуюсь конструкцией
Но из-за
На помощь пришёл атрибут
(аналог в виде расширения gcc:
ссылка на канал | ссылка на группу
(
-Wall -Wextra -Wpedantic -Werror -std=c++17)У MinGW на windows я столкнулся с одной неудобной особенностью.
Во время runtime отладчик gdb не может остановиться на только что созданной точке останова.
С некоторыми ухищрениями это можно сделать, но в некоторых ситуациях это слишком неудобно или вовсе невозможно.
Поэтому я пользуюсь конструкцией
bool wait { }; или if(condition) { bool wait { }; } и заранее ставлю точку останова, чтобы отладчик зацепился за эту переменную и остановился в нужном мне месте и в нужный момент.Но из-за
-Wunused-variable и -Werror я не смогу скомпилировать код с неиспользуемыми переменными.На помощь пришёл атрибут
[[maybe_unused]] (C++17 и старше).(аналог в виде расширения gcc:
__attribute__((unused)), [[gnu::unused]]).ссылка на канал | ссылка на группу
Dmitry Develop
Недавно я включил отображение всех предупреждений, строгое соответствие стандарту C++ без расширений gnu и рассмотрение предупреждений, как ошибок. (-Wall -Wextra -Wpedantic -Werror -std=c++17) У MinGW на windows я столкнулся с одной неудобной особенностью.…
Другие способы решения этой проблемы, которые лично мне не понравились:
* Указать
* Использовать директиву
ссылка на канал | ссылка на группу
* Указать
-Wno-unused-variable, что отключит эти очень полезные предупреждения.* Использовать директиву
#pragma
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
// warned code
#pragma GCC diagnostic pop
* Добавить префикс "(void)" к переменнойbool unused { };(void)unused; // <--ссылка на канал | ссылка на группу
Dmitry Develop
Часто ли вы сталкивались с проблемами вывода кириллицы в консоль?
Что думаете насчёт написания статьи, которая ответит на вопросы: почему так происходит, как это можно решить?
Что думаете насчёт написания статьи, которая ответит на вопросы: почему так происходит, как это можно решить?
Что думаете насчёт создания видео или тектовой инструкции как установить и настроить окружение gcc + vscode под windows?
Anonymous Poll
54%
Надо
15%
Не надо
31%
Просто посмотреть ответы
Media is too big
VIEW IN TELEGRAM
Когда переписываешь проект с нуля, всё становится гораздо легче и быстрее.
За 5 минут накидал интерфейс, он уже даже как-то реагирует на действия.
Мне нравится.
ссылка на канал | ссылка на группу
За 5 минут накидал интерфейс, он уже даже как-то реагирует на действия.
Мне нравится.
ссылка на канал | ссылка на группу
int functionA(int a, int b)
{
return a + b;
}
int functionB(int a, int b)
{
return a * b;
}
volatile int COUNT { 100 }; // переменная известная во время runtime
int(**arrayFunctions)(int, int) = new (int(*[COUNT])(int, int));
arrayFunctions[0] = functionA;
arrayFunctions[1] = functionB;
int result { arrayFunctions[0]() + arrayFunctions[1]() };
delete[] arrayFunctions;
Ничего себе синтаксис динамического массива указателей на функции.
По началу думал, что там указатель на указатель (
**), и мне было не понятно, зачем это нужно.Потом вспомнил, что одна звёздочка является частью синтаксиса объявления указателя на функцию и всё стало понятно.
Весь код приведён только для примера использования, главное тут синтаксис объявления и инициализации
arrayFunctions.ссылка на канал | ссылка на группу
Я программирую в vs code уже более 2-х лет, мне очень нравится этот редактор с плагинами, но кое-чего мне не хватает...
Мне очень часто приходится прыгать туда-сюда по огромному файлу исходного кода.
Делать это при помощи полосы прокрутки или предпросмотра файла неудобно.
Делать это через поиск тоже неудобно, особенно когда у тебя более 100 переменных в проекте, которые могут иметь однокоренные слова или похожие части в названии.
Делать это при помощи точки останова было получше, но всё же тоже неудобно, во время отладки нужно либо убирать её, либо отключать.
Я поймал себя на мысли, что пора что-то менять.
Немного поискал и открыл для себя очень удобное расширение Bookmarks.
Странно, почему этого функционала нет из коробки, ведь для программистов это очень полезная и удобная функция.
ссылка на канал | ссылка на группу
Мне очень часто приходится прыгать туда-сюда по огромному файлу исходного кода.
Делать это при помощи полосы прокрутки или предпросмотра файла неудобно.
Делать это через поиск тоже неудобно, особенно когда у тебя более 100 переменных в проекте, которые могут иметь однокоренные слова или похожие части в названии.
Делать это при помощи точки останова было получше, но всё же тоже неудобно, во время отладки нужно либо убирать её, либо отключать.
Я поймал себя на мысли, что пора что-то менять.
Немного поискал и открыл для себя очень удобное расширение Bookmarks.
Странно, почему этого функционала нет из коробки, ведь для программистов это очень полезная и удобная функция.
ссылка на канал | ссылка на группу
This media is not supported in your browser
VIEW IN TELEGRAM
Что ж, с переделкой интерфейса я почти закончил.
Новый внешний вид мне нравится гораздо больше.
Immediate mode GUI оказалось гораздо проще реализовывать и кастомизировать.
ссылка на канал | ссылка на группу
Новый внешний вид мне нравится гораздо больше.
Immediate mode GUI оказалось гораздо проще реализовывать и кастомизировать.
ссылка на канал | ссылка на группу
👍2
Media is too big
VIEW IN TELEGRAM
Ох, не думал я, что работать с микроконтроллером, аналоговым сигналом с последующей его оцифровкой и UART будет так непросто.
В начале жизненного цикла разработки у меня сигнал приходил очень нестабильно: то байт куда-то потеряется, то биты сдвигаются.
В этом были виноваты стандарт передачи данных, а именно его отсутствие, и плохая скорость передачи данных для частоты моего микроконтроллера, которая давала ~5% потерь.
Когда два данных недочёта были исправлены, у меня всё стало идеально.
Однако во время тестирования программы заказчиком и комиссией, у них сигнал был с довольно сильными помехами, что им, конечно, не понравилось, хотя программу они оценили.
В данном видео вы увидите действие фильтра "бегущее среднее", а потом я планирую применить ещё и медианный фильтр.
(Кнопка с анимацией загрузки "..." — это наработка для будущего обновления)
ссылка на канал | ссылка на группу
В начале жизненного цикла разработки у меня сигнал приходил очень нестабильно: то байт куда-то потеряется, то биты сдвигаются.
В этом были виноваты стандарт передачи данных, а именно его отсутствие, и плохая скорость передачи данных для частоты моего микроконтроллера, которая давала ~5% потерь.
Когда два данных недочёта были исправлены, у меня всё стало идеально.
Однако во время тестирования программы заказчиком и комиссией, у них сигнал был с довольно сильными помехами, что им, конечно, не понравилось, хотя программу они оценили.
В данном видео вы увидите действие фильтра "бегущее среднее", а потом я планирую применить ещё и медианный фильтр.
signalFilterUsing - применяется ли фильтр к сигналу.signalFilterWidth - ширина выборки для усреднения.(Кнопка с анимацией загрузки "..." — это наработка для будущего обновления)
ссылка на канал | ссылка на группу
Попался мне недавно человек, у которого с
По этому случаю решил попробовать с нуля создать шаблон проекта, в котором только пути до компилятора поправить и можно будет компилировать и запускать отладку.
Ориентировался на использование
Старайтесь не использовать кириллические и прочие
Скачать zip архив проекта
(1 обновление 01.10.2023 22:51)
ссылка на канал | ссылка на группу
vs code были одни проблемы.По этому случаю решил попробовать с нуля создать шаблон проекта, в котором только пути до компилятора поправить и можно будет компилировать и запускать отладку.
Ориентировался на использование
mingw и windows.Старайтесь не использовать кириллические и прочие
unicode символы а также пробелы в пути, иначе можете убить не один час на решение магических проблем).Чтобы скопилировать проект:1) ctrl + shift + B2) для отладки выбираем "build debug" для распространения выбираем "build release"Чтобы запустить проект:1) с отладкой: F5 без отладки : ctrl + F5Скачать zip архив проекта
(1 обновление 01.10.2023 22:51)
ссылка на канал | ссылка на группу
arduinoSuccess.png
652 KB
Это так приятно помочь кому-то, когда уже сам прошёл через огонь и воду и догадываешься, в чём проблема.
Чисто на скилле, на опыте).
Я вообще с arduino совсем недавно начал работать, но нас объединяет C++, так что не всё так плохо).
ссылка на канал | ссылка на группу
Чисто на скилле, на опыте).
Я вообще с arduino совсем недавно начал работать, но нас объединяет C++, так что не всё так плохо).
ссылка на канал | ссылка на группу
Как компилировать и подключать библиотеки в GCC?
Библиотеки это набор скомпилированного кода, который может переиспользоваться в разных программах.
Существует два вида библиотек: статическая (static) и динамическая (dynamic).
В операционной системе linux они имеют расширение соответственно
> Как скомпилировать динамическую библиотеку?
Допустим, наша библиотека состоит из двух исходных файлов:
Тогда команда сборки для компиляции будет такой:
1)
2)
3)
> Как скомпилировать статическую библиотеку?
Аналогично динамической библиотеке, у нас будет тот же набор исходных файлов и название библиотеки.
Однако, сначала нужно скомпилировать исходный код в объектный файл, а только потом создать архив (набор объектных файлов), то есть нашу библиотеку:
1)
2)
2)
2)
> Как подключить библиотеку к программе?
Для начала нужно указать где линковщик должен искать нашу библиотеку, если не найдёт её по стандартным путям:
Итоговая команда сборки:
Линковщик ищет и обрабатывает библиотеки и объектные файлы в порядке их перечисления.
Если объявленный символ идёт раньше библиотеки или объектного файла, где он определён, он может быть не загружен и линковщик сообщит вам о "
Циклические зависимости и зависимость от порядка перечисления библиотек в GCC
> Что будет, если у меня статическая и динамическая библиотеки будут называться одинаково?
Если линковщик находит и статическую, и динамическую библиотеку, приоритет отдаётся динамической, однако параметром
> Как мне выбрать конкретный вид библиотеки?
Для начала посмотрим на описание параметра
Следовательно, когда вы указываете
Чтобы указать конкретное название и даже расширение библиотеки, добавьте символ двоеточие между параметром и названием библиотеки.
Важно также указывать расширение библиотеки.
ссылка на канал | ссылка на группу
Библиотеки это набор скомпилированного кода, который может переиспользоваться в разных программах.
Существует два вида библиотек: статическая (static) и динамическая (dynamic).
В операционной системе linux они имеют расширение соответственно
.a и .so и формат ELF, а в windows .lib и .dll и формат COFF.> Как скомпилировать динамическую библиотеку?
Допустим, наша библиотека состоит из двух исходных файлов:
libraryPart1.cpp и libraryPart2.cpp и будет называться libraryName.Тогда команда сборки для компиляции будет такой:
g++ -shared -fPIC -o liblibraryName.so libraryPart1.cpp libraryPart2.cpp
Тут важно три момента:1)
-shared: произвести динамический объект, который может быть связан с другими объектами для создания исполняемого файла.2)
-fPIC: генерировать независимый от позиции код, работа которого не будет зависеть от адреса расположения кода.3)
-o liblibraryName.so: префикс lib и расширение .so обязательны, чтобы связывать библиотеку с программой без лишних трудностей.> Как скомпилировать статическую библиотеку?
Аналогично динамической библиотеке, у нас будет тот же набор исходных файлов и название библиотеки.
Однако, сначала нужно скомпилировать исходный код в объектный файл, а только потом создать архив (набор объектных файлов), то есть нашу библиотеку:
g++ -c -o library.o libraryPart1.cpp libraryPart2.cpp
ar rcs liblibraryName.a library.o
Объяснение параметров:1)
-c: скомпилировать исходный код в объектный файл, но не связывать.2)
r: вставить объектный файл в архив с заменой2)
c: создать новый архив2)
s: добавить новый индекс или обновить существующий> Как подключить библиотеку к программе?
Для начала нужно указать где линковщик должен искать нашу библиотеку, если не найдёт её по стандартным путям:
-LlibraryPath, потом указать какую библиотеку(и) подключить: -llibraryName.Итоговая команда сборки:
g++ -o main.exe main.cpp -LlibraryPath -llibraryName
Учтите, порядок перечисления библиотек и объектных файлов в аргументах командной строки важен.Линковщик ищет и обрабатывает библиотеки и объектные файлы в порядке их перечисления.
Если объявленный символ идёт раньше библиотеки или объектного файла, где он определён, он может быть не загружен и линковщик сообщит вам о "
undefined reference to ...".Циклические зависимости и зависимость от порядка перечисления библиотек в GCC
> Что будет, если у меня статическая и динамическая библиотеки будут называться одинаково?
Если линковщик находит и статическую, и динамическую библиотеку, приоритет отдаётся динамической, однако параметром
-static этот приоритет меняется на статическую.> Как мне выбрать конкретный вид библиотеки?
Для начала посмотрим на описание параметра
-l: ищет библиотеку, добавляя к названию префикс lib и расширение .so или .a.Следовательно, когда вы указываете
-llibraryName, линкер ищет сначала liblibraryName.so, потом liblibraryName.a.Чтобы указать конкретное название и даже расширение библиотеки, добавьте символ двоеточие между параметром и названием библиотеки.
Важно также указывать расширение библиотеки.
-l:anyLibraryName.a
ссылка на канал | ссылка на группу
🔥3