Android: перемещение в космос после выпуска с помощью libgdx / универсального движка

Я участвую в использовании libgdx с универсальным движком tween и не могу понять, как нажимать (или нажимать на приложение для рабочего стола) точку на экране и перемещать текстуру до касания Не поддерживая прикосновение или щелчок, пока не будет достигнута конечная точка.

Когда инициируется событие касания, начинается анимация, и изображение перемещается в направлении местоположения. Графика будет следовать указателю пальца / указателя мыши, если начнется касание и перетаскивание. Если я коснусь точки, графический объект будет перемещаться в направлении точки до тех пор, пока сенсор не будет отпущен. Затем он останавливается там, где он был при нажатии.

Я смотрю на touch-and-release, и этот графический переход к затронутой точке, и, вероятно, не понимаю ничего о реализации движка tween. Я вставил код подкачки ниже.

public void render() { camera.update(); batch.setProjectionMatrix(camera.combined); batch.begin(); batch.draw(texture.getTexture(), texture.getBoundingBox().x, texture.getBoundingBox().y); batch.end(); Tween.registerAccessor(Plane.class, new TextureAccessor()); TweenManager planeManager = new TweenManager(); float newX = 0; float newY = 0; boolean animateOn = false; if(Gdx.input.isTouched()) { newX = Gdx.input.getX(); newY = Gdx.input.getY(); animateOn = true; } if (animateOn == true && (texture.getX() != newX || texture.getY() != newY)) { Tween.to(texture, TextureAccessor.POSITION_XY, 10) .target(newX, newY) .ease(TweenEquations.easeNone) .start(planeManager); planeManager.update(1); if (texture.getX() == newX && texture.getY() == newY) { animateOn = false; } } } 

Первоначально у меня был код isTouched() внутри условного isTouched() и не использовал newX , newY или animateOn . Я думал, что используя isTouched() чтобы установить только новые координаты и состояние анимации, тогда цикл запускает анимацию. Более старый код выглядел так:

  if(Gdx.input.isTouched()) { newX = Gdx.input.getX(); newY = Gdx.input.getY(); Tween.to(texture, TextureAccessor.POSITION_XY, 10) .target(newX, newY) .ease(TweenEquations.easeNone) .start(planeManager); planeManager.update(1); } 

Я также пробовал использовать justTouched() , но графический justTouched() только слегка двигался к затронутой точке.

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

Благодарю.

     Tween.registerAccessor(Plane.class, new TextureAccessor()); TweenManager planeManager = new TweenManager(); 

    Эти две строки должны идти в методе create() , а не в render() ! Здесь вы создаете нового менеджера на каждом фрейме, вам нужен только один менеджер, вот и все, а не армия!

    Кроме того, вам нужно обновить менеджер на каждом фрейме, а не только когда animateOn истинно, иначе вам нужно будет держать палец нажатым …

    Правильный код выглядит следующим образом, узнайте из него, вы получите лучшее представление о том, как работает движок Tween 🙂

     // Only one manager is needed, like a Spritebatch private TweenManager planeManager; public void create() { Tween.registerAccessor(Plane.class, new TextureAccessor()); planeManager = new TweenManager(); } public void render() { // The manager needs to be updated on every frame. planeManager.update(Gdx.graphics.getDeltaTime()); camera.update(); batch.setProjectionMatrix(camera.combined); batch.begin(); batch.draw(texture.getTexture(), texture.getBoundingBox().x, texture.getBoundingBox().y); batch.end(); // When the user touches the screen, we start an animation. // The animation is managed by the TweenManager, so there is // no need to use an "animateOn" boolean. if (Gdx.input.justTouched()) { // Bonus: if there is already an animation running, // we kill it to prevent conflicts with the new animation. planeManager.killTarget(texture); // Fire the animation! :D Tween.to(texture, TextureAccessor.POSITION_XY, 10) .target(Gdx.input.getX(), Gdx.input.getY()) .ease(TweenEquations.easeNone) .start(planeManager); } } 

    Я пытался реализовать это поведение неправильно. Вместо использования isTouched или justTouched() мне нужно было использовать touchDown() из GestureListener .

    Я создал класс, который реализовал GestureDetector (назовите его touchListener() ) внутри моего основного класса (тот, который реализует ApplicationLisetener) в главном проекте libgdx, и поместил код захвата x и y внутри toucDown (я заметил, что tap() также был Запускается). Я переместил функции твинов (фактическое tweening, вызов registerAccessor() и создание нового менеджера touchListener() update() метод update() touchListener() .

    Я добавил вызов функции обновления touchListener() внутри цикла render() основного класса libgdx.

    Я сомневаюсь, что я сделал это, это лучший способ, но я надеюсь, что это поможет кому-то еще в будущем.