2017-02-15 7 views
-1

Я попытался найти ответ, чтобы решить проблему, но я думаю, что, похоже, я не понимаю, как использовать длинную печать в Libgdx.Libgdx - Как использовать "Long Press"?

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

Я искал и попробовал.

Вот мой InputHandler класс:

public class InputHandler implements InputProcessor { 
private MainCharacter myMainCharacter; 

public InputHandler(MainCharacter mainCharacter) { 
    myMainCharacter = mainCharacter; 
} 

@Override 
public boolean keyDown(int keycode) { 
    return false; 
} 

@Override 
public boolean keyUp(int keycode) { 
    return false; 
} 

@Override 
public boolean keyTyped(char character) { 
    return false; 
} 

@Override 
public boolean touchDown(int screenX, int screenY, int pointer, int button) { 
    myMainCharacter.onClick(); 
    return false; 
} 

@Override 
public boolean touchUp(int screenX, int screenY, int pointer, int button) { 
    return false; 
} 

@Override 
public boolean touchDragged(int screenX, int screenY, int pointer) { 
    return false; 
} 

@Override 
public boolean mouseMoved(int screenX, int screenY) { 
    return false; 
} 

@Override 
public boolean scrolled(int amount) { 
    return false; 
} 
} 

А вот мой MainCharacter класс:

public class MainCharacter { 

private Vector2 position; 
private Vector2 velocity; 
private Vector2 acceleration; 

private float rotation; 
private int width; 
private int height; 

public MainCharacter(float x, float y, int width, int height) { 
    this.width = width; 
    this.height = height; 
    position = new Vector2(x, y); 
    velocity = new Vector2(0, 0); 
    acceleration = new Vector2(0, 460); 
} 

public void update(float delta) { 
    velocity.add(acceleration.cpy().scl(delta)); 

    if (velocity.y > 200) { 
     velocity.y = 200; 
    } 

    position.add(velocity.cpy().scl(delta)); 
} 

public void onClick() { 
    if (Gdx.input.getX() <= 135) { 
     Gdx.app.log("TAG", "LEFT"); 
     position.x--; 
    } else if (Gdx.input.getX() >= 137) { 
     Gdx.app.log("TAG", "RIGHT"); 
     position.x++; 
    } 
} 

public float getX() { 
    return position.x; 
} 

public float getY() { 
    return position.y; 
} 

public float getWidth() { 
    return width; 
} 

public float getHeight() { 
    return height; 
} 

public float getRotation() { 
    return rotation; 
} 
} 

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

Так как я могу использовать «Длинное нажатие»?

Я был бы очень признателен за вашу помощь.

ответ

1

Гок ul дает хороший обзор GestureListener, но я не верю, что это то, что вы ищете. LongPress действительно регистрируется только после нескольких секунд нажатия, и вы хотите иметь сенсорный контроль персонажа сразу.

В слушателях не существует метода, позволяющего отслеживать, но вы можете создать его самостоятельно.

if (Gdx.input.isTouched()) 
{ 
    //Finger touching the screen 
    // You can actually start calling onClick here, if those variables and logic you are using there are correct. 
    if (Gdx.input.getX() >= screenSize/2) 
    { 
    //Right touched 
    } 
    else if (Gdx.input.getX() < screenSize/2) 
    { 
    //Left touched 
    } 
} 

Просто проверьте для этого каждый кадр и выполните свою логику.

+0

Так что это должно быть снаружи longPressed? –

+0

Он должен перейти в цикл обновления. Longpress вызывается только один раз после удержания в течение некоторого времени. – Madmenyo

+0

СПАСИБО !!! ЭТО СРАБОТАЛО!!! –

0

Вы можете реализовать длительное нажатие, реализовав интерфейс GestureListner.

GestureDetector позволит вам обнаружить следующие жесты:

touchDown: пользователь касается экрана.

longPress: Пользователь некоторое время прикасается к экрану.

tap: Пользователь касается экрана и снова поднимает палец. Палец не должен перемещаться за пределы указанной квадратной области вокруг начального положения касания, чтобы кран был зарегистрирован. Несколько последовательных отводов будут обнаружены, если пользователь выполнит отводы в течение заданного интервала времени.

pan: Пользователь перетаскивает палец по экрану. Детектор будет сообщать о текущих координатах касания, а также дельта между текущими и предыдущими касаниями. Полезно для реализации панорамирования камеры в 2D. panStop: Вызывается, когда больше не выполняется панорамирование.

fling: Пользователь перетащил палец по экрану, а затем поднял его. Полезно для реализации жестов салфетки.

zoom: Пользователь размещает два пальца на экране и перемещает их друг/друг друга. Детектор будет сообщать как начальное, так и текущее расстояние между пальцами в пикселях. Полезно для масштабирования камеры.

pinch: Аналогично масштабированию. Детектор будет сообщать начальные и текущие позиции пальцев вместо расстояния. Полезно для реализации масштабирования камеры и более сложных жестов, таких как вращение.

A GestureDetector является обработчиком событий.Чтобы прослушивать жесты, необходимо реализовать интерфейс GestureListener и передать его конструктору GestureDetector. Затем детектор устанавливается как InputProcessor, либо на InputMultiplexer или в качестве основного InputProcessor:

public class MyGestureListener implements GestureListener{ 

    @Override 
    public boolean touchDown(float x, float y, int pointer, int button) { 

     return false; 
    } 

    @Override 
    public boolean tap(float x, float y, int count, int button) { 
     return false; 
    } 

    @Override 
    public boolean longPress(float x, float y) { 
     return false; 
    } 

    @Override 
    public boolean fling(float velocityX, float velocityY, int button) { 
     return false; 
    } 

    @Override 
    public boolean pan(float x, float y, float deltaX, float deltaY) { 
     return false; 
    } 

    @Override 
    public boolean panStop(float x, float y, int pointer, int button) { 
     return false; 
    } 

    @Override 
    public boolean zoom (float originalDistance, float currentDistance){ 
     return false; 
    } 

    @Override 
    public boolean pinch (Vector2 initialFirstPointer, Vector2 initialSecondPointer, Vector2 firstPointer, Vector2 secondPointer){ 
     return false; 
    } 

    @Override 
    public void pinchStop() { 
    } 
} 

Вы должны установить GestureDetector, который содержит ваш GestureListener как InputProcessor:

 Gdx.input.setInputProcessor(new GestureDetector(new MyGestureListener())); 

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

https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/input/GestureDetector.GestureListener.html

+0

поэтому я должен удалить свой обработчик ввода и метод onClick? –

+0

Хорошо, все идет хорошо, но как я могу заставить своего персонажа двигаться влево, если долго нажимать на левую половину и вправо, если долго нажать на правую половину? Как я могу увеличить расстояние, перемещаемое по мере увеличения времени или продолжительности увеличения давления? –

+0

вместо внедрения входного процессора попробуйте реализовать gestureDetector и, пожалуйста, следуйте по ссылке, которую я разместил. для получения дополнительной справки перейдите по ссылке https://github.com/libgdx/libgdx/wiki/Gesture-detection –

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

  • Нет связанных вопросов^_^