Реализация перетаскивания в Java-игре - PullRequest
3 голосов
/ 17 марта 2012

Я работаю над настольной игрой, которая представляет собой сетку 8x8 с 5 изображениями разных цветов.Объекты могут меняться, если они находятся рядом друг с другом в строке или столбце.Если в результате переключения в строке или столбце 3 или более объектов будут одинаковыми, они будут удалены.Если переключение не приводит к совпадению, переключение не произойдет.Когда объект удаляется, доска разрушается, так что объекты, расположенные над удаленными, падают, чтобы занять свое место, и новые падают сверху, чтобы заполнить пробелы.хороший способ реализовать операцию перетаскивания и падения объектов.Стоит ли использовать многоуровневую панель?

Любые идеи помогут мне.

1 Ответ

0 голосов
/ 20 марта 2012
  1. Операция перетаскивания: Создайте хэш-карту, которая сообщает индекс цвета (скажем, 5 разных цветов в сетке 8x8) и объект прямоугольника. Прямоугольник и цвет обозначают соответственно ключ и значение. Вы щелкаете каждый раз дважды по отдельности на 2 смежных блоках (rects), получаете эти два соответствующих цвета и меняете их. Затем проверьте еще раз ваше распределение цветов, есть ли теперь по крайней мере один блок с 3 или более 3 одинаковыми цветами рядом на линии. Если нет, обменяйте цвета обратно.

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

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

Таймер будет хорошим выбором. После того, как найден хотя бы один набор блоков (более 3-х, даже смежных на одной и той же строке), вызовите расписание таймера (задача TimerTask, длинная задержка, длительный период) , в котором необходимо определить TimerTask run () , который ничего не делает, только вызывает перерисовку вашего JComponent / JFrame (int x, int y, int width, int height) , определенную в основном потоке для рисования падающая часть. В краске вашего JComponent / JFrame (Графика g) вам нужно нарисовать разные фазы вашей падающей части. Вам также необходимо использовать цикл в вашей TimerTask run () , чтобы каждый раз после period ms повторялась другая перерисовка JComponent / JFrame (x, y, width, height) будет вызвано. Если вы хотите выполнить цикл 5 раз, просто используйте cancelr TimerTask () в 5-м цикле, и таймер завершится. Если вы не слишком сильно относитесь к эффекту мерцания, просто используйте repaint () вместо этого и каждый раз рисуйте целое изображение сетки 8x8 в вашей краске (Графика g) . Причина, по которой я использовал JComponent / JFrame, заключается в том, что вы можете рисовать непосредственно на JFrame или рисовать на JComponent на основе JFrame.

Спасибо. У меня есть идея реализовать эффект падения и перетаскивания. Сейчас я застрял в своей программе и не могу найти выход. Я буду признателен, если я получу некоторую помощь. Моя программа до сих пор, я создал панель с сеткой 8x8 в кадре. Я создал класс с ImageID (строка с номером строки и столбца), Image (JLabel), строкой и столбцом. Я создал 64 объекта, которые хранятся в 2-мерном массиве, хранящемся в GridLayout. К каждому объекту прикрепляется mouselistener и mousemotionlistener. Когда пользователь нажимает на сетку, я получаю объект изображения, и inturn получает строку и столбец изображения, по которому щелкнули - newjav вчера
Проблема в том, что я застрял, когда мышь нажимают, перетаскивают и отпускают. Объект, который я получаю, когда мышиный выпуск или музедраг - это объект, который был нажат. Поэтому я не получаю строку и столбец сетки, где была отпущена мышь. Как рассчитать расположение сетки, где была отпущена мышь. Я застрял здесь и не могу идти дальше

Если вы используете только mousePressedListener и mouseReleasedListener без mouseMotionListener, то вы можете получить исходные и целевые объекты сетки по отдельности. Но я думаю, что ваша цель - использовать MouseMotionListener. Итак, у меня есть два варианта: 1. Вскоре после нажатия на сетку obj вы получаете сетку obj (т.е. вы получаете границы этой сетки obj).Например, вы щелкнули по объекту сетки во 2-й строке и столбце, затем вы можете получить членов объекта сетки row = 1 и coloum = 1. Предположите ширину и высоту каждой сеткиоба 10 (пикселей).Затем вы получите границы этой сетки obj: (10, 10) и (20, 20).Теперь вы хотите перетащить в другую сетку.Таким образом, вам нужно добавить условие в функцию mouseReleased () этого сеточного объекта: если текущее отпущенное положение мыши находится за пределами этого сетевого объекта, один из его соседей теперь является целевым сетевым объектом.например, если (например, getX ()> 20 && e.getY ()> 10 && e.getY () <20) {// тогда целевая сетка obj находится на правой стороне исходной сетки obj, а его границы - (20, 10), (30, 10), т.е. row = 1, column = 2} С помощью строки и столбца вы можете найти целевую сетку obj из вашего 2D-массива.<strong> 2. Но на вашем месте я бы не назначал каждой сетке obj mouseListener и mouseMotionListener, а назначал только панель, включающую эти 64 сетки сеток mouseListener и mouseMotionListener.Каждый раз, когда вы нажимаете, перетаскиваете и затем отпускаете, вы получаете соответствующую позицию, с которой вы легко конвертируете строку и столбец.С помощью строки и столбца вы можете найти подходящую сетку obj из вашего 2D-массива.Вот и все.Надеюсь, это то, что вы хотите.

...