У меня есть (какая должна быть) простая проблема для решения, и я открыт для других способов ее решения. Я открыт для других решений.Несколько таймеров качания
Проблема: Мы используем java swing для отображения графики пошаговой игры на основе плитки. Я использую jlabels с иконками, абсолютно позиционированными.
Чтобы анимировать движение, я использую свинг таймер, который обновляет местоположение на 4 пикселя в то время, медленно перемещая право спрайта, левое и т.д.
Для достижения этой цели на начальном этапе, я был запущен таймером , который работает чудесно. Проблема возникает, когда я пытаюсь двигаться вниз, а затем двигаться вправо.
Спрайт перемещается вниз, никогда не двигается вправо, и если я смотрю исполнение с помощью какой-либо консоли, ясно, что оба таймера работают одновременно. Я сделал много денег в Интернете, и я не смог найти способ сказать таймер качания не выполнять, пока первый таймер не остановится, и если я попытаюсь заняться - подождите, пока один таймер не закончит (yuck) пользовательский интерфейс никогда не отображается вообще (явно шаг в неправильном направлении).
Теперь я могу полностью отказаться от таймеров и либо установить телепорт спрайта в его новое место, либо использовать какую-то ужасную схему движения «ожидание» , но я надеюсь, что у какой-то души есть решение.
Вкратце: мне нужен способ запустить таймер качания в течение заданного периода времени, остановить его, и затем начать новый таймер, чтобы они не перекрывались. Предпочтительно этот способ позволяет каждому таймеру быть в своем собственном методе, и затем я мог бы вызвать методы один за другим.
Заранее благодарим за любой совет, который у вас может быть.
Редактировать: Код расширенного примера. Если полный scsse является требованием для вашего совета, тогда я сожалею, что потратил ваше время, потому что полный код - зверь. Этот пример кода не работает вообще, поскольку он стоит, извините, но это должно проиллюстрировать суть.
So. У нас есть две функции, каждая из которых имеет таймер, который запускает цикл анимации, один для перемещения вниз и справа по диагонали, один для движения вниз.
public class TestClass {
static int counter = 0;
static int counter2 = 0;
static Timer timerC;
static Timer timerX;
public static void main(String[] args) {
moveC();
moveX();
}
public static void moveC() {
int delay = 200; // milliseconds
timerC = new Timer(delay, null);
timerC.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
if (counter < 32) {
counter = counter + 4;
System.out.println("*C*");
} else {
timerC.stop();
System.out.println("*C STOP*");
}
}
});
timerC.start();
}
public static void moveX() {
int delay = 200; // milliseconds
timerX = new Timer(delay, null);
timerX.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
if (counter < 32) {
counter = counter + 4;
System.out.println("*X*");
} else {
timerX.stop();
System.out.println("*X STOP*");
}
}
});
timerX.start();
}
}
То, что я хотел бы видеть здесь в конце концов будет
*C*
*C*
*C*
*C*
*C STOP*
*X*
*X*
*X*
*X*
*X STOP*
То, что я на самом деле получаю
*C*
*X*
*C*
*X*
*C*
*X*
*C*
*X*
*C STOP*
*X STOP*
Точка Я пытаюсь получить в здесь выполняется один цикл анимации до завершения, затем другой.
Еще раз спасибо.
Для лучшей помощи рано, опубликовать [SSCCE] (HTTP: //sscce.org/). –
Что значит «оба таймера работают одновременно». Я вижу только код для одного таймера, и этот таймер работает один раз. Просьба уточнить и рассмотреть возможность создания и публикации [sscce] (http://sscce.org). Также, пожалуйста, очистите форматирование кода, так как если ваш код будет легче читать и понимать, у нас будет больше шансов дать вам хороший совет. –
Я бы использовал для этого очередь. –