Текст записи.
18 окт 2023
PS:
///----------------------------------------------------------------------------|
данный проект репроектился тут https://github.com/BDOTimer/Calculattor-2024.Apr
///----------------------------------------------------------------------------|
...
Итак, ... тик-так,
Цель: уменьшить время, которое я провожу фо флейме.
Напишу ка, я тут, обычный(хз, или необычный) калькулятор.
Сразу о том, что это будет за калькулятор,
он будет НЕ КНОПОЧНЫЙ, а СТРОЧНЫЙ.
на вход подаётся строка текста,
на выходе результат вычисления.
всё просто.
1.
да,
я видел калькулятор у страуструпа,
и чуть ранее писал свои,
и даже пару написал своих.
2.
хочу исправить тамошние недостатки, такие как, например,
- парсинг и вычисление в одной и той же процедуре кода.
- негодность для рисования графиков.
- неочевидная легкость(т.е. сложность) добавления новых операторов.
- ...
3.
В релизе,
собсно форма, на которой два контрола:
- Control ввода строки текта
- Control вывода(рисования) графика
- ...(контролы масштаба и тп..)
4.
не будет никакого дедлайна - т.е. я не буду торопиться.
но я по опыту(возможно кривому) уже знаю, что у меня тут есть только 15 страниц.
в эти 15 страниц я обязуюсь уложиться))
(тутошнюю верстку я обсуждать не буду)
5.
заявить, что я пишу этот журнал для тех кто изучает С++,
будет брехня, ибо С++ ради С++ меня ваще никогда не интересовал,
однако, возможно оно и будет кому то полезно, я не возражаю.
в общем то эти записи чисто ради моего личного фана,
поддержания тонуса, и ясного осознания моей социальной животности.
...
Итого,
конечный желаемый результат разделю на две части:
1.
Сам консольный калькулятор.
2.
Демо вариантов его использования.
Ссылки на инструменты:
версия для винды(то что буду юзать я):
1. Редактор кода: Code::Blocks
2. С++17 компилятор(i686-posix-dwarf-gcc-13.1.0-mingw-w64msvcrt-11).
Вместо хеллоуворлда:
///----------------------------------------------------------------------------| /// -std=c++17 /// Исходник в utf-8 ///----------------------------------------------------------------------------: #include <iostream> #include <string> ///----------------------------------------------------------------------------| /// Calculator. ///----------------------------------------------------------------------------: namespace Calculator { using T = double; struct Instance { Instance() = default; Instance( std::string_view s){ parse( s); } ///---------------------| /// Парсинг строки. | ///---------------------: void parse( std::string_view s) { /// TODO ... } ///---------------------| /// Само вычисление. | ///---------------------: T calc( ) { /// TODO ... return 0; } ///---------------------| /// Тест. | ///---------------------: static bool test( std::string_view s, T r) { Instance instance; instance.parse( s); return instance.calc ( ) == r; } private: }; } #define TEST( a) Calculator::Instance::test( #a, a) ///-----------------------------| /// Тесты. | ///-----------------------------: bool tests( ) { bool isgood = true; isgood &= TEST( 3 - 3); isgood &= TEST( 4 * 5); return isgood; } ///----------------------------------------------------------------------------| /// main. ///----------------------------------------------------------------------------: int main( ) { setlocale( 0, ""); std::wcout << L"Привет, я ваш Calculator!\n\n"; std::wcout << L"Тесты: " << ( tests( ) ? L"ОТЛИЧНO" : L"ПЛОХО\a") << '\n'; }
10 июня 2023
Пишу Тетрис на коленке.
Почему тетрис, а не змейка или арканоид?
Потому что с точки зрения кодинга - БЕЗ РАЗНИЦЫ.
Зачем я пишу этот тетрис?
Потому што я школьник и я учусь.
Если вы ещё не писали свой тетрис, змейку или арканоид то этот пайпер, возможно, будет вам. интересен.
Я не буду тут учить вас С++ - я буду писать игру Тетрис и по возможности буду проговаривать вслух те мысли, которые неизбежно будут проскакивать в моей голове, пока я буду писать код.
"Итак, у вас есть план, мистер Фикс?"
Да! У меня есть План:
1. Инструменты, которые мне понадобятся.
2. Как должна выглядеть игра.
3. Первый код.
4. Где рисовать
5. Как писать код.
7. Из чего состоит игра.
8. Тесты.
9. Релиз.
В плане нет ничего про С++ кодинг, а вопросов связанный с ним может быть поболя, чем 100500.
Если я быстро пройдусь по этому плану, то у меня получится вступление. Годно.
Увы не все моменты, которые мне будут интересны я смогу проговорить вслух, поэтому надежда на комменты))
1.
Инструменты, которые мне понадобятся.
Редактор кода Code::Blocks
Компилятор MSYS2 GCC
Это всё.
по мне это лучший выбор для небольших проектов.
2.
Как должна выглядеть игра.
Наикратчайший вариант по скорости написания - консоль.
Консоль безцветная и мигающая, потому что не хочу привязываться к виндосу.
Я уже знаю, мне захочется большего эстетизма,
поэтому, возможно, я добавлю SFML.
Именно добавлю, а не перепишу на SFML.
Почему SFML?
Потому что он для детей - его не надо учить - берёшь и используешь согласно документации.
3.
Первый код.
- проверим русский язык.
- убедимся что у нас есть С++17
4.
Где рисовать
Количество выпущенного железа в разы больше, чем живущих на планете людей.
И ... я не хочу ничего знать про это железо!
Я буду рисовать в абстрактном двумерном(для удобства) массиве, аля, в матрице!
Вместо пикселей - символы ucs-2(внимание - шрифт консоли не все умеет):
вот моя доска матрица, где я и буду рисовать:
unsigned H = 20 ; /// Высота доски. unsigned W = 30 ; /// Ширина доски. wchar_t C = '.'; /// Символ заполнения. std::vector<std::wstring> scr(H, std::wstring( W, C));
И всё же нужно выбрать способ вывода на железку, которая мой монитор.
Так выбор сделан на консоль, то:
struct Hard { Hard& operator<<(const VScreen& scr) { for( const auto& s : scr.mat) { std::wcout << s << '\n'; } std::wcout << '\n'; return *this; } };
вот такая доска для рисования:
5.
Как писать код.
три способа на вскидку:
1. В один файл.
2. Много файлов *.h и один main.cpp
3. Много файлов *.h + *.cpp + main.cpp
выберу второй, хотя и проект мелковат, но и как бы будет "по взрослому".
Пишем код так, пишем логику, если логика похожа на олимпиадную задачу,
то убираем такой код в общий раздел.
7.
Из чего состоит игра.
Тут получится план на код:
1. Код общий - логически не связан с тетрисом.
2. Код логически связан с тетрисом.
- Падающая фигура.
- Корзина, сама корзина + её содержимое.
- Клавиатура.
- Банеры.
- Игра(главный игровой цикл).
8.
Тесты.
Тесты хороши не только ради тестов, но и автоматом склоняют к лучшему проектированию программы. Чтобы тесты не захламляли основной код, то для них я заведу второй проект.
Заключительный тест - это итоговый релиз.
9.
Релиз.
Это не первый мой тетрис.
По итогу релиз будет выглядеть примерно так:
На самом деле я полностью перепишу код демонстрируемый гифкой выше.
Это было вступление ...
Ссылка | Комментарии [85]
4 мая 2020
Каждый хотел жить среди поремиков, но не каждый мог. Что ж, такова судьба поремечества. Оно не многочислено, но жаждят туда попасть неофиты. У каждого из них сей род отзывается чем-то своим, но понять до конца всю их философию удается далеко не всем.
6 янв 2019
Модерация отключена, поскольку сообщество уже давно не пользуется популярностью, модерация происходит с огромной задержкой и потеряла всякий смысл.
Ссылка | Комментарии [1]
28 окт 2018
Фанат Blender-а из Польши Dariusz Dzwonkowski подготовил серию уроков по созданию аркадной игры "Астероиды" с помощью Verge3D.
Краткое содержание серии:
Часть 1: Моделирование космического корабля:
Часть 2: Создание материалов корабля и эффект свечения (Outline):
Часть 3: Анимация звёздного неба:
Часть 3.5: Анимируем те же звёзды, но теперь с паззлами:
Часть 4: Управление с помощью клавиатуры:
Часть 5: Моделирование светящихся астероидов:
Часть 6: Процедурное управление движением астероидов с помощью паззлов:
P.S. Уроки будут очень полезны людям, которые плохо воспринимают английский на слух: все рабочие процессы описываются с помощью коротких текстовых надписей и предельно понятны.
23 сен 2017
Видео-обзор некоторых нововведений Blender 2.8, касающихся нового рилтайм рендера для вьюпорта:
Планируется много-много всего интересного:
- блум, блур, DoF, тонемаппинг, новый АО
- кубемапы и скрин-спейс-рефлекшены
- мягкие тени
- IBL
- SSS
- волюметрики
- и многое другое
Больше информации по всем новым (и доработанным старым) фичам на официальном сайте bledner'а.
Ссылка | Комментарии [7]
17 сен 2017
Проект на github содержит конфигурации рабочих столов которые повторяют интерфейс последних версий delphi.
В комплекте два рабочих стола (для отладки и без оного) которые повторяют расположение окон ide delphi последних версий.
Импортируем и наслаждаемся =)
30 июня 2017
Итак, вот он новый релиз отечественного WebGL фреймворка Blend4Web 17.06. В этот раз разработчики преподнесли сюрприз в виде доступа к AR-технологии. Что такое AR? Это Дополненная Реальность, т.е. возможность симбиоза компьютерной картинки с реальным изображением, передаваемым видеокамерой. К примеру, известная игра Pokemon Go использует тот же принцип. Правда, для браузерных приложений AR пока слишком крут, и я реально еще не видел нормального инструментария в этой области.
Разработчики движка подготовили специальное демо, где этот самый режим AR представлен во всей красе (метка здесь). Особенно здорово, что можно изучить исходники демки и, возможно, создать что-то свое. По традиции, все исходники доступны в SDK.
А это пример работы AR в Blend4Web.
Еще одна очень важная особенность релиза — это поддержка ограничителей Blender. Фишка в том, что Blender позволяет задавать движение объектов, используя специальные правила —ограничители. Например, можно скопировать данные о вращении с одного объекта на другой или заставить один объект «следить» за целью. Пока только четыре ограничителя Blender доступны для использования: Copy Location, Copy Rotation, Copy Transforms и Track To.
Есть небольшая демонстрация, где представлена работа ограничителя Copy Rotation. Именно он заставляет колесики механизма вращаться в нужных направлениях, в зависимости от движения рукояти. Обратите внимания, что здесь не используется физика, а только эксплуатируется возможность ограничителя Blender.
Также в новой версии появился экспериментальный алгоритм освещения, который задействуется при использовании материалов рендера Cycles. Это позволяет более полно использовать возможности нод BSDF Glossy and BSDF Diffuse.
Более полно о релизе можно узнать здесь.
12 мая 2017
Неформальная встреча игровых разработчиков и всех причастных в Санкт-Петербурге от сообщества GameBeets!
В программе:
- панельная дискуссия на тему: Развенчание мифов игрового дизайна
- выпить в хорошей компании
- полезный нетворкинг
- шоукейс инди проектов
- розыгрыш ништяков!
Оставляйте в комментариях к этому посту вопросы, которые будут заданы в рамках панельной дискуссии.
На митапе соберутся представители компаний — разработчиков игр, независимые разработчики и те, кто хочет делать игры, но пока не понял как. Следите за новостями и раскрытием деталей программы! Мы приготовили для вас много интересного и полезного, в один пост не поместить!
Если вы хотите показать свою игру или прочитать доклад, скидывайте информацию о себе и своём проекте/докладе на нашу почту:
❗Ждем всех причастных 25 мая в 19:30 в клубе "Башни" по адресу: С-Пб, Обводного Канала наб. 74А!
❗Регистрируемся на TimePad: https://gamebeets.timepad.ru/event/490246/
Митап проходит при активной поддержке МанжетыГД и Lazy Bear Games.
30 ноя 2016
Случилось то, о чем просили многие. В новой версии Blend4Web научился понимать ноды Cycles, а также предоставил API для создания FPS. Вобщем, смотрим видеообзор:
24 ноя 2016
Наконец-то добрался до разбора основных классов, тут о них и расскажу. Кстати, информация ниже в большинстве своем является моими не особо опытными догадками и размышлениями, поэтому дополнения и поправки приветствуются в комментариях.
Так-же у каждого сервера есть свой уникальный id (индекс в глобальном массиве серверов). Используются id, например, при загрузке данных из архивов (каждый файл внутри архива содержит id), чтобы понять, метод Unmarshal какого сервера нужно вызвать чтобы загрузить этот файл.
Привожу список некоторых серверов. Имена у большинства взяты из бинарника:
while(true) { g_pMasterServer->Update(); g_pTimer->AdjustTime(); }
А так же в разборе наследования классов мне помогает компилятор, которым пользовались разработчики. Он вежливо переопределяет таблицу виртуальных методов класса в конструкторе и деструкторе этого экземляра класса, а так как деструкторы/конструкторы класса почти всегда вызывают соответствующие конструкторы/деструкторы своих родителей, тем самым можно извлечь древо наследования (часто мешает inline подстановка).
Кроме того компилятор очень аккуратно расставляет указатель на таблицу виртуальных методов сразу после полезных данных структуры экземпляра класса, из чего мы можем делать вывод о размере этой структуры данных (работает только для самых корневых (не детей, а от которых наследуются) классов).
Так же если он видит вложенную структуру, то перед там как поработать с ней, любезно высчитывает указатель на эту структуру, а потом уже начинает работать с ней (из этого можно судить о наличии этих вложенных структур и их смещение относительно основных).
Конечно у него есть и минусы, но я его прощаю, ведь они присущи всем компиляторам с флагом -O2, а именно сплошь и рядом подстановка функций (inline), что заставляет разбирать похожие места кода лишь чтобы убедиться что они делают то-же самое.
Ссылка | Комментарии [4]
28 окт 2016
В последнее время разработчики особо не радуют какими-либо крутыми фичами, а больше усилий прилагают на оптимизацию системы. Нужно сказать, что это у них неплохо получается. В новой версии движка также была выполнена внутренняя оптимизация кода, в частности для алгоритма отсечения невидимых поверхностей и формата хранения геометрии.
Однако в этот раз есть кое-что интересное. Был добавлен полноценный механизм поиска пути по алгоритму A* с использованием навигационных мешей. Причем меши можно автоматически создавать в Blender, с помощью встроенной утилиты или же делать вручную. Как это работает, можно увидеть в специальном демо, а также изучить внутренний код.
Еще была добавлена логическая нода Set Camera Move Style, позволяющая контролировать поведение камеры. О создании этого узла буквально молились разработчики приложений, которые используют систему визуального программирования. Дело в том, что в Blend4Web давно встроенны несколько различных пресетов поведения камеры, которые можно выбрать на этапе проектирования сцены. И это, конечно же, значительно упрощает жизнь разработчиков. Но вот корректировать их работу было возможно только из JavaScript. Теперь это доступно и для нодового редактора логики.
Чтобы понять получаемые преимущества использования новой ноды - запустите следующее демо.
Более подробно о других интересных фичах нового релиза ищите на официальном сайте разработчиков.
24 окт 2016
Читатель, прости что информация подается разрозненно, я не любитель писать.
Пишу я сюда больше в ожидании помощи. Если кто что знает полезного по теме, прошу, напишите в комментариях. Буду рад если укажите на ошибки, особенно в запятых и терминологии (некоторые названия я натягивал и придумывал).
// установить что мы будем распаковывать данные в память vu1 с шагом (аналог аргумента stride в функциях opengl, только работает наоборот). // например, у нас XYZW|XYZW|RGB|RGB|UV|UV, а в памяти vu1 мы хотим построить XYZW|RGB|UV|XYZW|RGB|UV. Stcycl wl=01 cl=03 // то что это текстурные координаты я определил по target адресу, и да, не бойтесь что адреса такие маленькие, ведь vu1 работает с векторами 4х4float. vif unpack [ uv2]: 65 elements: 51 components: 2 type: 16 target: 001 sign: true addr: true size: 000144 Stmod mode=[pos] (1) // туфта для управления шиной Strow proc command // xyzw, где w - это флаги для программы, исполняющейся на vu1, например, использовать ли вертекс для построение треугольника с предыдущими 2мя, или только запомнить его, и не строить треугольника vif unpack [xyzw]: 6d elements: 51 components: 4 type: 16 target: 003 sign: true addr: true size: 000288 Stmod mode= pos (0) // rgba per vertex vif unpack [rgba]: 6e elements: 51 components: 4 type: 08 target: 002 sign: false addr: true size: 000144 // выключаем strip, теперь данные нам нужны подряд, друг за другом Stcycl wl=01 cl=01 // загружаем разные флаги, например тут могут быть перечислены веса для jointов vif unpack [vmta]: 6c elements: 01 components: 4 type: 32 target: 000 sign: true addr: true size: 000010 vif unpack [meta]: 6c elements: 01 components: 4 type: 32 target: 0f4 sign: true addr: true size: 000010 nop // говорим vu1 процессору, что он может начать обрабатывать наши данные Mscall proc command
Для парсинга таких структур приходится эмулировать обработку пакетов в памяти. По хорошему надо отреверсить код, который исполняется на vu1, но до этого руки не дошли (точнее дошли, но сломались об непонятную магию и 5 одновременно исполняющихся инструкций с иногда работающей синхронизацией), тогда прояснятся магические флаги, которые передаются в пакетах (хотя сейчас ясно что там передается наличие тех или иных данных о вертексах (позиция/цвет/текстура/нормаль) и их джойнты. Таких батчей может быть несколько, и они не могут быть больше, чем есть места у vu1. А в нем, кстати, одновременно должно поместиться 3 таких батча, что позволяет оптимизировать работу в 3 потока (1 - "ee core" считает анимацию и всякую лабуду, 2 - gif шина передает данные в памать vu1, 3 - vu1 обрабатывает данные в памяти и отправляет их в gs через path1).
В нашем батче можно заметить что у xyzw пакета стоит размер 16 и флаг sign - что в сумме дает нам int16, эта практика распространяется на всю игру. Я не могу поверить что хватает 2х байтов на координату для такой более-менее графики.
Насчет per vertex rgba можно сказать что он используется везде. На всех статичных объектах запечены тени, из этого кстати следует что одинаковые объекты на сцене, типа камней/дверей/стен будут сохранены в памяти и переданы по шине очень много раз, при этом отличаться они будут только цветом вертексов.
Батчи пакетов группируются по материалу в массив, потом еще по корневому joint в массив - на выходе получаем меш.
Ах да, названия не было, и я позаимствовал идею у openLara.
Ссылка | Комментарии [11]