Comments 14
Интересно, спасибо!
Всегда интересовало, как могли реализовать на NES некоторые достаточно сложные вещи. Если можно, объясните, как реализовали эффект «волн», например как в черепашках-ниндзя 3, в момент появления стартового меню. Там ещё голосом что-то выкрикивают, не знаю как написать. Ну и как реализуется логика 3D в этой игре, ведь большинство уровней в трёх измерениях сделано.
Всегда интересовало, как могли реализовать на NES некоторые достаточно сложные вещи. Если можно, объясните, как реализовали эффект «волн», например как в черепашках-ниндзя 3, в момент появления стартового меню. Там ещё голосом что-то выкрикивают, не знаю как написать. Ну и как реализуется логика 3D в этой игре, ведь большинство уровней в трёх измерениях сделано.
Если можно, объясните, как реализовали эффект «волн»
Это эффект изменения позиции скроллинга в середине кадра, про такие будет в следующей части. Картинка рисуется нормальной в экранной странице, а при выводе каждой строки осуществляется смещение чётных строк на X пикселей влево, а нечётных — на X пикселей вправо (это позволяет делать маппер MMC3, который используется в игре). X меняется каждый кадр — получаются волны. Вот этот эффект с наложенными зелёными линиями в тех строках, на которых меняется сдвиг.

Ну и как реализуется логика 3D в этой игре, ведь большинство уровней в трёх измерениях сделано.
Ну, это называется 2,5D — для полноценного третьего измерения не хватает изменения размеров при удалении объектов от наблюдателя. Хотя там море во втором уровне сделано с симуляцией этого эффекта. Для 2,5D особенно делать ничего и не нужно, достаточно при рендере объектов сортировать в порядке от самых дальних к зрителю к самым ближним, см. Алгоритм художника
Продолжайте в том же духе!
Хотелось бы только понять как храниться палитра в памяти, везде написано как то муторно, киньте плз ссыль на нормальное описание палитры (или в статье осветите), а то: храниться по 8 байт каждые из которых формируют младший и старший бит палитры… такое ощущение что везде одно и тоже, либо перевод, либо копипаст…
С гифками вроде всё ок, не много и не мало. Спс за статью!
Хотелось бы только понять как храниться палитра в памяти, везде написано как то муторно, киньте плз ссыль на нормальное описание палитры (или в статье осветите), а то: храниться по 8 байт каждые из которых формируют младший и старший бит палитры… такое ощущение что везде одно и тоже, либо перевод, либо копипаст…
С гифками вроде всё ок, не много и не мало. Спс за статью!
Дык привёл же вроде…
habrahabr.ru/post/348212
dendy.migera.ru/nes/g02.html
Парой предложений понятнее целой статьи не распишешь. Если относительно NES сходу непонятно, сначала попробуйте разобраться с определениями индексированных цветов и палитровой графики.
habrahabr.ru/post/348212
dendy.migera.ru/nes/g02.html
Парой предложений понятнее целой статьи не распишешь. Если относительно NES сходу непонятно, сначала попробуйте разобраться с определениями индексированных цветов и палитровой графики.
Не мигере и англоязычных сайтах смотрел всё равно не понимал, но нашёл старый журнал (в сети в djvu) «Игровые Приставки — Ремонт и Обслуживание», вот там всё нормально расписано с примерами, всё стало ясно, теперь уже когда мигеру читаешь, всё тоже ясно сразу становиться :)
Только остался один непонятный момент, но это я тут почитаю ещё (по ссылке выше habrahabr.ru/post/348212) + поэсперементирую сам: фон закрашиваешся палитрой для первого спрайта (0x3F10), почему так хз, ведь везде пишут что должен закрашивать первым цветом из 0x3F00?
Мой тесткейс:
Я вывожу 960 пустых тайлов (16 байт, все 0), + в область атрибутов страницы пишу 64 нуля, в файле палитры (который гружу в 3F00 состоит из 32 байт) когда меняю первый байт — результата нуль, когда меняю байт 0x10 — то меняется фон (но это палитра спрайта!?)… Можете не отвечать сам дойду как нибудь, а так заранее спасибо! :)
Только остался один непонятный момент, но это я тут почитаю ещё (по ссылке выше habrahabr.ru/post/348212) + поэсперементирую сам: фон закрашиваешся палитрой для первого спрайта (0x3F10), почему так хз, ведь везде пишут что должен закрашивать первым цветом из 0x3F00?
Мой тесткейс:
Я вывожу 960 пустых тайлов (16 байт, все 0), + в область атрибутов страницы пишу 64 нуля, в файле палитры (который гружу в 3F00 состоит из 32 байт) когда меняю первый байт — результата нуль, когда меняю байт 0x10 — то меняется фон (но это палитра спрайта!?)… Можете не отвечать сам дойду как нибудь, а так заранее спасибо! :)
wiki.nesdev.com/w/index.php/PPU_palettes
Нулевой цвет зеркалируется для обеих палитр, т.е. если вы в цикле записываете 32 байта в две палитры, то вы сначала пишете нужный цвет в палитру фона, а потом записью в 0x3F10 его затираете. И наоборот, записью в 0x3F10 вы меняете цвет в 0x3F00.
Так что при записи палитры спрайтов нужно отдельные байты записывать, пропуская адреса, которые зеркалируются.
Addresses $3F10/$3F14/$3F18/$3F1C are mirrors of $3F00/$3F04/$3F08/$3F0C. Note that this goes for writing as well as reading
Нулевой цвет зеркалируется для обеих палитр, т.е. если вы в цикле записываете 32 байта в две палитры, то вы сначала пишете нужный цвет в палитру фона, а потом записью в 0x3F10 его затираете. И наоборот, записью в 0x3F10 вы меняете цвет в 0x3F00.
Так что при записи палитры спрайтов нужно отдельные байты записывать, пропуская адреса, которые зеркалируются.
Не то, чтобы она прям таки где-то хранится. Записывается она в PPU по адресам $3F00-$3F1F: первые 16 байт — палитра фона, затем 16 — палитра спрайтов.
Здесь можете почитать подробно. Вообще, там много интересного по денди можно найти, но в некоторых статьях на ресурсе присутствуют довольно обидные ошибки (скорее опечатки).
Здесь можете почитать подробно. Вообще, там много интересного по денди можно найти, но в некоторых статьях на ресурсе присутствуют довольно обидные ошибки (скорее опечатки).
Ага, на dendy.migera.ru отличный справочник для начинающих программировать под Dendy. Я как раз им (наряду с wiki.nesdev.com) пользовался когда делал Unchained Nostalgia.
Надеялся, что меня отпустит после этого, но нет, тянет иногда поковыряться. Есть что-то в низкоуровневом программировании под такие старые архитектуры что-то манящее =)
Надеялся, что меня отпустит после этого, но нет, тянет иногда поковыряться. Есть что-то в низкоуровневом программировании под такие старые архитектуры что-то манящее =)
Большое спасибо за статью. Приятно видеть статьи по такой исключительно гиковской тематике. Это вам не блокчейн, о котором и так везде говорят!
Анимация сменой палитрыЯ так анимацию сделал на дисплее 1602. Символы остаются те же, но сам символ перерисовывается. (Вращение колеса и движение груза) Хотя там по-другому в большинстве случаев и не сделаешь (всего 8 кастомных символов).
Вот это мясо! Отдельное спасибо за скрипты.
Похоже, в те времена суметь со всем этим разобраться и умудриться саму игру сделать интересной — это был подвиг.
Не согласен. Трюки и хитрости программисты графики использовали всегда, просто тогда это были трюки для того, чтобы сделать что-то, не умеет процессор. Позже — трюки, чтобы сделать то, что умеет последняя версия DirectX/OpenGL, а сейчас, чаще — трюки для обхода косяков Unity3D.
Разница в том, что тогда они всё-таки были намного ближе к железу, и у них было меньше возможностей написать код, который работает, но они не знают почему. Ну и тогда разработчик графики мог быть иногда ещё и художником, вот это сейчас уже действительно редкость.
Разница в том, что тогда они всё-таки были намного ближе к железу, и у них было меньше возможностей написать код, который работает, но они не знают почему. Ну и тогда разработчик графики мог быть иногда ещё и художником, вот это сейчас уже действительно редкость.
Sign up to leave a comment.
Устройство спецэффектов для игр под NES. Часть 1