Вход

Просмотр полной версии : Что нужно для написания игр ?



Страницы : 1 [2]

Andrew771
13.08.2013, 09:35
Ну это ты зря так думаешь) Мне некоторые участники конкурса показывают промежуточные результаты)
Мне тоже показать? Я пишу. :)

DJs3000
13.08.2013, 11:27
Мне тоже показать? Я пишу. :)

Если хочешь то можно в личку) Конфиденциальность гарантирую)

drbars
13.08.2013, 11:47
zst, зачем такой обьем экрана отдаешь под мусор?
сделай полноэкранную
Кстати да, можно информацию по очкам и прочему повер игорвого процессав углу держать... или строчкой верх/низ. :)

zx-kit
13.08.2013, 21:52
zst, зачем такой обьем экрана отдаешь под мусор?
сделай полноэкранную
Так по традиции, в играх на ZX 1/3 или 1/4 экрана отводится на различные индикаторы. Это также украшает игру, так как только там можно сделать что-то более-менее в цвете. А остальная часть экрана обычно двухцветная.

На картинке окно размером 22х22 клетки. Можно убрать внешнюю рамку синего цвета толщиной в одну клетку и сделать BORDER синим цветом. Тогда окно игры будет 24х24 клетки, что достаточно много.

jerri
13.08.2013, 23:02
zst, это плохие традиции. смотри на Rick Dangerous и тот же arc of yesod

drbars
13.08.2013, 23:04
или CJ in USA... движок там жесть, диззи курит в сторонке.

zx-kit
15.08.2013, 06:11
zst, это плохие традиции. смотри на Rick Dangerous и тот же arc of yesod
Хорошо, можно сделать так:

jerri
15.08.2013, 09:58
zst, мне нравится, но вот насчет заправки я бы сделал по другому
разметил атрибутами площадку и поставил рядом цистерну.
Пульт мне не нравится :) надпись Future Tank лишняя
Пульт должен быть функциональным.

goodboy
15.08.2013, 10:03
надпись Future Tank лишняя
Пульт должен быть функциональным.

возможно ч/б радар ?
(танки по пикселю)

jerri
15.08.2013, 10:09
zst, как у тебя будут обрабатываться движения танков, полеты снарядов и тп?
могу предложить пару идей.

Alex Rider
15.08.2013, 15:51
Хорошо, можно сделать так:
Спрайт H2 не говорящий ни о чем. Что он подразумевает?

jerri
15.08.2013, 16:21
Alex Rider, Водород же :) топливо для танков. :)

Alex Rider
15.08.2013, 17:07
Водород же
Тогда нижний индекс надобен. Как неудавшийся химик могу гарантировать это. Ну и это же Future Tank - zst, сделай что ли U (уран) или Pu (плутоний), так футурситичнее.

Andrew771
15.08.2013, 17:10
Сообщение от jerri
Водород же
Тогда нижний индекс надобен. Как неудавшийся химик могу гарантировать это. Ну и это же Future Tank - zst, сделай что ли U (уран) или Pu (плутоний), так футурситичнее.
Можь проще понятную картинку, чем надпись?

Alex Rider
15.08.2013, 18:07
Можь проще понятную картинку, чем надпись?
Сделайте спрайт с букой "U" или "Pu" с символом радиации - понятнй будет.

jerri
15.08.2013, 19:09
Сделайте спрайт с букой "U" или "Pu" с символом радиации - понятнй будет.

да да и чтобы взрывалось при попадании :) и всех убивало

zst - стукнись в личку дам пару советов по игрописанию :)

zx-kit
16.08.2013, 05:55
Тогда нижний индекс надобен. Как неудавшийся химик могу гарантировать это. Ну и это же Future Tank - zst, сделай что ли U (уран) или Pu (плутоний), так футурситичнее.
В будущем танки будут ездить на водороде, как завещал великий TERMINATOR. Добывается из H2O
Надо рядом нарисовать баллон и циферку 2 переместить вниз (H2).

---------- Post added at 06:55 ---------- Previous post was at 06:47 ----------


zst, как у тебя будут обрабатываться движения танков, полеты снарядов и тп?
могу предложить пару идей.
Движения будут обрабатываться на клеточном уровне. Каждый танк занимает площадь 3х3 клетки. Внутри этого квадрата он может двигаться по центру вертикально или горизонтально, например, вверх на 8 точек. Как только он захочет сдвинуться еще на 1 точку вверх, потребуется передвижение в следующую клетку окна. Для направления вверх нужно будет проверить 3 клетки над танком на свойство проходимости. Если хотя бы одна из трех клеток непроходимая - танк остановится.

Чтобы снаряд мог определить, что попал во вражеский танк, нужно знать для каждого танка, какие клетки занимает его корпус. Зависит от направления и положения. Может быть 2 или 3 клетки. Предполагается, что снаряд пролетает над гусеницами без повреждений.

zx-kit
18.08.2013, 11:22
zst, мне нравится, но вот насчет заправки я бы сделал по другому
разметил атрибутами площадку и поставил рядом цистерну.
Пульт мне не нравится :) надпись Future Tank лишняя
Пульт должен быть функциональным.
Немного изменил внешний вид (http://www.zx.pk.ru/showpost.php?p=621330&postcount=257). Заправка с дейтерия переделана на водород. Название игры пусть пока остается. Если понадобится, на его место можно будет поставить другой индикатор. Счетчиков времени, жизней и очков пока не предполагается.

jerri
18.08.2013, 12:28
спорно но приемлмо :)
макет давай :)

drbars
18.08.2013, 23:41
Мой алгоритм организации игры никого не заинтересовал? :) Иным способом скорлинг игрового пространства и логику врагов тяжко делать будет.

zx-kit
20.08.2013, 05:58
Мой алгоритм организации игры никого не заинтересовал? :) Иным способом скорлинг игрового пространства и логику врагов тяжко делать будет.
Уточните пожалуйста, еще раз, как вы предлагали. У меня пока в голове должно все уложиться для продолжения работы.

Пока предполагаетсяа такая организация:
Карта фона уровня. Может быть больше окна. Состоит из массива номеров спрайтов размером в 1 клетку (8х8 точек). На карте располагаются стены, проходы, заправки и другие неподвижные объекты.

Из карты уровня копируем в таблицу 1 номера одноклеточных спрайтов фона. В этой таблице будем хранить текущее состояние игрового окна с учетом возможных разрушений объектов. Размер таблицы: 21 строка по 32 клетки.

На основе первоначального состояния таблицы 1 заполняем графикой окно игры. Одноклеточные спрайты располагаются в двух соответствующих областях. BITMAP_1X1 - тут хранится черно-белый рисунок спрайта, по 8 байтов на спрайт. ATTR_1X1 - тут хранятся цвета спрайтов (атрибуты), по одному байту на спрайт.

Для изображения одноклеточных спрайтов на экране возможно будет организован буфер печати спрайтов. Предполагается, что различные подпрограммы в процессе цикла игры могут изменять состояние игрового окна. Например, нужно будет изобразить выстрел, затем стереть следы выстрела, стереть разрушенную стену и т.п. Это может происходить в произвольные моменты относительно положения луча телевизора на экране.

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

Положение подвижных объектов типа танков будут хранится в таблице 2. Размер таблицы: 21 строка по 32 клетки. Каждый танк будет занимать в таблице 9 клеток в виде трех строк по три клетки. В этих клетках будет записан номер танка.

При движении снаряда или танка в новом месте проверяются таблицы 1 и 2 на наличие в этой клетке подвижного или неподвижного объекта. Зная номер одноклеточного спрайта фона или номер танка уже можно будет обрабатывать дальнейшие действия ...

drbars
20.08.2013, 10:01
Представь себе всю карту. Поверх карты у нас квардат - это игровое постранство, т.е. проекция. Левый верхний угол квадрата имеет координаты (word:X,word:Y) - это глобальные координаты в карте. Координаты кажого танка тоже глобальные (word:X,word:Y) и хранятся в списке (массиве). Каждый танк описывается наборов необходимых параметров. У танка есть флаг активности, этот флаг устанавливается если глобальные координаты танка находятся в области проекции.

Вывод игрового постранства осуществляется за счет пересчета глобальных координат танков в экранные. Теперь чтобы сдвинуть игровое пространство меняем его координаты, при этом координаты всех танков пересчитаются автоматически.
А условием для пересчета координат игрового пространства будут координаты такнка игрока.

Все танки стираются и выводятся каждый фрейм. (нужно определить сколько танков мы можем себе позволить выводить).

Теперь отрисовка тайлов иргового пространства. Сдвинулся экран в любую сторону? Т.е. изменились координаты проекции => Отрисовали тайлы с карты.

А проверять границы лабиринта можно построив теневую атрибутную карту тайлов.

--
upd. как бонус... этот алгоритм позволит гоняться за танками, и быстро находить танк врага рядом и игроком. Если тайлы карты сделать 16х16, их можно быстро рисовать стеком. Для синхронизации лучше всего использовать 2 страницы 128ой видеопамяти.

zx-kit
21.08.2013, 19:05
Спасибо. Может статические и динамические объекты размещать на общей копии карты уровня? Лучше сразу предусмотреть, чтобы можно было в окне показывать часть большой глобальной карты. Я предполагаю разместить глобальные карты уровня (уровней) в области с #C000. 16К - это таблица на 64 строки по 256 клеток. Сюда поместятся 3х8=24 фрагментов карты размером с окно (21х32 клетки).

Левую половину таблицы можно использовать для рабочей копии текущего уровня, а в правой половине хранить оригиналы уровней. Таким образом, максимальный размер карты уровня около 3х4 окна (64х128 клеток). Глобальные координаты на карте уровня будут: X от 0 до 63, Y от 0 до 127. Чтобы определить адрес клетки левого верхнего угла окна, через которое видна карта уровня, нужно в старший адрес записать #C0+Y0, а в младший X0, где (X0,Y0) координаты левого верхнего угла окна на карте уровня. Чтобы определить адрес клетки по координатам (X,Y) в окне нужно к старшему адресу окна прибавить Y, а к младшему прибавить X.


upd. как бонус... этот алгоритм позволит гоняться за танками, и быстро находить танк врага рядом и игроком. Если тайлы карты сделать 16х16, их можно быстро рисовать стеком. Для синхронизации лучше всего использовать 2 страницы 128ой видеопамяти.
Предполагаю тайлы размером 8х8 и быстро выводить с использованием указателя стека и буфера печати тайлов. С двумя экранами не все так просто, как кажется.

drbars
21.08.2013, 20:47
Спасибо. Может статические и динамические объекты размещать на общей копии карты уровня?
Статические это сама карта. А динамические массив наборов координат, и других свойств. Храниить можно так:

DB кол-во танков
DW x танка 1
DW y танка 2
ещё что-нибудь
...
DW размеры карты в тайлах
...
данные карты.

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

Тайлы 16х16 - уменьшат размер памяти игровых карт в два раза! Рисовать тайл 16х1 стеком быстрее, т.к. рисуется сразу 2 байта!

Со 128ым режимом, да, свои грабли... Сам делаю под него, за простоту синхронизации приходится жестко расплачиваться всем подряд :)

zx-kit
21.08.2013, 20:50
Тайлы 16х16 - уменьшат размер памяти игровых карт в два раза! Рисовать тайл 16х1 стеком быстрее, т.к. рисуется сразу 2 байта!

Со 128ым режимом, да, свои грабли... Сам делаю под него, за простоту синхронизации приходится жестко расплачиваться всем подряд :)
Так можно организовать буфер печати и загружать туда адрес экрана, адрес спрайта и т.д. И печатать по прерыванию квадратики 8х8.

Если делать 16х16, то будет все квадратное как в BATTLE CITY. А я предлагаю тайлы 8х8 (1 клетка), а танки 24х24 (3х3 клеток) с перемещением на 8 точек за 8 шагов (визуально на 1 точку за шаг). Если тайлы будут 16х16 (2х2 клеток), как определить по карте, что в трех клетках перед танком нет препятствий ?

drbars
21.08.2013, 21:05
Так можно организовать буфер печати и загружать туда адрес экрана, адрес спрайта и т.д. И печатать по прерыванию квадратики 8х8.
8х8 дольше обрабатывать, чем 16х16. Хотя бы потому, что ячеек карты будет в два раза больше. Тут надо эксперементировать, т.к. если захочется чтобы ирговое поле двигалось с кратностью 8 точек, при этом тайлы были бы 16х16... придётся хорошо подумать, и оптимизировать :)

Кстати если игровое пространство будет 32 по горизонтали, сложнее будет с координатами танка что-то придумать чтобы он за край заезжал.

Если бы как раньше, 24. То тут всё просто. Координату танка на экране привязать к правому нижнему углу. Тогда при X=0, Y=0 — танка нет на экране. Увеличивая х,у танк будет выползать из-за границы экрана.

zx-kit
21.08.2013, 21:14
Кстати если игровое пространство будет 32 по горизонтали, сложнее будет с координатами танка что-то придумать чтобы он за край заезжал.

Если бы как раньше, 24. То тут всё просто. Координату танка на экране привязать к правому нижнему углу. Тогда при X=0, Y=0 — танка нет на экране. Увеличивая х,у танк будет выползать из-за границы экрана.
Да без проблем. Заменяем 24 на 32 и все:


...
;---------------------------------------------------------------------------------------------------
12 INC L ; АДРЕС СЛЕДУЮЩЕЙ КЛЕТКИ В СТРОКЕ
INC B ; КООРДИНАТА СЛЕДУЮЩЕЙ КЛЕТКИ
LD A,B ; КЛЕТКУ 2 НАДО ПЕЧАТАТЬ ?
CP 24
JR NC,13F ; ЕСЛИ НЕТ - ПРОПУСКАЕМ
;---------------------------------------------------------------------------------------------------
; ПЕЧАТЬ 2 КЛЕТКИ В 1 СТРОКЕ
LD SP,(SPRITE_ADDR) ; УСТАНАВЛИВАЕМ SP НА АДРЕС СТРОКИ
...

drbars
21.08.2013, 21:58
Когда-то давно, я делал процедуру (http://zx.pk.ru/showthread.php?t=20554) которой можно рисовать спрайт с границами. Довольно компактно, шустро и универсально к координатной плоскости. Посмотри как отсекаются границы экрана.

Чтобы делать ещё быстрее, нужно уже всякие трюки применять. Ей можно одновременно рисовать 16 танков с атрибутами за фрейм... в реальности меньше думаю нужно.

zx-kit
21.08.2013, 22:32
Когда-то давно, я делал процедуру (http://zx.pk.ru/showthread.php?t=20554) которой можно рисовать спрайт с границами. Довольно компактно, шустро и универсально к координатной плоскости. Посмотри как отсекаются границы экрана.

Чтобы делать ещё быстрее, нужно уже всякие трюки применять. Ей можно одновременно рисовать 16 танков с атрибутами за фрейм... в реальности меньше думаю нужно.
16 танков от INT до начала отображения окна - это очень оптимистично. У меня только 9 успевает. Вот как получилось переделать границы обрезки.

Я потом переделаю процедуру для печати из буфера. Тогда тоже может будет успевать печатать и 16 танков. Ваша процедура сложная - не осилю.

Alex Rider
21.08.2013, 22:36
Я предполагаю разместить глобальные карты уровня (уровней) в области с #C000.


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

Распаковка карты уровня в рабочую область - хорошая идея. Неплохо также еще распаковывать графику, музыку уровня, если они будут разные. Только не в #C000. В идеале, впечатать бы навсегда (на время одного уровня) страницу 7 туда и иметь оба 120-х экрана в адресном пространстве одновременно, забыв про щелканье страниц во время самой игры. Но это если только памяти хватит.

zx-kit
21.08.2013, 22:42
Распаковка карты уровня в рабочую область - хорошая идея. Неплохо также еще распаковывать графику, музыку уровня, если они будут разные. Только не в #C000. В идеале, впечатать бы навсегда (на время одного уровня) страницу 7 туда и иметь оба 120-х экрана в адресном пространстве одновременно, забыв про щелканье страниц во время самой игры. Но это если только памяти хватит.
Пока про упаковку не думал. А адрес #C000 хорош тем, что там можно меняя страницы менять уровни. Пока думаю музыку AY, если будет, разместь в сегмент стандартного экрана сразу под областью атрибутов, около 9 Кб. Пока не знаю сколько обычно занимает музыка. Затем сегмент программы и спрайтов, затем карты. Второй экран использовать пока не планирую, так как пока у меня заточены спрайты и процедуры под один экран.

Левая часть таблицы с картами используется как раз для рабочей копии карты уровня.

Alex Rider
21.08.2013, 22:55
А адрес #C000 хорош тем, что там можно меняя страницы менять уровни.
Ну при смене уровне же быстродействие не сильно критично... Можно распаковать/скопировать уровень в 7-й банк из любого другого. А область #C000 - #DAFF не занимай пока. Процедуры графики несложно запатчить под второй экран, зато он тебе даст гарантию отсутствия мерцания при условии, что за INT все успеет вывестись. Порядок вывода при этом может быть любым. В начале INT'а можно будет музыку поиграть и не париться.

---------- Post added at 22:55 ---------- Previous post was at 22:51 ----------


Пока думаю музыку AY, если будет, разместь в сегмент стандартного экрана сразу под областью атрибутов, около 9 Кб. Пока не знаю сколько обычно занимает музыка. Затем сегмент программы и спрайтов, затем карты
По поводу схемы памяти - предусмотри сразу, что ISR (опрос клавиатуры, плеер), таблица прерываний и основной код графики и логики должны быть в #8000 - #BFFF. В медленную память можно убрать код работы с диском, стартовое меню, final cut (если не динамический), таблицы очков и подобное, что не требует большой скорости.

drbars
21.08.2013, 23:35
16 танков от INT до начала отображения окна - это очень оптимистично. У меня только 9 успевает. Вот как получилось переделать границы обрезки.

Я потом переделаю процедуру для печати из буфера. Тогда тоже может будет успевать печатать и 16 танков. Ваша процедура сложная - не осилю.
Да ничего там сложного, просто расчеты границы. Без использования стека. Можно всякие трюки со скоростью танков ещё применять. Рисовать по очереди, пока один стоит (типа медленно едет), другой рисуется.

Я надеюсь ты не будешь использовать подпрогрумму Pause из ПЗУ для ограничения скорости танков? :) Это делается иначе.

Вот пример, 15 спрайтов полных 3х3. Но я бы остановился на 8-ми танках, как максимуме.

Её фишка в том, что координаты могут быть отрицательные:

LD D,-8 ; D=Y
LD E,-1 ; E=X

Это выводит спрайт без левого и верхнего слобцов.

Дмитрий
21.08.2013, 23:37
А адрес #C000 хорош тем, что там можно меняя страницы менять уровни.
уровней сколько будет? если 4-5 (без музыки), куда ни шло, а если больше, то увы придется паковать... В этом ничего нет сложного, а учитывая структуру карты - множество повторяющихся элементов, то упакованная она будет занимать 1-2 кб не более. в страницу можно заткнуть по 8-10 карт/уровней... это если уж не думать о подгрузке уровней с накопителя.

zx-kit
22.08.2013, 06:08
Ну при смене уровне же быстродействие не сильно критично... Можно распаковать/скопировать уровень в 7-й банк из любого другого. А область #C000 - #DAFF не занимай пока.

Если в оставшемся месте расположить таблицу с картами, то ее размер будет 37х256 клеток. Немного меньше 2х окон в высоту. Может не хватить.

Процедуры графики несложно запатчить под второй экран, зато он тебе даст гарантию отсутствия мерцания при условии, что за INT все успеет вывестись.
Пока постараюсь без второго экрана попробовать сделать.

Порядок вывода при этом может быть любым. В начале INT'а можно будет музыку поиграть и не париться.

А сколько тактов нужно, чтобы загрузить из буфера музыки очередную ноту в AY? Наверно этот буфер можно тоже размеситить в медленной памяти ?

По поводу схемы памяти - предусмотри сразу, что ISR (опрос клавиатуры, плеер), таблица прерываний и основной код графики и логики должны быть в #8000 - #BFFF. В медленную память можно убрать код работы с диском, стартовое меню, final cut (если не динамический), таблицы очков и подобное, что не требует большой скорости.
Понял.

---------- Post added at 06:18 ---------- Previous post was at 06:16 ----------


уровней сколько будет? если 4-5 (без музыки), куда ни шло, а если больше, то увы придется паковать... В этом ничего нет сложного, а учитывая структуру карты - множество повторяющихся элементов, то упакованная она будет занимать 1-2 кб не более. в страницу можно заткнуть по 8-10 карт/уровней... это если уж не думать о подгрузке уровней с накопителя.
Размеры и количество уровней пока не извествны. Да, наверно их можно будет ужать. Или сделать так, чтобы в 48К влез 1 уровень, а остальные загружать как независимые модули с носителя или из дополнительной памяти 128К. Сколько памяти надо под музыку и звуковые эффекты для AY?

---------- Post added at 07:08 ---------- Previous post was at 06:18 ----------


Да ничего там сложного, просто расчеты границы. Без использования стека. Можно всякие трюки со скоростью танков ещё применять. Рисовать по очереди, пока один стоит (типа медленно едет), другой рисуется.

Я надеюсь ты не будешь использовать подпрогрумму Pause из ПЗУ для ограничения скорости танков? :) Это делается иначе.

Вот пример, 15 спрайтов полных 3х3. Но я бы остановился на 8-ми танках, как максимуме.

Её фишка в том, что координаты могут быть отрицательные:

LD D,-8 ; D=Y
LD E,-1 ; E=X

Это выводит спрайт без левого и верхнего слобцов.

Для нормализации скорости танков - у нас ведь не гонки - буду использовать HALT для пропуска одного кадра.

Мелькающий серый бордер в вашем примере показывает, что процесс печати длится до самого низа экрана ?

Написал подпрограмму печати спрайтов 8х8 точек из буфера печати:


;================================================= ==================================================
;= ПЕЧАТЬ СПРАЙТОВ С ЦВЕТОМ РАЗМЕРОМ 1х1 КЛЕТКУ (8х8 ТОЧЕК) 130822-01 =
;= (ADDR_BUF) = ТЕКУЩИЙ АДРЕС В БУФЕРЕ ПЕЧАТИ =
;= ВХОД: B = КОЛИЧЕСТВО СПРАЙТОВ ДЛЯ ПЕЧАТИ =
;= ВЫПОЛНЯЕТСЯ В НАЧАЛЕ ПРОЦЕДУРЫ ОБРАБОТКИ ПРЕРЫВАНИЙ, ПРЕРЫВАНИЯ ДОЛЖНЫ БЫТЬ ЗАПРЕЩЕНЫ =
;= ВРЕМЯ ПЕЧАТИ ОДНОГО СПРАЙТА = 234 ТАКТА Z80A =
;================================================= ==================================================
PRINT_1X1:
LD (STACK_POINTER),SP ; СОХРАНЯЕМ УКАЗАТЕЛЬ СТЕКА
1 LD SP, (ADDR_BUF) ; ЗАГРУЖАЕМ ТЕКУЩИЙ АДРЕС В БУФЕРЕ ПЕЧАТИ
POP HL ; ЧИТАЕМ ИЗ БУФЕРА АДРЕС В ОБЛАСТИ АТРИБУТОВ
POP DE ; ЧИТАЕМ ИЗ БУФЕРА ЦВЕТ КЛЕТКИ В D
LD (HL),D ; ЗАКРАШИВАЕМ КЛЕТКУ
POP DE ; ЧИТАЕМ ИЗ БУФЕРА АДРЕС ВЕРХНЕГО БАЙТА BITMAP НА ЭКРАНЕ
POP HL ; ЧИТАЕМ ИЗ БУФЕРА АДРЕС ЧАСТИ BITMAP СПРАЙТА РАЗМЕРОМ 8 Х 8 ТОЧЕК
LD (ADDR_BUF),SP ; СОХРАНЯЕМ ТЕКУЩИЙ АДРЕС В БУФЕРЕ
LD SP,HL ; УКАЗАТЕЛЬ СТЕКА УСТАНАВЛИВАЕМ НА АДРЕС ЧАСТИ СПРАЙТА
EX DE,HL ; HL = АДРЕС ВЕРХНЕГО БАЙТА BITMAP НА ЭКРАНЕ
; ПЕЧАТЬ 1 И 2 БАЙТА
POP DE
LD (HL),E
INC H
LD (HL),D
INC H
; ПЕЧАТЬ 3 И 4 БАЙТА
POP DE
LD (HL),E
INC H
LD (HL),D
INC H
; ПЕЧАТЬ 5 И 6 БАЙТА
POP DE
LD (HL),E
INC H
LD (HL),D
INC H
; ПЕЧАТЬ 7 И 8 БАЙТА
POP DE
LD (HL),E
INC H
LD (HL),D
DJNZ 1B
LD SP,(STACK_POINTER) ; ВОССТАНАВЛИВАЕМ УКАЗАТЕЛЬ СТЕКА
RET

drbars
22.08.2013, 07:54
Сделал пример, на базе моей процедуры вывода спрайтов на границах экрана. По Х нехватает разрядности, чтобы за край заезжать, поэтому я сдвинул Х... Мы ведь с полными координатами работаем.

X=(X/8)-1


Для нормализации скорости танков - у нас ведь не гонки - буду использовать HALT для пропуска одного кадра.
Также добавил процедурку изменения скорости танка без HALT, изучи. Вообще HALT для синхронизации используется. И в твоём случае если за прерывание будет рисоваться 8 танков, 4 медленные, а остальные быстрые... и как это сделаешь с HALT?
Медленные танки можно очередью рисовать... это значительно разгрузит проц. Пока один стоит, другой рисуется.


Мелькающий серый бордер в вашем примере показывает, что процесс печати длится до самого низа экрана ?
Да, почти за фрейм.

Дмитрий
22.08.2013, 08:55
Сколько памяти надо под музыку и звуковые эффекты для AY?
музыка может быть и 5кб, может и 16 кб, в среднем где-то 10-12кб. Эффекты, если брать утилиту Shiru, то один эффект занимает 50-100 байт.

jerri
22.08.2013, 09:16
Дмитрий, как совместить утилиту Shiru с реалтайм движком?

drbars
22.08.2013, 09:18
Дмитрий, как совместить утилиту Shiru с реалтайм движком?
Можно, но хрюкать будет :)

Alex Rider
22.08.2013, 09:54
А сколько тактов нужно, чтобы загрузить из буфера музыки очередную ноту в AY? Наверно этот буфер можно тоже размеситить в медленной памяти ?
По поводу нежатой музыки (дампа регистров AY) не могу ничего сказать. Знаю, что он громаден, но играется за копейки тактов. Если использовать классический плеер (бульбоплеер, например), он кушает примерно 4000 тактов за INT, но музыка вполне себе компактная - 3-10 Кб примерно. Но, честно говоря, я тут не большой специалист.
P.S. Robus сделал интересный плеер (http://zx.pk.ru/showthread.php?t=10768), можно попробовать его. Он быстрый как минимум, музыка при этом жатая.

Дмитрий
22.08.2013, 10:06
Дмитрий, как совместить утилиту Shiru с реалтайм движком?
а там звуки воспроизводятся на прерываниях - http://shiru.untergrund.net/files/ayfxedit04.zip

drbars
24.08.2013, 12:40
Вот, полезная статья для игры http://abzac.retropc.ru/content?id=782

zx-kit
25.08.2013, 13:09
а там звуки воспроизводятся на прерываниях - http://shiru.untergrund.net/files/ayfxedit04.zip
А реально в этой программе сделать звук, похожий на звук лазера ?

drbars
25.08.2013, 14:19
А реально в этой программе сделать звук, похожий на звук лазера ?
Думаю да. Я и не подозревал о её существовании) Хотел сам писать такую.

Дмитрий
25.08.2013, 18:01
zst, а там в примерах посмотри, вроже что-то похожее было

zx-kit
25.08.2013, 18:19
zst, а там в примерах посмотри, вроже что-то похожее было
Там есть образ с тестовыми звуками, но в основном разного вида пиликанье, для игр готовой бибилиотеки нет. Может на AY есть какой-то диапазон звуков и музыки, а другие невозможны ? Я пока в звуках не разбираюсь.

Дмитрий
25.08.2013, 19:45
для игр готовой бибилиотеки нет
увы и не будет, надо брать музыканта и просить сделать.

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

zx-kit
09.09.2013, 06:02
Как лучше сжимать карту уровня? Мое предложение такое:
Ограничиться на карте 128 видами тайлов (коды от 0 до 127). При упаковке карты уровня. если по-горизонтали одиночный тайл, то просто его переписать в архив. Если по-горизонтали их несколько одинаковых, старший бит номера тайла установить в 1 (к коду тайла прибавить 128), а в следующем байта указать количество одинаковых тайлов.

После распаковки на рабочую копию карты уровня можно добавить специальные тайлы с кодами больше 127. Например, для указания танка с номером 4 на рабочую копию в 9 клеток будут записаны коды 132 (128+4)

drbars
09.09.2013, 07:46
Как лучше сжимать карту уровня?
hrust/dehrust

drbars
23.09.2013, 21:41
На каком этапе игра? :)

zx-kit
02.10.2013, 20:22
На каком этапе игра? :)
Пока только думаю...

Планирую сделать так, чтобы в начале игры вся карта была затуманена и проявлялась по мере продвижения FT по уровню. Долго думал, как бы это сделать. Пришел к такому решению. В начале в рабочей копии уровня все атрибуты делаем цветом серый INK + серый PAPER. При движении FT вокруг него (вернее в поле в форме квадрата размером, например, 9х9 клеток) закрашиваем реальными атрибутами тайлов. Если FT один раз прошел по этому месту, то элементы уровня остаются видимыми.

Вражеские танки видимы только в этом квадрате. Видно даже через стены. Вот такой сканер ограниченного по расстоянию действия.

Hacker VBI
02.10.2013, 22:11
это называется "туман войны" и реализуется дополнительной картой видимости

Andrew771
03.10.2013, 09:43
Как у zst, тоже нормально.

Hacker VBI
03.10.2013, 11:25
Andrew771, да, всё зависит от необходимости.

zx-kit
23.02.2014, 16:11
http://i058.radikal.ru/1402/e5/ccb200bcac2ft.jpg (http://i058.radikal.ru/1402/e5/ccb200bcac2f.png)

Примерный внешний вид 1 экрана игры "FUTURE TANK. Разведка" .

Теперь лабиринты будут 3D. Попиксельного скроллинга экрана не будет. Будет перескок в соседний экран. Максимальный размер лабиринта 3 * 8 экранов. В памяти будут храниться упакованные лабиринты в 2D. Во время отображения текста миссии распаковывается 2D карта и по ней компьютер сам строит 3D карту.

На первых уровнях стрелять нельзя, чтобы не выдать себя. Они принимают FT за своего...

Работу над игрой продолжу. Исходники и образы SNA можно скачать тут (http://www.zxkot.ru/software/s01) Планируются статьи про то, как я писал эту игру.

goodboy
23.02.2014, 16:45
распаковывается 2D карта и по ней компьютер сам строит 3D карту.
похожий метод применяется в игре RanaRama (в zxreview был перевод статьи про это)

zx-kit
23.02.2014, 18:01
похожий метод применяется в игре RanaRama (в zxreview был перевод статьи про это)
Читал. У Тернера каждая комната прямоугольного размера задается двумя байтами, где размещены типоразмер комнаты и относительные координаты.

У меня игровое пространство проектируется произвольной формы сначала на бумаге в виде контуров дорог и стен. Размеры дорог и стен кратны квадратам 2х2 клеток экрана. Дальше все заменяется последовательностью чисел 1, N1, 0, N2, 1, N3, 0, N3. То есть с указанием количества одинаковых элементов. Показанный на рисунке экран занимает 60-70 байтов и быстро распаковавается.

Как и у Тернера, у меня есть подпрограмма, которая по контурам 2D карты расставляет кирпичи для получения 3D изображения. Работает достаточно быстро. Распаковывается сразу вся карта уровня. При перемещении на целый или часть экрана будет печататься изображение из 3D карты, на которой расположены номера тайлов.

Все ресурсы распределены по страницам: LEVELS, PAGE_MAP_2D, PAGE_MAP_3D, PAGE_SPR (спрайты танков, тайлы, шрифт ). При работе впечатывается нужная. Во время прерывания PAGE_SPRITES, при выходе из подпрограммы обработки прерывания восстанавливается старая страница.

zx-kit
24.02.2014, 22:06
Добавлено ручное управление танком (клавишы W, A, S, D)

denpopov
25.02.2014, 07:30
интересно, а алгоритм проложения маршрута, например A*, кто-то пробовал реализовать?

zx-kit
25.02.2014, 07:47
интересно, а алгоритм проложения маршрута, например A*, кто-то пробовал реализовать?
Уточните вопрос ? Имеется ввиду задача, как объекту дойти из точки А в точку Б по лабиринту ?

zx-kit
25.02.2014, 19:20
Первый уровень

jerri
25.02.2014, 19:31
Это не первый уровень :( это первый экран

zx-kit
25.02.2014, 19:37
Это не первый уровень :( это первый экран
Для начала 1 уровень можно 1 экран - как обучающий. Можно еще кое-что добавить.

Пока задумывается хождение по лабиринтам типа DOOM2.
Для открывания дверей нажимать кнопки, находить ключи, другие предметы.
Иногда перестрелки с противником. Максимальный размер лабиринта 3 * 8 экранов

denpopov
25.02.2014, 19:55
Имеется ввиду задача, как объекту дойти из точки А в точку Б по лабиринту ?
да, или поиск цели.

zx-kit
25.02.2014, 19:58
да, или поиск цели.
Пока над этим не задумывался. И если это будет делать компьютер, у человека шансов выиграть не останется. Будет облава типа PACMAN.

denpopov
25.02.2014, 20:09
удет облава типа PACMAN.
у пакмана другой алгоритм, он давно дизассемблирован и разобран по полочкам.

SAM style
25.02.2014, 22:25
интересно, а алгоритм проложения маршрута, например A*, кто-то пробовал реализовать?Делал что-то подобное для игры "Вера".