Пользовательские прямоугольные хитбоксы для pygame tetris? Часть 2

Вот что сейчас происходит в моей игре в тетрис: Хитбокс для блока J 60х40, и хотя в самом графическом редакторе там действительно ничего нет, он воспринимается как хитбокс. Это означает, что два невидимых квадрата в правом верхнем углу блока J учитываются в хитбоксе, и я хочу исключить их.

Это таблица спрайтов, которую можно увидеть в фоторедакторе — GIMP.

Я попытался скопировать и вставить код из этот пример, но python сразу выдал ошибку и сказал: «Нет модуля с именем math». Я использую python 2.7 и pygame 1.9.1.

У меня есть pastebins для всего кода... mcve - основной для запуска.

`https://pastebin.com/Zze42KmZ`

`https://pastebin.com/q5rEpk3e`

`https://pastebin.com/ChGvrMu8`

`https://pastebin.com/ppb3cREL`

Как исключить квадраты в хитбоксе? Спасибо, и я извиняюсь за сосать.


person milliways    schedule 25.02.2018    source источник
comment
Не ставьте ссылки на вещи, которые необходимы для вопроса. Добавьте изображения в вопрос и добавьте в вопрос минимально воспроизводимый пример. Если ссылка не работает, то ваш вопрос никому не будет полезен в будущем.   -  person Ted Klein Bergman    schedule 25.02.2018


Ответы (1)


Я бы сказал, что использование одного «хитбокса» для элемента J невозможно. Вот почему у вас есть pygame, обнаруживающий попадание с двумя коробками, которых там нет.

Это почему?

Потому что «хитбокс» — это один прямоугольник. Этот прямоугольник имеет свою высоту и ширину, и он соответствует высоте и ширине элемента J. Все внутри этого прямоугольника является частью одного и того же «хитбокса». На самом деле не имеет значения, имеет ли изображение, представляющее этот элемент, прозрачную часть или нет.

Hitbox основан не на изображении и его прозрачных частях, а на прямоугольнике, окружающем изображение.

Вот почему у вас должно быть как минимум 2 прямоугольника, которые покроют обе части элемента J, т.е. 3 вертикальных квадрата и 2 горизонтальных. Это немного усложняет все дело. Но вы должны иметь возможность использовать дочерний subsurfaces и использовать обнаружение столкновений для них обоих.

Я бы также сказал, что для этой цели вообще не рекомендуется использовать обнаружение столкновений pygame. Лучшим подходом было бы то, что вы делаете это, используя 2D-матрицу, где вы сохраняете «O» для пустого квадрата и «X» для занятого. На каждом шаге у вас есть элемент в координатах X, Y, и вы проверяете, опускаете ли вы его на 1 шаг, вы сталкиваетесь с занятым пространством в матрице. Хотя это всего лишь предложение.

Пример чистой матрицы 5 строк x 4 столбца:

0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

Пример элемента J в координате (1, 1):

0 0 0 0
0 0 J 0
0 0 J 0
0 J J 0
0 0 0 0

Обратите внимание, что система координат pygame имеет координату (0,0) в левом верхнем углу экрана. Это соответствует координатам сгенерированной 2D-матрицы.

person Ilija    schedule 25.02.2018