Dans cette série, nous créons un jeu du pendu pour la plate-forme Android. Jusqu'à présent, nous avons construit l'interface utilisateur de l'application, y compris les images, les dessins et les présentations. Dans cette troisième et dernière tranche, nous allons nous concentrer sur l'interaction utilisateur.
L'ajout d'interaction utilisateur au jeu implique plusieurs aspects, notamment la détection du fait que l'utilisateur gagne ou perd un jeu, ainsi que la réponse à chaque événement. Nous allons également ajouter un bouton d'aide à la barre d'action et ajouter la possibilité de naviguer dans le jeu.
Pour vous rafraîchir la mémoire, voici à quoi ressemblera le dernier jeu..
Comme nous l'avons vu dans le didacticiel précédent, l'activité du jeu présente la zone de la potence avec les six parties du corps dessinées à l'écran. Quand une nouvelle partie commence, les parties du corps doivent être cachées, en ne les montrant que lorsque l'utilisateur fait une mauvaise estimation. Ouvrez la classe d'activité du jeu et commencez par y ajouter les instructions d'importation suivantes..
importer android.app.AlertDialog; importer android.content.DialogInterface; importer android.support.v4.app.NavUtils; importer android.view.Menu; importer android.view.MenuItem; importer android.view.View; importer android.widget.ImageView;
Ensuite, déclarez cinq variables d'instance dans l'interface de la classe.
// images de parties du corps privées ImageView [] bodyParts; // nombre de parties du corps privées int numParts = 6; // partie courante - augmentera si de mauvaises réponses sont choisies private int currPart; // nombre de caractères dans le mot actuel private int numChars; // nombre correctement deviné privé int numCorr;
Vous pouvez modifier le nombre de parties du corps si, par exemple, vous souhaitez ajouter plusieurs niveaux de difficulté au jeu. En stockant la partie du corps actuelle (CurrPart
), nous pouvons ajouter une partie du corps à la fois au cas où le joueur ferait une mauvaise estimation. Nous utilisons le nombre de lettres du mot cible et le nombre de suppositions correctes pour suivre l'évolution du joueur dans le jeu en cours. Nous vérifions périodiquement si le joueur a gagné ou perdu la partie..
dans le onCreate
méthode de la classe d'activité du jeu, juste avant d'invoquer playGame
, nous instancions le tableau de vues et récupérons les images de parties du corps que nous avons placées dans la présentation. Cet extrait de code détermine également l’ordre dans lequel les parties du corps sont affichées lorsque le joueur fait une mauvaise estimation. Nous commençons par la tête et finissons par les jambes.
bodyParts = new ImageView [numParts]; bodyParts [0] = (ImageView) findViewById (R.id.head); bodyParts [1] = (ImageView) findViewById (R.id.body); bodyParts [2] = (ImageView) findViewById (R.id.arm1); bodyParts [3] = (ImageView) findViewById (R.id.arm2); bodyParts [4] = (ImageView) findViewById (R.id.leg1); bodyParts [5] = (ImageView) findViewById (R.id.leg2);
dans le playGame
méthode, ajoutez l'extrait de code suivant. Nous fixons CurrPart
à 0
, ensemble numChars
à la longueur du mot cible, et définissez numCorr
à 0
.
currPart = 0; numChars = currWord.length (); numCorr = 0;
Avant de commencer le jeu, les parties du corps doivent être cachées.
pour (int p = 0; p < numParts; p++) bodyParts[p].setVisibility(View.INVISIBLE);
La capture d'écran suivante montre à quoi le jeu devrait ressembler lorsqu'un nouveau jeu est sur le point de commencer.
Lorsque nous avons créé la disposition des boutons de lettre, nous avons déclaré sur clic
méthode. Ajoutons ceci à l'activité du jeu.
public void letterPressed (Afficher la vue) // l'utilisateur a appuyé sur une lettre pour le deviner
Lorsque le joueur appuie sur un bouton de lettre pour deviner, lettrePressée
reçoit une référence à la vue. Cela nous permet de déterminer quelle lettre le joueur a choisie. Pour savoir quelle lettre le joueur a tapée, nous utilisons l'extrait de code suivant.
String ltr = (vue (TextView)) .getText (). ToString ();
Ensuite, nous obtenons le caractère de la chaîne.
char letterChar = ltr.charAt (0);
Nous désactivons également le bouton de la lettre et mettons à jour le dessin d’arrière-plan pour indiquer au joueur que la lettre a déjà été lue.
view.setEnabled (false); view.setBackgroundResource (R.drawable.letter_down);
Dans l'étape suivante, nous parcourons les caractères du mot cible pour vérifier si le joueur doit deviner. Chaque lettre du mot cible est comparée à la conjecture du joueur. Si la réponse du joueur correspond à une lettre du mot cible, nous incrémentons numCorr
, ensemble correct
à vrai
pour indiquer que le joueur a bien deviné, et mettez à jour la couleur du texte de la lettre du blanc au noir pour la rendre visible. le pour
La boucle continue jusqu'à ce que chaque lettre du mot cible soit vérifiée. Ceci est important car une lettre peut apparaître plusieurs fois dans le mot cible..
booléen correct = faux; pour (int k = 0; k < currWord.length(); k++) if(currWord.charAt(k)==letterChar) correct = true; numCorr++; charViews[k].setTextColor(Color.BLACK);
Ensuite, nous devons vérifier si le joueur a gagné ou perdu après avoir deviné, ou s'il a fait une mauvaise estimation mais peut continuer. Toujours à l'intérieur lettrePressée
, commencez par vérifier si le joueur a bien deviné.
if (correct) // devine correctement
Si elle a bien deviné, vérifiez si elle a deviné toutes les lettres du mot cible.
if (numCorr == numChars) // l'utilisateur a gagné
Si cela est vrai, nous informons la joueuse qu'elle a gagné la partie. La première chose à faire est de désactiver les boutons de lettres. Nous faisons cela en implémentant une autre méthode d'assistance, disableBtns
. Implémenter cette méthode après lettrePressée
.
public void disableBtns () int numLetters = letters.getChildCount (); pour (int l = 0; l < numLetters; l++) letters.getChildAt(l).setEnabled(false);
Dans disableBtns
, nous parcourons les vues via l'adaptateur et désactivons chaque bouton. Si l'utilisateur a gagné le jeu, nous invoquons disableBtns
et afficher une boîte de dialogue d'alerte à l'utilisateur. Dans le dialogue d'alerte, nous demandons également au joueur s'il veut jouer à un autre jeu..
Prenez le temps de regarder par-dessus si vous n'êtes pas familier avec les dialogues sur Android. Nous définissons les propriétés, y compris le titre et un message incluant la confirmation de la réponse correcte. Nous ajoutons un bouton pour rejouer dans la boîte de dialogue d'alerte, qui appelle le playGame
méthode. Nous ajoutons également un bouton de sortie, qui ramène le joueur à l'activité principale.
if (numCorr == numChars) // Boutons de désactivation disableBtns (); // Afficher le dialogue d'alerte AlertDialog.Builder winBuild = new AlertDialog.Builder (this); winBuild.setTitle ("YAY"); winBuild.setMessage ("Vous gagnez! \ n \ nLa réponse était: \ n \ n" + currWord); winBuild.setPositiveButton ("Rejouer", nouvelle DialogInterface.OnClickListener () annulation publique onClick (boîte de dialogue DialogInterface, id int) GameActivity.this.playGame ();); winBuild.setNegativeButton ("Exit", nouveau DialogInterface.OnClickListener () public void onClick (dialogue DialogInterface, int id) GameActivity.this.finish ();); winBuild.show ();
Si l'utilisateur n'a pas gagné le jeu, nous devons vérifier si elle a mal répondu, mais il nous reste encore quelques suppositions. À l'intérieur de sinon si
bloquer, nous montrons la prochaine partie du corps et incrémentons le nombre de suppositions incorrectes avec 1
.
if (correct) // devine correctement else if (currPart < numParts) //some guesses left bodyParts[currPart].setVisibility(View.VISIBLE); currPart++;
Après le sinon si
, nous pouvons supposer en toute sécurité que le joueur a perdu la partie. Nous commençons par désactiver les boutons comme nous l'avons fait précédemment et nous affichons une boîte de dialogue d'alerte indiquant que le joueur a perdu la partie. Nous incluons également la réponse correcte et offrons la possibilité de jouer à un autre jeu..
else // l'utilisateur a perdu disableBtns (); // Afficher le dialogue d'alerte AlertDialog.Builder lostBuild = new AlertDialog.Builder (this); lostBuild.setTitle ("OOPS"); lostBuild.setMessage ("Vous perdez! \ n \ nLa réponse était: \ n \ n" + currWord); lostBuild.setPositiveButton ("Rejouer", nouvelle DialogInterface.OnClickListener () annulation publique onClick (boîte de dialogue DialogInterface, id int) GameActivity.this.playGame ();); lostBuild.setNegativeButton ("Exit", nouveau DialogInterface.OnClickListener () public void onClick (dialogue DialogInterface, int id) GameActivity.this.finish ();); perdreBuild.show ();
Croyez-le ou non, nous avons terminé la mise en œuvre de l'aspect interaction utilisateur du jeu. Il ne nous reste plus qu'à ajouter quelques améliorations à l'interface.
Terminons ce tutoriel en ajoutant un bouton d'aide à la barre d'actions. Je n'entrerai pas dans les détails, mais n'hésitez pas à expérimenter cela dans vos propres applications. Selon les niveaux d'API que vous ciblez, la navigation au moyen de la barre d'action est fournie avec peu ou pas de codage. Pour vous assurer que la barre d’action permet de revenir à l’activité principale, ajoutez ce qui suit dans la liste. onCreate
méthode dans l'activité du jeu.
getActionBar (). setDisplayHomeAsUpEnabled (true);
Dans le manifeste, rappelez-vous que nous avons spécifié l'activité principale en tant que parent de l'activité du jeu. Cela indique au système d’exploitation que la navigation en arrière depuis l’activité du jeu devrait ramener l’utilisateur à l’activité principale. Votre projet devrait avoir une ressource de menu principal. Ouvrez-le et regardez son contenu. Par défaut, il y aura une action paramètres, dont nous n'avons pas besoin pour notre jeu. Insérer l'extrait de code suivant, pour ajouter un bouton d'aide.
N'oubliez pas que nous avons répertorié l'icône d'aide dans le premier tutoriel de cette série. Vous pouvez ajouter plus de boutons à votre barre d’action ultérieurement si vous le souhaitez. Si vous le faites, vous devrez étendre le code d'activité que nous couvrons ci-dessous..
Nous n’avons pas besoin des fonctions de la barre d’action dans l’activité principale. Par conséquent, si Eclipse ajoutait la onCreateOptionsMenu
méthode à votre classe d'activité principale, n'hésitez pas à l'enlever.
De retour dans l'activité du jeu, configurez l'écran pour utiliser le menu principal en ajoutant la méthode suivante.
@Override public boolean onCreateOptionsMenu (menu Menu) getMenuInflater (). Inflate (R.menu.main, menu); retourne vrai;
Ajoutez une autre méthode pour spécifier ce qui doit se passer lorsque l'utilisateur essaie de naviguer en arrière ou appuyez sur le bouton d'aide dans la barre d'action..
@Override public boolean onOptionsItemSelected (élément MenuItem) switch (item.getItemId ()) case android.R.id.home: NavUtils.navigateUpFromSameTask (this); retourne vrai; case R.id.action_help: showHelp (); retourne vrai; return super.onOptionsItemSelected (item);
En remontant, l’utilisateur reviendra à l’activité principale. le android.R.id.home
l'action correspond à l'appel à setDisplayHomeAsUpEnabled
nous avons ajouté onCreate
.
Ajouter une autre variable d'instance en haut de la classe pour les informations d'aide.
private AlertDialog helpAlert;
Nous allons utiliser une autre méthode d'assistance pour afficher les informations d'aide.
public void showHelp () AlertDialog.Builder helpBuild = new AlertDialog.Builder (this); helpBuild.setTitle ("Aide"); helpBuild.setMessage ("Devinez le mot en sélectionnant les lettres. \ n \ n" + "Vous n'avez que 6 sélections incorrectes, la partie est terminée!"); helpBuild.setPositiveButton ("OK", nouveau DialogInterface.OnClickListener () public void onClick (dialogue DialogInterface, int id) helpAlert.dismiss ();); helpAlert = helpBuild.create (); helpBuild.show ();
Notre jeu du pendu devrait maintenant être terminé. Exécutez-le et faites-le tourner. L'application dans sa forme actuelle ne fonctionnera que sur les versions récentes d'Android et l'interface utilisateur ne convient que pour un nombre limité de périphériques. Comme vous pouvez le constater, des améliorations sont possibles. En plus de supporter un plus grand nombre d'appareils, vous pouvez améliorer le jeu en ajoutant des niveaux de difficulté ou des catégories de mots. Vous pouvez même créer un classement pour garder une trace des scores.
Si vous avez terminé cette série avec succès, vous devriez avoir entendu parler de plusieurs aspects de la plate-forme Android, notamment l'interaction utilisateur, les adaptateurs, les ressources XML et l'utilisation de la barre d'actions..