(бухай): программируй
148 subscribers
465 photos
96 videos
3 files
65 links
Мысли, дегустация и код
Download Telegram
Но это не окончательное решение проблемы...
Я могу загрузить в память все значения пикселей, но не могу загрузить все значения цветов.
Дело в том, что цвета для режима Multicolor Hires определяются в области памяти, которая отвечает за основной экран компьютера. И это ломает всю программу.

То есть получается так:
1. Программа загружается
2. Значения цветов помещаются на основной экран, и видеочип воспринимает их как символы.
3. Программа ломается видимо на каком-то прерывании.

Самый оптимальный вариант - это подгружать значения цветов с дискеты (или образа дискеты). То есть порядок действий будет такой:
1. Загружаем основную программу.
2. Подгружаем с дискеты значения цветов на основной экран.
3. Ничего не ломается.
4. ...
5. Profit

Надеюсь, это сработает
1
Наконец-то разобрался, как подгружать данные с дискеты.
Для этого используются функции KERNAL (местная операционная система):
SETLFS (устанавливает логический номер файла и логический номер устройства);
SETNAM (устанавливает длину и адрес имени файла)
LOAD (загружает данные из файла).

Все параметры, которые принимают функции - стандартные, только имя файла будет отличаться. Поэтому можно создать триггер, который будет подгружать данные с дискеты (например, триггер смены уровня).
1
Вот весь код, данные названия файла и то, как это выглядит на дискете.
Эта конкретная программа подгружает в память данные цветов для экрана (и при этом ничего не ломается)
1
This media is not supported in your browser
VIEW IN TELEGRAM
А вот как теперь выглядит запуск игры.
Довольно забавно)
1
Ну и немного перерисовал экран. Художник из меня конечно такой себе, поэтому все просто. Но теперь хотя бы выглядит не ужасно.

Проблема одна - из-за прерывания между hires и text mode, последняя линия изображения отрисовывается криво и с артефактами. Буду думать, как решить эту проблему.

А ну и попробовал добавить текст с показателями здоровья/брони/параметров и т.д. Пока что кажется, что надо текст поменять (возможно сократить каждую фразу до двух символов, что позволит расширить текстовую зону).
2🔥2
Накидал "немного" планов на будущий год )
Я вообще не могу представить, сколько еще займёт разработка.
Начал я все это делать в конце ноября, и первый месяц тупо раздумывал, как лучше сделать графический движок.

Сейчас это позади, но теперь самые сложные вещи - это объекты на уровнях, ролевая система и звуки.

Надеюсь, что за следующие полгода я решу большинство этих проблем
1
С Новым Годом, ребята:)
🔥4🍾1
Сегодня я добавил спрайты и как же я с ними намучился=)

Оказалось, что зона в памяти с $1000 по $1fff занята зеркалом Character ROM, и видеочип не может считать спрайты из этой области. А это было идеальное место под них.
Видеочип смотрит всего на 16 Кб памяти одновременно, и под спрайты места не остается.

Поэтому сперва я принял решение изменить область памяти (VIC Bank), на которую смотрит видеочип (перенести туда, где Character ROM не зеркалится). Это слабо помогло, потому что пришлось бы учесть еще кучу возможных параметров: создать новые символы, перенести область, откуда берутся цвета для hires bitmap и при каждом прерывании менять не только параметры экрана, но и VIC Bank. В общем, куча лишних действий, да и всю программу пришлось бы перелопатить.

Поэтому я поступил иначе:
Теперь все спрайты лежат вообще в другом месте памяти, но подгружаются в область видимости видеочипа в процессе. Оказалось, что это довольно быстро и совсем не заметно (с учетом, что игра у меня совсем не динамическая)
4
This media is not supported in your browser
VIEW IN TELEGRAM
А еще для каждого спрайта можно менять цвета.
Один программный спрайт состоит из четырех аппаратных, поэтому два цвета на весь спрайт будут всегда одинаковыми. Но третий цвет можно менять для каждого из 4-х аппаратных спрайтов.

А так как на карте может быть много объектов одного спрайта, а на экране будет отображаться только 1 программный спрайт (в ближайшем от игрока блоке), то и цвета для всех объектов спрайта могут быть разными (что задается в данных карты)
2
Ну и немного того, как все в очередной раз ломалось из-за смены VIC Bank. Здесь например цвета для экрана берутся из части той-же зоны, где находится сам экран.
Получается небольшая рекурсия
1
Назрел вопрос на будущее.

Раз я собираюсь делать много уровней, каждый со своими триггерами и состояниями, то все это дело надо как-то сохранять, чтобы не пришлось с каждым запуском игры перепроходить все заново.

Второй вопрос - делать игру линейной или с небольшим открытым миром, чтобы можно было переходить между уровнями в любом порядке?

И пока что я вижу такие варианты:
1. Самый сложный. Так как каждый новый уровень будет подгружаться с дискеты, то его состояние всегда будет одинаковым. Придется где-то хранить все возможные состояния триггеров и самого уровня. Это, как по мне, сделать ну очень сложно. Поэтому такой вариант пока что можно отбросить.

2. Средний по сложности. Сделать хаб, в который игрок будет возвращаться после каждого уровня. Тут придется хранить данные только одного уровня, что немного проще. Можно выделить память чисто для хранения такой информации.

3. Сделать псевдооткрытый мир. В таком случае игрок будеь возвращаться в хаб, но каждый раз это будет новый видоизмененный хаб (новый уровень). Минус такого подхода, что придется тратить много памяти на лишние уровни.

4. Самый простой вариант - сделать чисто линейную игру без возможности возврата на предыдущие уровни. В принципе, для моей задумки и такое подходит.
1
Насчет сохранений проще.

Есть возможность сохранять данные на дискету. То есть я могу теоретически записать основные параметры и считывать их при загрузке игры.
Как это будет работать на практике, пока что непонятно.

Второй вариант - использовать пароли прямо как в старых играх на денди, да:)
1
Ну что ж, я починил артефакт между графической и текстовой зонами.
Раньше в прерывании я считывал значения регистров и командами AND и ORA включал или выключал нужные биты.

lda $d011
ora #%00100000
sta $d011
lda $d016
ora #%00010000
sta $d016
lda $d018
ora #%00001000
sta $d018

Теперь я просто беру нужное значение и сразу кладу его в регистр:
        lda     #$3b
sta $d011
lda #$d8
sta $d016
lda #$1d
sta $d018

Занимает куда меньше циклов, и видимо из-за этого процессор успевает отработать прерывание до выхода за пределы линии. Докинул недостающие циклы NOP-ами, и все заработало
2👍2
Я тут подумал, что можно использовать вкладки для текстовой зоны!
Это позволит запихнуть больше информации на экран.

Нарисовал то, что я примерно хочу видеть в итоге:
1. Слева будет компас, который показывает направление движения (вполне себе замена для мини-карты). Правда, мне не очень нравится, как он выглядит, буду перерисовывать.
2. Справа - поле Player с количеством здоровья, брони и ключами, которые есть у игрока.
3. Посередине будут меняться 4 вкладки, при этом вкладка Fight будет появляться, если игрок вступил в бой.

Конечно, для этих вкладок надо будет выделять память:
64 байта для всех позиций компаса (4*4*4)
520 байт для всех четырех вкладок (26*5*4)
Многовато, но зато экран будет информативным
🔥32
Ну, теперь это уже стало больше похоже на игру.
Правда зачем нам ролевая система и игровые механики, если теперь буковки рисуются=)
2
This media is not supported in your browser
VIEW IN TELEGRAM
Ну и видео.
Стрелка правильно показывает направление (что можно использовать в подсказках), а под конец можно увидеть, как появляется ключ, когда я беру его из шкафа.
Там же можно увидеть, что вывод текста пока что не работает, как собственно и переключение вкладок. Но уже что-то
2👍2🤯1
Media is too big
VIEW IN TELEGRAM
Видеоотчет за последние несколько недель:)
2