Проблема с анимацией Java Swing

1

Просто предупреждение: я новичок в java - я обычно использую UnrealScript и С#, но я разветвляюсь, так что, вероятно, одна или две вещи, которые я сделал неправильно или против обычной конвекции java (это было бы больше в выравнивании с убеждениями этих двух других языков)

Не стесняйтесь указывать на них, и я буду формировать их соответственно


Я использую JRPGish стиль игры в Java, используя BlueJ. Я не стремился к массовому росту, и я делаю это скорее как доказательство концепции, чем полноценную игру.

Пока все идет хорошо. У меня есть спрайт-анимация, работающая с использованием листа спрайтов, и игрок может ходить со спрайтом, изменяя правильную анимацию в зависимости от направления.

Однако у меня возникает проблема, когда игрок перестает двигаться - иногда это изображение после предыдущего кадра. Справедливости ради, это может происходить все время, за исключением того, что вы не видите его, если игрок перестает перемещаться по первому и последнему кадру ходячие анимации, поскольку они занимают одно и то же пространство пикселей и, следовательно, скрыты (если это имеет смысл)

Вот изображение проблемы в действии:

Изображение 174551

Это после того, как игрок переместился, а затем остановился, оставив последний кадр спрайта "moveRight".


Я создал небольшую версию моего проекта, у которой есть только анимация персонажа, когда вы нажимаете клавишу, и останавливаетесь при отпускании, в котором появляется проблема

Скелетный класс

Класс символов

Класс GameManager

Класс KeyManager

Чтобы запустить игру, запустите метод Main в GameManager

Вам нужно сохранить это изображение с именем файла "James.png" и поместить его в ту же папку проекта java, чтобы он работал

Изображение 174551

Заранее благодарим за предоставленную помощь.

Теги:
swing
bluej

1 ответ

3
Лучший ответ

paintComponent() передает Graphics на drawCharactor(). drawCharactor() не должен использовать этот объект Graphics если вы не сделали копию, эта Graphics является общей.

Кроме того, не вызывайте repaint() из drawCharactor(). repaint() назначает другой цикл рисования. Вы уже вызываете repaint() из таймера.

Не используйте java.util.Timer используйте javax.swing.Timer для рисования Swing. См. Раздел Использование таймеров поворота

Дополнительные сведения и примеры Выполнение пользовательской живописи и рисования в AWT и Swing.

Рассмотрите возможность публикации минимального примера.

  • 0
    О, боже, этот перекрас не должен быть в drawCharactor. Я оставил это там, когда ложился спать прошлой ночью, когда играл с ним, чтобы посмотреть, может ли это исправить (это упоминалось в статье где-то). Спасибо, я попробую ваш ответ сейчас и посмотрю, поможет ли это.
  • 0
    Ваш комментарий о таймере интересен - я узнал о том, как делать анимацию таймера в java, из этого: zetcode.com/tutorials/javagamestutorial/animation Цитата: «В первом примере мы будем использовать таймер Swing для создания анимации. Это самый простой, но также наименее эффективный способ анимации объектов в Java-играх ». Я посмотрю на это больше, так как это программирование в конце концов :)
Показать ещё 11 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню