2016-03-16 2 views
0

Я только что начал небольшой проект с помощью libgdx, и я заметил, что камера немного отстает от мыши. Я двигаюсь это так: (я вырезал все остальное)Перемещение камеры без запаздывания в libgdx

@Override 
public boolean touchDown(int screenX, int screenY, int pointer, int button) { 
    screenXlast = screenX; 
    screenYlast = screenY; 

    if (button == Input.Buttons.RIGHT || pointer > 0) { 
     rightMouseKlicked = true; 

    return true; 
} 


@Override 
public boolean touchUp(int screenX, int screenY, int pointer, int button) { 
    if (button == Input.Buttons.RIGHT) { 
     rightMouseKlicked = false; 
    } 

    return false; 
} 

@Override 
public boolean touchDragged(int screenX, int screenY, int pointer) { 

    if (rightMouseKlicked) { 

     gamecam.translate((screenXlast - screenX) * gamecam.zoom, (screenY - 
      screenYlast) * gamecam.zoom); 

    } 
    screenXlast = screenX; 
    screenYlast = screenY; 
    return false; 
} 

Игра работает на 60fps, но кажется, что выход задерживается на несколько кадров. (курсор мыши не остается на том же месте на карте при перемещении)

Есть ли другой способ сделать это, чтобы камера оставалась с мышью?

+0

gamecam.translate ((screenXlast - screenX) * gamecam.zoom, (screenY - screenYlast) * gamecam.zoom) отсутствует значение дельта, чтобы исправить ваши преобразования в соответствии с фактическим fps. Несмотря на то, что может возникнуть другая причина вашей проблемы, вы всегда должны применять дельта к своим преобразованиям. – Jankapunkt

+0

Просьба показать метод 'resize'. – Tenfour04

+0

Что вы имеете в виду методом изменения размера? – NuclearVirus

ответ

0

Насколько я знаю, события в libgdx входят в стек. Через какое-то время после этого события можно получить событие.

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

Как сказал @Jankapunkt, вы можете попробовать умножение позиции по времени дельты (Gdx.graphics.getDeltaTime()), но я не уверен, что это поможет

+0

Зачем мне нужна дельта, если она не зависит от нее? На каждом кадре, независимо от того, сколько времени требуется для рендеринга, я хочу, чтобы камера перемещалась так же сильно, как мышь. Мой код работает отлично, и вы можете полностью перетащить карту, но единственная проблема в том, что она настолько лаги. Я уверен, что это не имеет никакого отношения к «отсутствующей» дельте. EDIT: Ups это был ответ на другой комментарий. Неправильная кнопка – NuclearVirus

+0

Когда я умножаю amout пикселей, она перемещалась с момента последнего кадра (я думаю, это то, что вы подразумеваете, умножая позицию). Это может улучшить изображение с помощью мыши, но когда вы остановите мышь, это перевернет. Я не хочу этого. В других играх/программах вы можете перемещать вещи с помощью мыши без задержек. Разве это невозможно вообще с libgdx? – NuclearVirus

+0

Невозможно получить самые новые входы в очереди и игнорировать остальные? Это должно быть возможно. В окнах, когда вы перемещаете окна вокруг, они отлично подходят к мыши. – NuclearVirus

0

Вы подсчитываете пиксели экрана перемещаемых , но не масштабируется до размера окна просмотра вашей камеры. Измените его, как показано:

public boolean touchDragged(int screenX, int screenY, int pointer) { 

    if (rightMouseKlicked) { 
     float scale = gamecam.zoom * gamecam.viewportWidth/(float)(Gdx.graphics.getWidth); 
     gamecam.translate((screenXlast - screenX) * scale , (screenY - 
      screenYlast) * scale); 

    } 
    screenXlast = screenX; 
    screenYlast = screenY; 
    return false; 
} 

Также имейте в виду, что скорость обновления типичной мыши является довольно низким (около 10 кадров в секунду, я думаю). Если вы обнаружите, что движение камеры слишком резкое, вам нужно будет вычислить скорость перемещения мыши и экстраполировать положение мыши и добавить к этому алгоритм сглаживания. See here for discussion (3D, но в целом применяется).

+0

Ваш код дает те же результаты, что и мой. Я масштабировал его, используя gamecam.zoom. – NuclearVirus

+0

Я снял его сейчас с телефона. При приостановке видео вы можете увидеть 5 последних курсоров, и вы можете ясно видеть, что карта отстает на 3 кадра, что составляет 50 мс. – NuclearVirus

+0

О, и мышь обновлена ​​с той же частотой кадров, что и графика. Я помещаю этот код внутрь touchDragged(): System.out.println (1.0/((double) (System.nanoTime() - lastTime)/1000000000.0)); lastTime = System.nanoTime(); и он печатает те же цифры, что и показанные fraps. – NuclearVirus

Смежные вопросы