| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: GUI и Java FX приложения > Thread(sleep) |
| Автор: Hacker_h 7.11.2005, 16:51 |
| Народ, я пишу простейший апплет - змейку. у меня голова змеи - овал, который рисуется на панели через g.drawOval(); Змея - отдельный поток,который в своем вечном цикле сначала осуществляет движение (меняет коорлинаты на фиксированную величину)б затем засыпает на полсекунды, затем говорит обсерверу что изменился и хочет перерисоваться. Примерный кот такой: while(alive){ move(); try{ Thread.sleep(SLEEP); }catch(Exception e){ } setChanged(); notifyObservers(); } но при движении у овала наблюдаются иногда скачки. он как бы раньше времени перескакивает на новую позицию, потом дожидается и двигается дальше. Код сликом прост что б это была его ошибка. Что там не так, почему такое нестабильное поведение? |
| Автор: batigoal 7.11.2005, 16:56 |
| Запости код поподробнее. Весьма вероятно, что проблему можно будет решить с помощью EventQueue.invokeAndWait(); |
| Автор: Domestic Cat 14.11.2005, 17:49 |
| Почитай что-нибудь про анимацию (в частности в Java). Дело в том, что на выполнение треда процессор выделяет разное время, в зависимости от нагрузки; кроме того, сам слип не обязательно спит указанное время. Обычно для исправления таких вещеи в этом цикле меряют реальное прошедшее время (t = System.currentTimeMillis - previousTime) и передвигают объект на расстояние v*t где v - скорость объекта. |
| Автор: NextAlex 26.11.2005, 22:26 |
| Привет! Не советую для анимации использовать sleep() - в зависимости от параметров машины прорисовка занимает разное время, да и сам sleep() может спать разное время в зависимости от загрузки компа. Я с этими граблями уже сталкивался. Лучше используй для прорисовки таймер - swing-овский прост в использовании до безобразия и все проблемы сразу отпадут. |
| Автор: Гость_Гость 1.12.2005, 13:09 |
| NextAlex Тоесть рисовать по таймеру? |
| Автор: NextAlex 2.12.2005, 01:39 | ||||||||
Ну да ... А почему тебя это удивляет ? Всё что у тебя изменится - это добавится строка импорта
добавится вот такой класс, причем прямо в теле класса твоего потока
и объявление таймера и его старт при запуске потока (например ... или в любом другом удобном месте)
И всех делов Зато ты четко будешь знать что между кадрами у тебя стабильный интервал в 500 миллисекунд ... |
| Автор: Domestic Cat 2.12.2005, 09:48 |
| Ага. А что, если скорость спрайта будет большой - не будел ли его движение прерывистым? Потом, все хендлеры для Timer выполняются в event-dispatching треде, а потому приложение в течение обработки событий таймера (а это время может быть значительным из-за рассчета движений объектов, проверки на столкновения, отрисовку, про 3D я молчу) на нажатия кнопок реагировать не будет. |
| Автор: NextAlex 2.12.2005, 19:57 |
| Domestic Cat я тебе такую тирраду написал, но видать не совпало - не ту кнопку нажал ... Повторяться мне лень... В общем, ты сначала попробуй это сделать одним и вторым методом ... |
| Автор: Domestic Cat 3.12.2005, 10:52 |
| Тем что я написал - делал 3D. Работало. Насчет твоего - не знаю и очень сомневаюсь. |
| Автор: NextAlex 3.12.2005, 19:49 |
| А я пробовал и то и другое для 2D ... В итоге остановился на таймере - работает гораздо стабильнее. Кстати извини если разкий пост получился - я не со зла. |
| Автор: Domestic Cat 4.12.2005, 14:01 |
| 2Д и я писал ( http://forum.vingrad.ru/index.php?showtopic=27244 ). Да я не обижаюсь, вполне возможно что и таймеры можно юзать. |