2017-09-13 5 views
1

Essayer de faire un simple jeu de frappe. J'ai créé un clavier consistant en LibGDX scene2d TextButtons et en les mettant dans 3 Tables scene2d (pour chaque rangée de clés) et en les enveloppant dans une autre Table. Voici le code à ce jour:Clavier primitif LibGDX avec un écouteur pour chaque touche

Gdx.input.setInputProcessor(stage); 

Table keyboard = new Table(); 
Table keysTop = new Table(); 
Table keysMid = new Table(); 
Table keysBot = new Table(); 

final char ascii[] = {'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', 
      'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 
      'Z', 'X', 'C', 'V', 'B', 'N', 'M'}; 

// create all keys in order of the ascii[] table above 
for (int index = 0; index < ascii.length; index++) { 
    keys[index] = new TextButton("", skin); 
    String letter = Character.toString(ascii[index]); 
    keys[index].setText(letter); 
    keys[index].setSkin(skin); 

    // and put them in correct rows 
    if (index < 10) 
     keysTop.add(keys[index]).width(keySize).height(keySize + 5).pad(2); 
    else if (index < 19) 
     keysMid.add(keys[index]).width(keySize).height(keySize + 5).pad(2); 
    else 
     keysBot.add(keys[index]).width(keySize).height(keySize + 5).pad(2); 
} 

// add each row of keys to the keyboard Table 
keyboard.add(keysTop).pad(5).expandX().fill().row(); 
keyboard.add(keysMid).pad(5).expandX().fill().row(); 
keyboard.add(keysBot).pad(5).expandX().fill().row(); 

stage.addActor(keyboard); 

Maintenant, je voudrais ajouter les auditeurs à chaque clé, de préférence dans une boucle. Mettre le code suivant à la fin de la boucle:

keys[index].addListener(new ChangeListener() { 
    @Override 
    public void changed(ChangeEvent event, Actor actor) { 
     System.out.println(letter); 
    } 
}); 

ne compile pas à cause de l'erreur « Variable « lettre » est accessible à partir de la classe interne, doit être déclarée finale ». Quelle est la solution préférée (ou la plus simple si on préfère la mettre en œuvre pour un débutant) ici?

Répondre

0
  • déclare letter chaîne comme final

ou

  • nom de l'ensemble de keys[index] TEXTBUTTON par setName(String name) et à l'intérieur méthode modifiée d'extraction targetListener nom en utilisant l'événement.
+0

Déclarer la variable comme finale a fonctionné. Auparavant, je supposais qu'il ne pouvait pas être défini comme final, car les variables finales ne devraient pas changer. Ai-je raison de penser que dans cette situation cela fonctionne, parce que je déclare de nouveau cette variable à chaque passage de la boucle for? – elesmod