2013-05-23 3 views
1

Я делаю игру тетриса на Java, и у меня есть небольшая проблема, когда текущая часть останавливается, когда они ударяют другую часть, которая уже приземлилась. У меня есть отдельные классы для каждой формы тетромино. Когда currentPiece падает, форма с наименьшей координатой Y и тем же значением Х, что и ток, устанавливается как точка останова для currentPiece. Проблема в том, что кусок проходит через блоки, расположенные рядом с центром currentPiece, и утомительно кодировать все возможные формы и повороты.Проблемы с остановкой кусочков в моей игре с тетрисом (Java swing)

Есть ли лучший способ сделать это? В принципе, мой вопрос: как обрабатывать границы кусочков тетриса?

Ссылка на мои ява файлы: http://goo.gl/Ms8Mj (простите беспорядка)

Каждый блок представлен в виде таблицы значений, для формы L это:

{0,0},{1,0},{0,1},{0,2} 

«Средний» блок рассматривается как источник. Я рассматриваю возможность создания двумерного булевского массива, если место занято или нет.

+0

Зависит от того, как вы реализовали ... 'Shape' предоставляет метод' getBounds', который предоставляет метод 'intersects', который может использоваться для определения того, интересуются ли две формы ... если вы используете' java.awt ,Shape' – MadProgrammer

+0

@MadProgrammer Я не использую интерфейс Shape –

+0

Здесь вам будет полезно некоторое представление о вашем коде;) – MadProgrammer

ответ

4

Возможно, постройте 2-мерный вид, представляющий части, уже расположенные. например. (o представляют собой пустые пятна, x представляют собой размещенные предметы)

|ooooo| 
|oooox| 
|ooxxx| 
|xxxxx| 

Посмотрите на свою деталь и ее текущее положение. Имитируйте перемещение в нужное место, затем проверьте, не пересекаются ли какие-либо координаты x/y. Если это так, то он не может двигаться туда.

например. если у вас есть кусок (представленный y), перемещающийся вниз в следующих

4|ooooo| 
3|yyyox| 
2|ooxxx| 
1|xxxxx| 
    12345 

Имитация yyy перемещение вниз на одно место. Затем он занимает (1,2), (2,2) и (3,2). Проверьте свое представление - 3,2 занято, и поэтому блок не может двигаться туда. Эта логика должна (я думаю) применять к любой фигуре на любой размещенной доске.

+0

Я играл с этой идеей, я думаю, мне, возможно, придется перепробовать ее, –

+0

Я создал булевскую сетку, соответствующую моему графическому интерфейсу. Это решило многие проблемы, которые у меня были. Спасибо за ответ! –

2

Отделите свою логику поведения от логики вашего представления.

Если вы рассматриваете каждую часть Тетриса как четыре блока в своей поведенческой логике, становится довольно тривиально делать обнаружение столкновений. Нет никаких партитур для обнаружения, поскольку блок никогда не может занимать некоторое пространство между X и X + 1. Это всегда одно или другое. Однако, как только вы обнаружите, что X + 1 не занят, и кусок будет продолжать падать, просто добавить анимацию, которая заставит кусок появиться, чтобы перейти от одного места к другому с завершением анимации на том же время, так как логика диктует, что кусок упал на 1.

+0

Как именно я буду обрабатывать кусок как 4 блока? –

+0

Тетрические фигуры состоят из четырех блоков одинакового размера, расположенных по-разному. Линии четыре блока подряд, Ls - 3 блока с одним влево или вправо, квадраты - два блока по два, а squigglies смещены слева или справа. –

0

Да, лучший способ узнать, где фигура должна остановиться - это сделать рентгеновский (2-й булевский массив) пустых и полных ящиков.
Но в то же время - вам нужно знать, какие блоки вашей фигуры нужно проверить. Если вы перемещаете фигуру вниз, вы должны проверить только блоки LOWER вашей фигуры. Сделайте это, разделив отдельные категории - блоки с уникальными горизонтальными значениями, а оттуда - определите, какие из них имеют самые низкие значения по вертикали. Для проверки визуального представления this.

 Смежные вопросы

  • Нет связанных вопросов^_^