#java #animation #applet #drawing #appletviewer
#java #Анимация #апплет #рисование #appletviewer
Вопрос:
Одно из моих недавних заданий на Java (курс средней школы …) — создать апплет, в котором нарисована граница и шарик движется по экрану, подпрыгивая на границах. У меня установлен Fraps, и он сообщает, что апплет работает со скоростью всего 10 кадров в секунду, что делает анимацию крайне посредственной.
Мой оригинальный способ рисования анимации:
- вызовите мой метод:
drawScreen()
вpaint()
- сделайте
Thread.sleep(1000/frameRate)
паузуdrawScreen()
для частоты кадров, которая передается изhtml
- вызов
repaint()
Это сработало на удивление хорошо, и апплет работал как во сне… Пока я не увидел таблицу оценок, где говорилось, что я не должен перерисовывать экран каждый раз (возможно, это потому, что компьютеры работают необычно медленно, и мои друзья жаловались, что их апплеты мерцают достаточно, чтобы вызвать дискомфорт в глазах и много разрывов повсюду), и я долженнарисуйте шар, затем нарисуйте другой шар того же цвета фона, чтобы скрыть его, вычислите координаты и повторяйте, пока апплет не завершит работу
Проблема в том, что
repaint()
невозможно вызвать- моя анимация ограничена 10 кадрами в секунду
- нет доступных потоков для ответа на то, что я нажимаю закрыть в appletviewer или что-либо еще в апплете / просмотрщике.
Есть ли способ, чтобы моя анимация запускалась выше 10 кадров в секунду без использования repaint()
?
Комментарии:
1. Кстати, в чем именно ваш вопрос?
2. Теперь проблема решена…
Ответ №1:
- Не:
- Создайте пользовательскую анимацию в контейнере верхнего уровня, таком как
Applet
(/JAppet
) илиFrame
(/JFrame
). Вместо этого поместите пользовательский рисунок вCanvas
/Panel
илиJComponent
/JPanel
, затем поместите этот компонент в контейнер верхнего уровня. - Используйте AWT-компоненты в этом тысячелетии.
- Переопределение
paint()
для компонентов Swing — должно бытьpaintComponent(Graphics)
.
- Создайте пользовательскую анимацию в контейнере верхнего уровня, таком как
- Не используйте
Thread.sleep(n)
в потоке рисования. Вместо этого используйте SwingTimer
и выполните действие.. - Вызов
repaint()
.
Комментарии:
1. Я видел использование
repaint()
at profs.etsmtl.ca/mmcguffin/learn/java И я не думаю, что мы занимаемся каким-то свингом после того, как учитель сказал что-то вроде: «Я знаю достаточно всего, что касается программ, чтобы научить этому, так что, если вы, ребята, хотите заняться чем-то более продвинутым, не спрашивайте меня, посмотрите »2. И я не думаю, что смогу это использовать, потому что мой учитель не позволил моему другу использовать двойную буферизацию, чтобы остановить разрыв
Ответ №2:
Оказывается, мне нужно было либо реализовать двойную буферизацию, либо запустить апплет в браузере с двойной буферизацией. AppletViewer ограничил анимацию до 10 кадров в секунду, потому что она автоматически не буферизует апплеты, и я все это время запускал апплет внутри него.