(бухай): программируй
148 subscribers
465 photos
96 videos
3 files
65 links
Мысли, дегустация и код
Download Telegram
Ну и самое главное - у меня осталось еще куча памяти.
Вся игра вместе с кодом и данными занимает 18 385 байт.
Если посчитать доступное место без памяти под Kernal ROM (местный BIOS), то выходит 3529 байт с $1286 по $204f и 27647 байт с $6400 по $cfff.
А это в сумме целых 31176 байт!
Начал рисовать персонажей)
Но сразу же возникла проблема. Из-за того, что все персонажи у меня помещаются в 4 спрайта, то два цвета на каждый спрайт должны быть одинаковыми.
Но можно указать и третий цвет - уникальный для каждого спрайта.

Вот и получается, что я могу:
— сделать высокого персонажа и указать всего 3 цвета (коричневый и телесный - общие, синий - уникальный для каждого спрайта). И у меня не получится, например, сделать штаны другого цвета.
— нарисовать персонажа-карлика (чтобы вся одежда поместилась в два квадрата) и добавить еще один цвет😂

В общем, надо потренироваться рисовать все так, чтобы можно было использовать хотя бы 4 цвета из 6 возможных=)
Что ж...
Я думал, это будет более устрашающе😅

Но, к сожалению, при текущем подходе можно сделать только так.

Конечно, можно увеличить количество спрайтов, например, до 6.
Сейчас планируется 8 изображений оружия, 6 изображений патронов, аптечка и броня. А это уже 4 Кб.
Прибавляем сюда спрайты на уровне - 8 изображений - 2 Кб.

Очень уж затратны эти спрайты в плане памяти.
🔥3👏1
Так, ну я решил проблему со спрайтами врагов.
Вспомнил, что спрайты в Commodore можно увеличивать в два раза на аппаратном уровне. То есть сами пиксели остаются теми же, но изображение становится больше.

Я включил оставшиеся 4 аппаратных спрайта, выставил им новые координаты и увеличил. Таким образом все объекты на уровне теперь будут маленького размера, а вот враги будут более крупными и устрашающими (если можно так сказать).

Теперь остается надеяться, что мне больше не понадобятся аппаратные спрайты для чего-либо еще, а то придется писать функции для их мультиплексинга (размножения)...
🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Я так и не нашел софт, который позволял бы правильно выставить цвета для каждого знакоместа при рисовании в режиме Multicolor Bitmap.
Поэтому приходится все делать самому.

Начал писать программу на Python.
На данный момент она позволяет:
— выбрать для каждого знакоместа три цвета (желтый квадрат можно перемещать по холсту и выставлять цвета). Потом добавлю отдельные квадраты, в которых будут отображаться цвета в текущем знакоместе.
— рисовать попиксельно (потом планирую добавить отрисовку линиями, квадратами и т.д.)
— выключать/отключать сетку и квадрат для выбора цвета.
— увеличивать/уменьшать холст и перемещать его.

Ну и конечно нужно будет написать скрипт для сохранения изображения в формат ассемблера
🔥2❤‍🔥1
В общем, основные функции редактора уже готовы.
Можно выбрать для каждого знакоместа три цвета (при этом можно копировать цвета из одного знакоместа в другой). Каждый цвет выставляется левой, правой и средней кнопками мыши.

Ну и написал функции для сохранения изображения в JSON, загрузки из JSON и импорта в формат ассемблера.
И вроде все работает.

Не скажу, что рисовать по одному пикселю очень удобно, но зато не приходится вручную выставлять цвета для 2000 байт и пиксели для 8000 байт=)
Возможно потом напишу функции для отрисовки линями, квадратами и для заливки
🔥3❤‍🔥1
Вот это очень хорошо)
Были идеи что-то такое сделать, но я так и не постиг процессорную магию
❤‍🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Начал добавлять в игру оружие.
Пока готовы только три штуки: газовый ключ, пистолет и нейлер.
Если оружие недоступно, то отрисовывется его силуэт. А если игрок подобрал оружие, то иконка становится цветной.
Выбирать оружие можно только в бою, и при этом окантовка иконки меняет цвет (а в память загружаются параметры нового оружия).

Ну и из мелочей:
Полностью дописал скрипт для конвертации карты из Tiled. Теперь он сохраняет не только триггеры и саму карту, но и спрайты

Разработка стала немного нестабильной.
Из-за того, что все сейчас связано друг с другом: оружие, битвы, враги и т.д., то приходится одновременно писать все везде и сразу=)
🔥4❤‍🔥1
Кошка решила проверить, как дела с игрой :)
❤‍🔥6👎1
Решил добавить вот такие кнопки в левой части экрана. Вот они, сверху вниз:
— Первые четыре: атака, защита, бегство и ничегонеделание (по поводу последней еще думаю);
— Следующие две: аптечка и броня (принять внутривенно);
— Две последние: сохранить и загрузить игру.

Но я хочу об одной интересной штуке рассказать. Для этих кнопок я использовал переменную их состояния. Сперва я хотел сделать 5 кнопок, но это оказалось не очень удобно.
Сейчас код выглядит вот так:
@check_key_down
cmp #83
bne @check_key_up
clc
lda fight_choose_action
adc #32
sta fight_choose_action
jmp @end
@check_key_up
cmp #87
bne @check_key_use
sec
lda fight_choose_action
sbc #32
sta fight_choose_action
jmp @end

То есть при переключении кнопок я просто прибавляю или вычитаю 32 из значения переменной (и при пересечении границы байта в 255 она обнуляется). Если поделить 256 на 32, то получится 8 (кнопок). И при этом мне ничего не надо сравнивать (хорошо... сейчас не надо).

Такую штуку я использовал для поворота игрока, только там я прибавлял и вычитал 64 (256/64 = 4 стороны света).

Более того, это используется повсеместно. Например в Doom угол поворота игрока зашит в переменную размером 1 байт (так называемый byte angle), где привычные нам 360 градусов представлены в виде однобайтовой переменной (от 0 до 255).
🔥4❤‍🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Полдня переписывал функции выбора оружия (и отрисовки селектора). Раньше это была куча функций для каждого оружия, сейчас написал универсальные (правда пришлось добавить несколько таблиц с указателями и использовать много самомодифицирующегося кода).

Еще написал функции для переключения кнопок в левой части (переключаются последовательно с помощью Q и E). Кнопка выбирается пробелом (но дальнейший функционал еще конечно не описан).

Но осталась одна большая проблема.
Надо как-то иначе считывать клавиатуру. Сейчас за это отвечают системные функции SCNKEY и GETIN. Но, если быстро нажимать на кнопки, то они как-будто бы помещаются в очередь. В моем случае это критично, потому что процесс рендеринга занимает довольно много времени, и за это время в очередь можно поместить несколько действий, которые выполнятся по завершении отрисовки.
Это, конечно, портит впечатление. И на видео заметно, как в одном месте я сам запутался в управлении.
🔥4❤‍🔥1
Неделю не занимался игрой, но время пришло...
Я все пытаюсь отгородить себя как-то от написания ролевой системы, потому что до сих пор не понимаю, что с ней делать.
Поэтому я решил оптимизировать уже написанный код. И первыми в очереди оказались функции выбора оружия.
До этого я действовал максимально тупо: проверял, какая из кнопок клавиатуры (от 1 до 8) нажата, и под каждую кнопку была отдельная функция:
; ++++++++++ CHECK FOR WEAPON CHANGES KEY PRESSES ++++++++++
check_change_weapons_keys
lda key_pressed
bne @check_wrench
jmp @end
; проверка кнопки "1"
@check_wrench
cmp #49
bne @check_pistol
; если ключ доступен
lda weapons_avaliable
beq @check_pistol

lda curr_weapon_number
beq @check_pistol ; если оружие != ключ
ldy #$ce ; убрать текущее оружие
jsr choose_weapon_draw
lda #0
sta curr_weapon_number
jsr select_weapon_data ; выбрать ключ
ldy #$cd
jsr choose_weapon_draw ; нарисовать селектор ключа
jmp @end
@check_pistol
cmp #50
bne @check_nailer
; если пистолет доступен
lda weapons_avaliable+1
beq @check_nailer
lda curr_weapon_number
cmp #1
beq @check_nailer ; если оружие != пистолет
ldy #$ce
jsr choose_weapon_draw
lda #1
sta curr_weapon_number
jsr select_weapon_data
ldy #$cd
jsr choose_weapon_draw
jmp @end

И так далее, и так далее. И это действительно было очень тупо.
Но сейчас я немного оптимизировал код:
check_change_weapons_keys_new
lda key_pressed
sec
sbc #49 ; кнопка "1" = 49 в десятичной
; если ни одна из кнопок "1" - "7" не нажата
cmp #7
bcs @end
tax
stx $05 ; временная переменная для регистра X
lda weapons_avaliable,x ; если оружие доступно
beq @end
lda curr_weapon_number ; если новое оружие != текущее оружие
cmp $05
beq @end
ldy #$ce ; убрать текущее оружие
jsr choose_weapon_draw
ldx $05
stx curr_weapon_number ; переместить данные нового оружия в память
jsr select_weapon_data
ldy #$cd ; нарисовать селектор нового оружия
ldx $05
jsr choose_weapon_draw
@end
rts

И это вся функция.

Дело в том, что кнопки от 1 до 8 имеют кодировку от 49 до 57. И остается только вычесть из нажатой кнопки 49. Получится цифра от 0 до 7.
Потом надо проверить, выходит ли за границы 7 эта цифра (иначе, нажата другая кнопка).
Потом проверяем, доступно ли оружие и не хотим ли мы выбрать то же оружие, что держим в руках.

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

И вроде выглядит все равно криво (и я уверен, что это можно оптимизировать), но памяти это сэкономило немало.
🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
И снова не ролевая система=)

Написал функции для аптечки и брони. Ничего сложного: если предмет есть, то выводится сообщение об его использовании и вычитается 1. Ну и в инвентаре количество меняется.
Если нет, то выводится сообщение об его отсутствии.
Правда пока что аптечки и куски брони ничего не лечат и не чинят. Все это в будущем, когда бои будут готовы.

Пришлось помучиться с выбором игровых кнопок. Раньше кнопка выбиралась пробелом. Но почему-то оказалось, что всю клавиатуру стандартные функции считывают как just pressed (одно нажатие), а именно пробел - как просто pressed (непрерывное нажатие).
Из-за этого аптечки съедались моментально, и я долго не мог понять, в чем дело. Когда перекинул выбор игровой кнопки на Enter, все заработало.
🔥5
Forwarded from ZX Spectrum Art Daily
4.26 | 2023 | bsc

oops

👤 Grongy

View on zxart.ee
👏3😁1
А что же с игрой?
А пока ничего😔
Последнее время не идёт особо, видимо надо передохнуть немного. Возвращаюсь к коду раз в неделю, делаю какую-то мелочь и забиваю ещё на 7 дней.
Останавливает то, что надо ролевую систему придумывать, и я не знаю, с какого конца к ней подступиться.

Но без дела пытаюсь не сидеть. Начал внезапно для себя изучать новый язык программирования - Gо. Хотел что-то похожее на С++, но не С++ 😅
И думаю все таки написать нормальный редактор графики для коммодора на нем. Все таки питоновский вариант "на коленке" даже выкладывать куда-то стыдно, да и тормозит он.
👍1😐1🤗1