![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Hacker_h |
|
|||
|
Unregistered |
Народ, я пишу простейший апплет - змейку. у меня голова змеи - овал, который рисуется на панели через g.drawOval();
Змея - отдельный поток,который в своем вечном цикле сначала осуществляет движение (меняет коорлинаты на фиксированную величину)б затем засыпает на полсекунды, затем говорит обсерверу что изменился и хочет перерисоваться. Примерный кот такой: while(alive){ move(); try{ Thread.sleep(SLEEP); }catch(Exception e){ } setChanged(); notifyObservers(); } но при движении у овала наблюдаются иногда скачки. он как бы раньше времени перескакивает на новую позицию, потом дожидается и двигается дальше. Код сликом прост что б это была его ошибка. Что там не так, почему такое нестабильное поведение? |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 7 Всего: 151 |
Запости код поподробнее. Весьма вероятно, что проблему можно будет решить с помощью EventQueue.invokeAndWait();
Это сообщение отредактировал(а) Lamer George - 7.11.2005, 17:01 -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 13 Всего: 172 |
Почитай что-нибудь про анимацию (в частности в Java). Дело в том, что на выполнение треда процессор выделяет разное время, в зависимости от нагрузки; кроме того, сам слип не обязательно спит указанное время.
Обычно для исправления таких вещеи в этом цикле меряют реальное прошедшее время (t = System.currentTimeMillis - previousTime) и передвигают объект на расстояние v*t где v - скорость объекта. -------------------- |
|||
|
||||
| NextAlex |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 10.8.2005 Где: Украина, г. Одесс а Репутация: нет Всего: 3 |
Привет!
Не советую для анимации использовать sleep() - в зависимости от параметров машины прорисовка занимает разное время, да и сам sleep() может спать разное время в зависимости от загрузки компа. Я с этими граблями уже сталкивался. Лучше используй для прорисовки таймер - swing-овский прост в использовании до безобразия и все проблемы сразу отпадут. --------------------
Говорила мама: "Учись играть на скрипке". Не хотел носить ноты - будешь носить пианино ... |
|||
|
||||
| Гость_Гость |
|
|||
|
Unregistered |
NextAlex
Тоесть рисовать по таймеру? |
|||
|
||||
| NextAlex |
|
||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 10.8.2005 Где: Украина, г. Одесс а Репутация: нет Всего: 3 |
Ну да ... А почему тебя это удивляет ? Всё что у тебя изменится - это добавится строка импорта
добавится вот такой класс, причем прямо в теле класса твоего потока
и объявление таймера и его старт при запуске потока (например ... или в любом другом удобном месте)
И всех делов Зато ты четко будешь знать что между кадрами у тебя стабильный интервал в 500 миллисекунд ... Это сообщение отредактировал(а) NextAlex - 5.12.2005, 10:59 --------------------
Говорила мама: "Учись играть на скрипке". Не хотел носить ноты - будешь носить пианино ... |
||||||||
|
|||||||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 13 Всего: 172 |
Ага. А что, если скорость спрайта будет большой - не будел ли его движение прерывистым? Потом, все хендлеры для Timer выполняются в event-dispatching треде, а потому приложение в течение обработки событий таймера (а это время может быть значительным из-за рассчета движений объектов, проверки на столкновения, отрисовку, про 3D я молчу) на нажатия кнопок реагировать не будет.
-------------------- |
|||
|
||||
| NextAlex |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 10.8.2005 Где: Украина, г. Одесс а Репутация: нет Всего: 3 |
Domestic Cat я тебе такую тирраду написал, но видать не совпало - не ту кнопку нажал ...
Повторяться мне лень... В общем, ты сначала попробуй это сделать одним и вторым методом ... --------------------
Говорила мама: "Учись играть на скрипке". Не хотел носить ноты - будешь носить пианино ... |
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 13 Всего: 172 |
Тем что я написал - делал 3D. Работало. Насчет твоего - не знаю и очень сомневаюсь.
-------------------- |
|||
|
||||
| NextAlex |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 10.8.2005 Где: Украина, г. Одесс а Репутация: нет Всего: 3 |
А я пробовал и то и другое для 2D ...
В итоге остановился на таймере - работает гораздо стабильнее. Кстати извини если разкий пост получился - я не со зла. --------------------
Говорила мама: "Учись играть на скрипке". Не хотел носить ноты - будешь носить пианино ... |
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 13 Всего: 172 |
2Д и я писал ( http://forum.vingrad.ru/index.php?showtopic=27244 ). Да я не обижаюсь, вполне возможно что и таймеры можно юзать.
-------------------- |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |