2017-02-15 2 views
-1

Ich habe versucht, eine Antwort zu finden, um das Problem zu lösen, aber ich denke, dass ich nicht zu verstehen, wie man die lange drücken Sie in Libgdx verwenden.Libgdx - Wie benutzt man "Long Press"?

Ich möchte meinen Charakter nach rechts bewegen, wenn ich lange auf die rechte Hälfte des Bildschirms drücke und links, wenn ich lange auf die linke Hälfte des Bildschirms drücke.

Ich habe gesucht und versucht.

Hier ist meine InputHandler Klasse:

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; 
} 
} 

Und hier ist meine MainCharacter Klasse:

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; 
} 
} 

I verwendet onClick() Verfahren als Ersatz, bis ich eine Lösung für das Problem zu finden . Es funktioniert gut, aber es hat nicht die gleiche Wirkung wie die lange drücken. Mein Charakter bewegt sich nach links, wenn ich auf die linke Seite des Bildschirms klicke und nach rechts, wenn ich auf die rechte Seite des Bildschirms klicke. Aber natürlich funktioniert es nicht, wenn ich lange drücke.

Also wie kann ich 'Long Press' verwenden?

Ich würde Ihre Hilfe wirklich schätzen.

Antwort

1

Gok aus ul gibt einen schönen Überblick über den GestureListener, aber ich glaube nicht, dass Sie das suchen. LongPress in der Tat registriert nur nach einigen Sekunden drücken und Sie möchten eine Berührung haben, um den Charakter sofort zu steuern.

Es gibt keine Out-of-the-Box-Methode in den Zuhörern zu erfassen, berührt, aber Sie können es selbst erstellen.

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 
    } 
} 

Überprüfen Sie dies für jeden Rahmen und machen Sie Ihre Logik.

+0

Also sollte dies außerhalb longPressed sein? –

+0

Es sollte in die Update-Schleife gehen. Longpress wird nur einmal nach längerem Halten gerufen. – Madmenyo

+0

DANKE !!! ES FUNKTIONIERTE!!! –

0

Sie können den langen Druck implementieren, indem Sie die Schnittstelle GestureListner implementieren.

GestureDetector lassen Sie die folgenden Gesten erkennen:

touchDown: Ein Benutzer den Bildschirm berührt.

longPress: Ein Benutzer berührt den Bildschirm für einige Zeit.

tap: Ein Benutzer berührt den Bildschirm und hebt den Finger erneut. Der Finger darf sich nicht außerhalb eines bestimmten quadratischen Bereichs um die anfängliche Berührungsposition bewegen, damit ein Tipp registriert wird. Mehrere aufeinander folgende Taps werden erkannt, wenn der Benutzer innerhalb eines bestimmten Zeitintervalls Taps durchführt.

pan: Ein Benutzer zieht einen Finger über den Bildschirm. Der Detektor meldet die aktuellen Berührungskoordinaten sowie das Delta zwischen der aktuellen und der vorherigen Berührungsposition. Nützlich, um das Kameraschwenk in 2D zu implementieren. panStop: Wird aufgerufen, wenn nicht mehr geschwenkt wird.

fling: Ein Benutzer zog den Finger über den Bildschirm und hob ihn an. Nützlich zum Implementieren von Wischgesten.

: Ein Benutzer legt zwei Finger auf den Bildschirm und bewegt sie zusammen/auseinander. Der Detektor meldet sowohl den anfänglichen als auch den aktuellen Abstand zwischen Fingern in Pixeln. Nützlich, um Kamera-Zoom zu implementieren.

pinch: Ähnlich wie bei Zoom. Der Detektor meldet die anfängliche und aktuelle Fingerposition anstelle der Entfernung. Nützlich für das Zoomen von Kameras und komplexere Gesten wie zum Beispiel Drehen.

Ein GestureDetector ist ein Event-Handler.Um auf Gesten zu hören, muss man die Schnittstelle GestureListener implementieren und an den Konstruktor der GestureDetector übergeben. Der Detektor wird dann eingestellt, als InputProcessor, entweder auf einem InputMultiplexer oder als Haupt 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() { 
    } 
} 

Sie haben die GestureDetector einstellen, dass Ihr enthält GestureListener als die InputProcessor:

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

Weitere Details , überprüfen Sie den Link unten

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

+0

also sollte ich meine Eingabe-Handler und OnClick-Methode löschen? –

+0

Nun, alles läuft gut, aber wie kann ich meinen Charakter nach links bewegen lassen, wenn lange auf die linke Hälfte gedrückt und rechts wenn lange auf die rechte gedrückt wird? Wie kann ich die Entfernung erhöhen, wenn sich die Zeit oder die Dauer der Presse erhöht? –

+0

Anstatt den Eingangsprozessor zu implementieren, versuchen Sie den GestedDetector zu implementieren und folgen Sie bitte dem Link, den ich gepostet habe. Für mehr Referenz bitte gehen Sie über den Link https://github.com/libgdx/libgdx/wiki/Gesture-detection –