Найти в Дзене
ZDG

Заготовка блоков для Арканоида

Хочу сделать клон игры Arkanoid с некоторыми особенностями, и на данный момент ограничусь только одной задачей, а именно реализацией "кирпичей", которые надо разбивать. Для тех, кто не знает, что такое Арканоид: Это вроде пинг-понга, только мячик разбивает "кирпичи", или блоки. Соответственно, одна из решаемых задач это определение, в какой блок попал мячик. В оригинале всё просто. Блоки расположены в ровной сетке, так что перевести координаты мячика в координаты ячеек сетки не проблема: Чего хочу я – чтобы блоки необязательно располагались на одной линии: И необязательно имели одинаковый размер: На деле же блоки по-прежнему остаются в сетке, просто это более мелкая сетка: И один блок может состоять из нескольких клеток. А если пофантазировать, то я могу даже делать блоки нестандартного размера или формы (вроде Тетриса). Тогда возникает другая задача: если мячик попал в какую-то клетку, содержащую часть блока, то помимо неё какие ещё клетки заняты этим же блоком? Блоки в оригинальном А
Оглавление

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

Для тех, кто не знает, что такое Арканоид:

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

В оригинале всё просто. Блоки расположены в ровной сетке, так что перевести координаты мячика в координаты ячеек сетки не проблема:

-2

Чего хочу я – чтобы блоки необязательно располагались на одной линии:

-3

И необязательно имели одинаковый размер:

-4

На деле же блоки по-прежнему остаются в сетке, просто это более мелкая сетка:

-5

И один блок может состоять из нескольких клеток. А если пофантазировать, то я могу даже делать блоки нестандартного размера или формы (вроде Тетриса).

Тогда возникает другая задача: если мячик попал в какую-то клетку, содержащую часть блока, то помимо неё какие ещё клетки заняты этим же блоком?

Идентификация блоков

Блоки в оригинальном Арканоиде отличаются цветом, а также прочностью (количество ударов, необходимое, чтобы разбить блок) и дополнительными эффектами вроде выпадающих артефактов.

Поэтому нужно понимать, что мячик попал не просто в блок, а в блок какого-то конкретного типа.

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

-6

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

Но что делать с остальными клетками? В них я запишу адрес начала блока. В вышеуказанной картинке для примера содержится 14 ячеек сетки в ширину. Тогда адрес блока 2 относительно начала сетки равен 16. В остальные ячейки блока 2 я запишу числа 16, и аналогично обработаю другие блоки:

-7

Теперь, если мячик попадает в клетку с числом 2, то это начало блока 2, а если в клетку с числом 16, то это адрес начала блока. Мы переходим на адрес 16 и находим там блок 2.

Но как теперь различить числа 2 и 16, какое из них идентификатор блока, а какое адрес? Ведь они могут произвольными, и адрес может равняться 2, и блок с идентификатором 16 тоже может существовать.

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

Остаётся проблема нулевых клеткок. Это пустое пространство, где нет никаких блоков. В этом случае будем использовать идентификатор блока 0. Реальные идентификаторы блоков должны быть больше нуля.

Немного экономии?

Два 16-битных числа на одну клетку сетки – вполне бюджетно по памяти. Можно дополнительно ужать данные до 8 бит, выделив 1 бит на тип клетки: если старший бит равен 0, то это идентификатор блока, если 1, то адрес.

Адрес может не поместиться в оставшиеся 7 бит, но можно сделать его не абсолютным, а относительным. То есть сколько нужно отнять от текущего адреса клетки, чтобы попасть а адрес начала.

Возможных типов блоков тоже будет всего 127, но этого должно хватить с избытком.

Однако необходимости в таком усложнении не вижу.