2014-11-28 4 views
3

Я пытаюсь сделать небольшую игру в java для задания.Как имитировать движение определенных JButtons в массиве JButtons

Нам нужно иметь перебольшое сетку в окне JFrame с пХп (п = некоторый разумный номер, например 5 или 7) поля (в данном случае каждое поле кнопки) и на этом поле действуют следующие правила:

Средняя кнопка - «черная дыра», и есть 2 игрока. У каждого игрока есть N-1 количество кораблей, которыми они располагают, и они должны перенести их в черную дыру. Побеждает первый игрок, добившийся этого. Корабли для обоих игроков по диагонали выровнены по направлению к середине (черная дыра).

Фокус в том, что, когда вы говорите кораблю идти в направлении, он будет двигаться в этом направлении, пока он не попадет ни на стену, ни на другой корабль.

Вот как выглядит игра при установке и при перемещении кораблей вокруг:

enter image description here

Мой вопрос, я уже успешно сделал поле со всеми кораблями и черной дыры в правильном положении. Все они являются кнопками и доступны для кликов, поэтому теперь, как мне достичь следующего:

После того, как я выделил одну кнопку с помощью мыши, система должна установить фокус на нее (я попробовал requestFocus() через ActionListener но он ничего не делает).

После того, как фокус установлен, на этой же кнопке (на которой уже есть ActionListener) будет установлен KeyListener, который ждет ввода клавиш со стрелкой. Затем после ввода направления, в котором эта кнопка будет перемещать свою окраску - имитирующее движение - пока она не попадет на корабль, стену или не войдет в черную дыру, когда она будет очищена от карты.

Мой вопрос, как я могу сделать Java знаю, что KeyListener на определенной кнопке должен слушать только клавиши со стрелками после того как я выбрал кнопку

, а другой является - как я на самом деле имитировать движение ?

В принципе, оба командных корабля окрашены в синий/красный цвет. Остальные блоки все белые, за исключением черной дыры посередине, которая черная.

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

+0

Вы включили «.addActionListener (это)» на свои кнопки? Без этого ваши кнопки не будут слушать действия. Убедитесь, что вы сделали что-то вроде: gameboardButton [i] .addActionListener (this); –

+0

Простой пример показан, и соответствующий пример цитируется в этом [ответе] (http://stackoverflow.com/a/3072979/230513). – trashgod

+0

@Marcelo Tataje да, конечно, я включил это. Я уже делал такие вещи, как изменение кнопок на красный, если я нажимаю на них и подобные простые вещи, но понятия не имею, как «имитировать» движение. – user1966576

ответ

1

Вы также должны добавить KeyListener к кнопке с KeyAdapter в качестве аргумента, и когда срабатывает событие, вы можете получить код ключа события, и сверить его значение:

KeyEvent.VK_UP 
KeyEvent.VK_DOWN 
KeyEvent.VK_LEFT 
KeyEvent.VK_RIGHT 

А затем предпримите необходимые действия.

Что касается имитации движения, вы хотите, чтобы треугольник просто «прыгал» с кнопки на кнопку или что-то более жидкое?

+0

Просто прыгать было бы достаточно, хотя, возможно, было бы не слишком сложно сделать его жидким. Это займет нечто вроде перекраски всей сетки после каждого движения одного блока. – user1966576

+0

Я предполагаю, что изображения, которые у вас есть, в настоящее время являются значками на кнопке, а не изображениями, плавающими над кнопкой. Если последнее, то это будет проще, так как вам просто нужно будет перемещать изображение с помощью пикселя каждые несколько миллисекунд. Если первое, вам нужно удалить изображение с кнопки, нарисовать его в том же положении, а затем снова переместить его на пиксель каждые несколько миллисекунд. Вы также должны искать двойную буферизацию в Swing, чтобы найти, как это сделать и сделать ее более гладкой. – Sokratees9

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