Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 15.07.2019
Сообщений: 9
1

Объект двигается слишком быстро keyPressed\keyReleased

19.10.2020, 17:48. Показов 860. Ответов 4

Author24 — интернет-сервис помощи студентам
Приветствую!
Нашел сайт про LibGDX, но решил разобраться вначале на более простых примерах с графикой и попытками создать что-то свое.

Статья "Создание игры на Java" на medium.com была быстро перекатана в IDE и все бы ничего, если не фигурка, которая перемещается со скоростью света.


"Друг", прикрепленный в миниатюре, должен перемещаться на 1 единицу. А он улетает с бешенной скоростью в конец экрана(раньше за пределы его. Потом, если удается, промелькнет пролетая обратно, может удастся затормозить в видимой области беспорядочно тыкая стрелки <-\->).

Вот код keyPressed\keyReleased - вроде все как у всех. в консоль пишет: Left TRUE! и тут же Left FALSE! - т.е. отпускание обрабатывается! только фигурка уже э... улетела за 1000 пикселей\единиц вперед кудато. Что это? слишком быстрая отрисовка? т.е. между кратковременным нажатием и тут же отпусканием - происходит 1000 раз "x += 1"?
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private class KeyInputHandler extends KeyAdapter {
        @Override
        public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_LEFT){
                    leftPressed = true;
                    System.out.println("Left TRUE!");
                }
                if (e.getKeyCode() == KeyEvent.VK_RIGHT){
                    System.out.println("Right TRUE!");
                    rightPressed = true;
                }
        }
        @Override
        public void keyReleased(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_LEFT){
                System.out.println("Left FALSE!");
                leftPressed = false;
            }
            if (e.getKeyCode() == KeyEvent.VK_RIGHT){
                System.out.println("Rigtht FALSE!");
                rightPressed = false;
            }
        }
    }


Вот метод update() - обновляет координаты.
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
  public void update(long delta) {
        if (leftPressed == true){
            x -= 1;
        }
               
        if (rightPressed == true){
           x += 1;
        }
    }


Вот метод run() в котором update() вызывается перед отрисовкой render()
long delta -почему то в статье не используется. Да и статья на этом оканчивается - но остальное можно скопипастить с других статей\примеров.
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
@Override
    public void run() {
        long lastTime = System.currentTimeMillis();
        long delta;
 
        while (running){
            delta = System.currentTimeMillis() - lastTime;
            lastTime = System.currentTimeMillis();
            update(delta);
            render();
        }
    }



пробовал в update() в обновлении координат делать условие If (delta > 1) хотя бы - перемещается плавно, но только после отпускания стрелки влево фигурка продолжает двигаться влево столько, сколько накопилось событий видимо в "буфере" нажатий(?) и не реагирует на другое нажатие.(считай подвисла на какое-то время)

Временно помогло в итоге:
Java
1
2
3
4
5
6
7
8
9
10
public void update(long delta) {
 
        if (leftPressed == true){
            x -= 1;
            try {
                Thread.sleep(30L);
            } catch (InterruptedException interruptedException) {
                interruptedException.printStackTrace();
            }
... ...
Но разве оно так должно быть? тормозить поток?? на целых 30 мс?
(гугл подсказал вызывать System.currentTimeMillis() и смотреть разницу с последним "движением" х++; или с последним нажатием у keyPressed - ничего особо не вышло из этого)
Миниатюры
Объект двигается слишком быстро keyPressed\keyReleased  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.10.2020, 17:48
Ответы с готовыми решениями:

Не двигается объект при нажатии
Картинка должна двигаться в сторону, но не двигается почему-то, подскажите плз в чём проблема...

Почему у меня шар двигается так быстро ?
uses graphAbc; var i : integer; begin setwindowsize(900,700); for i:=30 to 870 do...

Делаю игру про НЛО, персонаж двигается очень быстро
Добрый день, я как новичок, решил создать учебный проект про НЛО (нужно ходить стрелками...

Всё работает слишком быстро
В общем проблема такая: недавно на моём компьютере время стало идти медленнее, я погуглил и узнал,...

4
Модератор
Эксперт Java
2558 / 1094 / 375
Регистрация: 11.08.2017
Сообщений: 3,332
19.10.2020, 21:26 2
Скажу пару слов про libgdx, он использует старые версии библиотек, порой прилично старые, например lwjgl 2 версии которая уже legacy/deprecated (2015 год) когда уже везде используется 3 (не новая но новее, 2019 год). Эта библиотека отвечает за окно, графику, звук. Мне кажется можно получше движок выбрать, хотя libgdx обладает кроссплатформенностью (android ios web), например jmonkey engine.
А вообще игры писать на джаве не очень решение.
В игре на чистой джаве можно обойтись без бесконечного цикла, либо вообще без, либо таймером например
1
0 / 0 / 0
Регистрация: 15.07.2019
Сообщений: 9
20.10.2020, 01:33  [ТС] 3
alecss131
Спасибо за libgdx - с него я думал попробовать, но что-то установка АндроидСДК через студию + сам ЛибГДХ не внушили уверенности в первом шаге.
lwjgl 2 - тоже натыкался, но по libgdx есть туториал на сайте пошаговый к простенькой игрушке. про lwjgl 2 пока ничего не слышал.
----------------------------------------------------------------------

В итоге - полазил по форуму, нашел упоминание в похожей проблеме - забей и поставь Thread.sleep(1000) - что слишком много для меня, пока обхожусь 30 мс.
Воткнул задержку в метод run(), после render'a поставил. И вроде стало терпимо в плане дерганья, шаг движения остановил на 4 ед.
Раскидал все по классам так, как умею, это я и хотел, посмотреть что получится на простеньком примере, а не с пошаговой инструкцией в руках.
По идее надо как-то переделывать задержку потока на таймер, тоже читал про это где-то. Ну и добавлять логики взаимодействия с объектами.
Пока у меня просто чувак с ведром носится. Типа капли собирает )))) прикрепил GIF'ку ниже...
Миниатюры
Объект двигается слишком быстро keyPressed\keyReleased  
0
Модератор
Эксперт Java
2558 / 1094 / 375
Регистрация: 11.08.2017
Сообщений: 3,332
20.10.2020, 10:55 4
А зачем вам андроид студио? Если хотите писать под андроид то изучайте сразу андроид. В случае с андроидом swing/awt а так же lwjgl в пролете, так как у него своя система графики, там вроде даже не нужен цикл/таймер, так как есть уже готовый метод вызываемый постоянно.
Вот 2DGameBox.7z пример игры на lwjgl 3 (opengl 4.5) + box2d (физический движок из angry birds), я только особо не настраивал физику, потому так все странно)) LWJGL это по сути графическая библиотека (для пк только), и кучу всего придется писать самому, например всю отрисовку графики (включая выгрузку геометрии и текстур на видеокарту и вызовы отрисовки). В этом проекте у меня используется довольно стандартный скелет игр (не только на джаве, на любом языке используя графические апи). По lwjgl могу порекомендовать разве что уроки по opengl/vulkan на других языках, так как lwjgl это по сути привязка этих апи к джаве и все.
0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
21.10.2020, 09:10 5
движок 2D платформера на чистом java (уровни, мобы, боссы, анимация, диалоги)
Java самодостаточный язык для игр, там есть все что нужно
Миниатюры
Объект двигается слишком быстро keyPressed\keyReleased   Объект двигается слишком быстро keyPressed\keyReleased  
0
21.10.2020, 09:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.10.2020, 09:10
Помогаю со студенческими работами здесь

Перерисовка в while выполняется слишком быстро
Есть код для перерисовки, он выполняется автоматически в while, но очень быстро, что не возможно...

Слишком быстро работает DosBox
Запускал DosBox на ноуте и скорость была нормальная(секунда=секунде), а на компе DosBox работает...

Слишком быстро уходит окно вывода
После компиляции слишком быстро уходит окно вывода, задерживаясь буквально на секунду. Прочитать...

MediaPlayer, слишком быстро воспроизводится видео
видео воспроизводится в панели, но видео слишком быстро воспроизводится... почему ? может...

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

Что то Яша слишком быстро клеит
Что то непойму. Смотрю бэки - картина такая: Результат поиска: страниц — 59 257, сайтов — &lt;b&gt;не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru