Найти в Дзене
Поддержите автораПеревод на любую сумму
Закреплено автором
ZDG
Навигатор по каналу
2690 · 4 года назад
Генетическая Мона: теперь в OpenGL
В процессе освоения OpenGL-функциямй в Rust родился побочный квест. У меня есть старый проект Генетической Моны Лизы, который я тут неоднократно описывал. Вот последняя публикация со ссылками на предыдущие: Рисование там делается с помощью цветных треугольников, которые растеризуются вручную. Но массив цветных треугольников просто создан для рендеринга в OpenGL, и это бы существенно ускорило работу алгоритма. Я, однако, медлил с доработками, пока случайно не наткнулся на более примитивный вариант рисования...
1 день назад
Точка, точка, два крючочка, или хэнохэномохэдзи
Намедни, играя в бесподобную японскую игру Okami, вспомнил один забавный факт. Когда NPC в игре находится слишком далеко, у него над головой появляется иконка, которая символизирует его настроение или просто обозначает его личность. В некоторых случаях она выглядит так: Это японское народное изображение человеческой рожицы, в точности как у нас: Точка, точка, два крючочка, Носик, ротик, оборотик, Палка, палка, огуречик, Вот...
1 неделю назад
Разработка игры RDS на языке Rust: Текстуры в SDL2
В прошлом выпуске я одолел загрузку изображения в формате PNG: Теперь игровые объекты можно рисовать не квадратиками, а настоящими картинками. Растровое изображение это некий массив байтов, и в SDL2 есть два способа работы с ним. Поверхности, хотя и позволяют манипулировать данными напрямую, оказываются очень медленными в самом банальном случае – когда необходимо рисовать картинки с прозрачностью. При наложении двух пикселов друг на друга нужно вычислить новый цвет пиксела, который образуется из двух исходных цветов с учётом их прозрачности...
1 неделю назад
Загрузка PNG-изображения для игры RDS на языке Rust
В прошлой части я овладел техникой распаковки формата DEFLATE: Эта техника понадобится для загрузки изображений в формате PNG, которую буду описывать здесь. Файл PNG устроен просто: он состоит из блоков, где у каждого блока есть длина и тип. Если мы знаем тип блока и умеем/хотим его обрабатывать, то обрабатываем, если не умеем/не хотим, то просто пропускаем. Поэтому задача в данном случае простая: нужно всего лишь распаковать блоки определённого типа, а остальные нас не интересуют. Для игры можно даже подготовить оптимизированные изображения, выкинув из них все ненужные блоки...
4 недели назад
zlib.decompress() для игры RDS на Rust
Я немного забуксовал в написании игры RDS, так как заимел довольно дерзкие планы на будущее. Во-первых, я хочу графику наконец сделать с привлечением OpenGL, ведь надо когда-то начинать. Но для OpenGL нужны текстуры с альфа-каналом, а для текстур с альфа-каналом нужны изображения в формате PNG, а для изображений в формате PNG нужно подключать зависимость SDL2_image. Помню, в прошлый раз что-то там не завелось, а в этот раз и проверять не стал. Вместо этого я буду делать свою поддержку PNG, потому что кроме чтения этого формата мне больше ничего не требуется...
1 месяц назад
Язык программирования Rust: В чём твоя проблема? Часть 2
В предыдущей части обсуждался доступ к разным элементам коллекции одновременно. В этой рассмотрим случай вложенных ссылок. Возьму пример из разрабатываемой игры RDS. Есть игровой объект, который содержит какие-то данные. Допустим: Есть поведение объекта, которое как-то обрабатывает данные объекта. Допустим: Но кроме того, поведение может иметь и обрабатывать собственные данные. Например, объект должен пройти 5 шагов. Поведение в каждом шаге игрового цикла изменяет координату объекта (это пройденный шаг) и увеличивает собственный счётчик шагов...
1 месяц назад
Разработка игры RDS на языке Rust: Замена объектов, поворот пушки и унижение парашютиста
Предыдущая часть: Буду описывать довольно сложную проблему, поэтому вот сразу картинка того результата, который нас ожидает (а в конце статьи размещу ещё и видео): Чтобы по экрану летали не унылые прямоугольники, я сделал новый тип отображения DrawableListRect, который содержит массив из 5 прямоугольников типа ColorRect: Да, ровно 5, но за актуальное количество отвечает поле cnt, чтобы не возиться с динамическими размерами (это всё равно временное решение на коленке). Прямоугольник ColorRect имеет дополнительное поле color, чтобы можно было делать их разноцветными...
1 месяц назад
Какие из ретро-ужастиков держат марку до сих пор?
Когда-то я увлекался просмотрами фильмов ужасов, и даже был в некотором роде экспертом по ним. Всё это происходило ещё в начале 90-х, когда чуть ли не на каждой улице плодились VHS-видесалоны. Расписание фильмов писалось от руки на тетрадном листке, который вывешивался снаружи. У каждого фильма была краткая характеристика. "Кунгфу", "Супербоевик", "Фантастика", "Комедия" и конечно "Ужасы". Некоторые картины произвели на меня неизгладимое впечатление. Но как это часто бывает, воспоминания могут казаться совсем иными, чем оно есть на самом деле...
3236 читали · 1 месяц назад
Язык программирования Rust: В чём твоя проблема?
В процессе разработки игры Apple я столкнулся с некоторыми проблемами и поэтому написал код определённого типа (я называю его "трусливый код"), чтобы эти проблемы трусливо обойти. Далее я начал разработку игры RDS и решил сначала разобраться с проблемами, что мне частично удалось. Но чем дальше в лес, тем более изворотливым надо быть, чтобы проскочить между жерновами компилятора Rust. Иногда манипуляции заключаются в том, чтобы поменять местами две строчки кода. Представьте, что смысл абсолютно не...
530 читали · 1 месяц назад
Разработка игры RDS на языке Rust: Задачи солвера
В прошлом выпуске были сделаны коллайдер и солвер для обработки столкновений объектов. В этом выпуске остановимся подробнее на солвере. Я буду писать всё, что приходит в голову, и вносить исправления прямо по ходу. Возьмём реальные задачи, которые должен решать солвер. При попадании снаряда по парашютисту, вертолёту, самолёту или бомбе должно начисляться определённое количество очков. То есть солвер, обрабатывая столкновение снаряда и парашютиста, должен где-то там внутри игры увеличить переменную score на 5...
2 месяца назад
Разработка игры RDS на языке Rust: Коллайдер
В предыдущей части была сделана система обработки поведения объектов, которая даже работает: Из краеугольных требований осталось сделать определитель столкновений объектов. Все объекты будут иметь прямоугольную область столкновения. Для данной игры это сойдёт, и переусложнять не будем. Как всё происходит в теории: взяли список объектов, и каждый проверили с каждым. Если их прямоугольники пересекаются, то они столкнулись. Такая проверка не очень хороша, так как требует O(N^2) нахождений пересечений...
2 месяца назад
Разработка игры RDS на языке Rust: Начало
В подготовительных выпусках я разобрался с механизмами хранения игровых объектов: Теперь можно начать делать конкретную игру, я назову её условно RDS. Это ремейк игры Paratrooper 1982 года (на БК-0010 была переделка под названием Diversant). Вкратце, игрок управляет неподвижной пушкой, у которой можно поворачивать ствол. По экрану летают вертолёты, которые сбрасывают парашютистов, и самолёты, которые бросают бомбы. Задача игрока, управляя пушкой, сбивать всё что движется. Если парашютисты приземлятся с любой стороны пушки в количестве более 3-х, то они взорвут пушку и игра закончится...
2 месяца назад