Пятница, 08 Ноября 2024, 15:58

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Вовремя не срабатывает repaint
KreatifchkДата: Суббота, 11 Июля 2015, 17:04 | Сообщение # 1
был не раз
Сейчас нет на сайте
У меня есть персонаж, которому я хочу сделать функцию прыжка. Во втором потоке, я создал такой вот код:
Код

public void run() {
     if (jump == true) {
     for (int i = 1; i <= 7; i++) {
     y = y - 1;
     repaint();
     Thread.currentThread();
     Thread.sleep(120);
     }
}
}

А также есть таймер который, каждые 20 милисекунд запускает этот метод run и еще один метод из основного потока, для движения по горизонтали. По сути, когда срабатывает таймер проверяется не нажата ли кнопка пробела и если нажата то активируется условие, а вместе с ним цикл. И дальше при каждом повышении персонажа на один пиксель, должно перерисовываться все, но почему-то перерисовка происходит только в конце после выполнения цикла. Почему?
RemmintanДата: Суббота, 11 Июля 2015, 21:23 | Сообщение # 2
почетный гость
Сейчас нет на сайте
Цитата Kreatifchk ()
А также есть таймер который, каждые 20 милисекунд запускает этот метод run и еще один метод из основного потока

Если я вас правильно понял, то вы запускаете метод run(); из основного потока. Или все таки метод start();? Ведь именно метод start() выполнит метод run() в отдельном потоке. Запуская run(), из того же потока вы блокируете поток так, как если бы просто выполняли "еще один метод из основного потока". Надеюсь понятно объяснил, поясните пожалуйста то, что я прошу)

И да. Не обязательно, но желательно использовать аннотацию @Override (она определяет точно ли переопределен метод) при переопределении методов, с ней удобнее программировать.
KreatifchkДата: Воскресенье, 12 Июля 2015, 03:38 | Сообщение # 3
был не раз
Сейчас нет на сайте
Изначально в конструкторе я запускаю поток с помощью start(); , а затем в таймере каждые 20 милисекунд запускаю метод run что-бы метод выполнялся постоянно. За совет с @Override спасибо, учту.)
RemmintanДата: Воскресенье, 12 Июля 2015, 13:27 | Сообщение # 4
почетный гость
Сейчас нет на сайте
Цитата Kreatifchk ()
а затем в таймере каждые 20 миллисекунд запускаю метод run что-бы метод выполнялся постоянно

Ну сморите, при запуске метода start() создается новый поток и в нем автоматически выполняется метод run(), после того как метод run() завершился поток удаляется. нужно заново запускать метод start() чтобы вызвать метод run() в новом потоке.
В каком потоке находится таймер? Если в основном, тогда вызов метода run() по таймеру блокирует основной поток.

Попробуйте запускать по таймеру метод start(), скорее всего это не сработает и будет вылетать ошибка что-то типо "This thread is already running.". Тогда попробуйте останавливать поток перед запуском. Пример:

Код

public static void main(String args[]){
//MyThread это некий класс, наследующий Thread
MyThread mt = new MyThread();
while(timer){ //я не знаю как работает ваш таймер, но предположим что это цикл  
if(!timer)continue; //если 20 секунд не прошло, то продолжаем цикл
if(mt.isAlive()){mt.interrupt();mt.join();}//пытаемся завершить поток и подключаемся к нему, чтобы не переходить к запуску потока до завершения
mt.start();
}
}

(ВНИМАНИЕ! код выше не работает, он просто представляет структуру. подключайте его в ваш таймер)

Если и это не поможет, тогда попробуйте третий способ.
Просто запускайте свой таймер в отдельном потоке.
KreatifchkДата: Воскресенье, 12 Июля 2015, 17:51 | Сообщение # 5
был не раз
Сейчас нет на сайте
Благодаря вашему совету нашел решение. Создал отдельный класс и этот 2 поток уже в нем. Там во втором потоке сделал бесконечный цикл, который вызывает метод jump, который делает что я хотел, а затем цикл засыпает на определенное время. Таким образом получается некое подобие таймера, но такого который не блокирует второй поток. Спасибо большое!
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг