2017-06-01 5 views
6

Ich habe Probleme mit InputProcessor nur auf meinem IOS Build. Dieser Code funktioniert für Desktop- und Android-Builds, jedoch nicht für iOS.libgdx: IOS auf der Bildschirmtastatur nicht feuern Ereignisse konsequent

Grundsätzlich muss ich ein Ereignis abfangen, wann immer der Benutzer auf der Bildschirmtastatur eingibt. Aber in iOS sehe ich nur mein println für keyTyped intermittierend und nur wenn ich auf der Bildschirmtastatur schnell tippe. Alle anderen Berührungen zeigen nur eine neue Zeile in der Konsole, ich bin mir nicht sicher, woher diese neue Zeilenausgabe stammt.

Das Problem scheint jedoch davon herrühren, dass iOS Ereignisse zurück zu meiner Anwendung sendet und wie LibGDX InputProcessor sie empfängt. Ich habe versucht, ein eigenes Objekt zu erstellen, das TextField erweitert und InputProcessor implementiert, und dann die Instanz dieses Objekts als EingabeProzessor festlegen, aber ich bekomme das gleiche Ergebnis. Wenn ich irgendwo auf dem Bildschirm berühre, der nicht die iOS-Bildschirmtastatur ist, erhalte ich Ereignisse, die konsistent sind.

Dies ist, was die iOS-Konsole Ausgabe wie folgt aussieht, wenn ich sehr schnell ein, wenn ich die println nie verlangsamen Typ auftaucht:

game name field key typed! 


game name field key typed! 






game name field key typed! 

die gleiche Sache auf einem Android-Gerät tun (Nexus 7) Erträge folgendes (was ist das, was ich erwarten würde):

I/System.out: game name field key down! 
I/System.out: game name field key up! 
I/System.out: game name field key typed! 
I/System.out: game name field key down! 
I/System.out: game name field key up! 
I/System.out: game name field key typed! 
I/System.out: game name field key down! 
I/System.out: game name field key up! 
I/System.out: game name field key typed! 

hier ist mein Code:

public class AccountScreen implements Screen { 


final PieTherapy game; 
private Stage stage; 

private TextField gameNameField; 

public AccountScreen(final PieTherapy game) { 
    this.game = game; 
    initialize(); 
} 

private void initialize() { 

    Viewport vp = new StretchViewport(PieTherapy.WORLD_WIDTH, PieTherapy.WORLD_HEIGHT, game.cam); 
    stage = new Stage(vp); 

    Gdx.input.setInputProcessor(stage); 

    TextField.TextFieldStyle tfs = new TextField.TextFieldStyle(); 
    tfs.font = game.fontTitle; 
    tfs.fontColor = Color.WHITE; 
    tfs.background = new TextureRegionDrawable(new TextureRegion(game.assets.get("menus/textline.png", Texture.class))); 
    tfs.focusedBackground = new TextureRegionDrawable(new TextureRegion(game.assets.get("menus/textline-selected.png", Texture.class))); 
    tfs.cursor = new TextureRegionDrawable(new TextureRegion(game.assets.get("menus/cursor.png", Texture.class))); 

    gameNameField = new TextField("", tfs); 
    gameNameField.setWidth(PieTherapy.WORLD_WIDTH * .80f); 
    gameNameField.setFocusTraversal(true); 
    gameNameField.setPosition(PieTherapy.WORLD_WIDTH *.05f, game.WORLD_HEIGHT * .68f); 
    // see if the player information has already been entered (edit mode) 
    gameNameField.setText(game.primaryPlayer.gameName); 
    gameNameField.addListener(new InputListener(){ 
     @Override 
     public void touchUp (InputEvent event, float x, float y, int pointer, int button) { 
      System.out.println("game name field touch up!"); 
     } 
     @Override 
     public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) { 
      System.out.println("game name field touch down!"); 
      return true; 
     } 

     @Override 
     public boolean keyDown(InputEvent event, int keycode) { 
      System.out.println("game name field key down!"); 
      return super.keyDown(event, keycode); 
     } 

     @Override 
     public boolean keyUp(InputEvent event, int keycode) { 
      System.out.println("game name field key up!"); 
      return super.keyUp(event, keycode); 
     } 

     @Override 
     public boolean keyTyped(InputEvent event, char character) { 
      System.out.println("game name field key typed!"); 
      return super.keyTyped(event, character); 
     } 
    }); 

    gameNameField.getOnscreenKeyboard().show(true); 
    gameNameField.setCursorPosition(gameNameField.getText().length()); 

    stage.addActor(gameNameField); 

    stage.setKeyboardFocus(gameNameField); 
} 

@Override 
public void show() { 

} 

@Override 
public void render(float delta) { 
    Gdx.gl.glClearColor(0, 0, 0f, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

    game.batch.begin(); 
    game.font.draw(game.batch, "Your name in the game! You can stick with the\nautomatically generated" + 
        "one or change to your own.\n Red: name is not available, " + 
        "green: available.", 
      PieTherapy.WORLD_WIDTH *.36f, 
      PieTherapy.WORLD_HEIGHT *.93f); 

    game.batch.end(); 

    update(delta); 
} 

private void update(float delta) { 

    stage.act(delta); 

    stage.draw(); 

    game.batch.begin(); 

    game.batch.end(); 

} 

@Override 
public void resize(int width, int height) { 

} 

@Override 
public void pause() { 

} 

@Override 
public void resume() { 

} 

@Override 
public void hide() { 

} 

@Override 
public void dispose() { 

} 
} 

Libgdx Version: 1.9.6 RoboVM (MobiDevelop) Version: 2.3.1

ich ich immer denke, kann meine eigenen On-Screen-Tastatur rollen ...

Antwort

2

Ich wollte nur einhüllen verfolgen jemand findet sich hier in der Zukunft. Ich habe am Ende meine eigene Bildschirmtastatur erstellt, ich konnte die Ereignisse nicht einheitlich in iOS verwenden.

Wenn jemand etwas hat, das sie in Zukunft hinzufügen möchten, werde ich einchecken, um die Antwort zu akzeptieren.