Tutoriel sur le développement de jeux avec Android : Partie 1
Pour créer des jeux Android, il faut tout d’abord créer un projet Java (new Java Project) et non pas Android. Puis il faut créer une package dans lequel on crée une classe qui hérite de la classe Applet,
« Public NomClasse extends Applet » .Par la suite il faut ajouter les méthodes qui constitue le cycle de vie d’un Applet en Java « init() ,start(), stop(), destroy().
Ensuite il faut implémenter un thread (qui permet l’exécution de plusieurs processus simultanément).Pour le faire nous devons insérer ces deux lignes dans notre méthode start() :
@OverridePublic void start(){Thread thread=new Thread(this);Thread.start();}
Mais rien ne se passera après l’exécution de thread.start() à présent, tout simplement parce que les threads exigent la présence d’une methode run() permettant de déterminer ce qui va se passer au niveau du thread. Nous devons donc implémenté l’interface Runnable et ajouter une méthode « public void run() » au niveau de notre classe.
Donc notre classe aura la forme suivante :
import java.applet.Applet;public class NomClasse extends Applet implements Runnable {@Override public void init() { }Thread thread = new Thread(this);@Override public void start() {public void stop() {thread.start(); } @Overridepublic void destroy() {// TODO Auto-generated method stub } @Override// TODO Auto-generated method stub// TODO Auto-generated method stub } @Override public void run() { }}
Nous devons maintenant passer pour voir la boucle de jeu (game loop) qui constitue le battement de cœur de notre jeu et qui permet de contrôler les modifications et les mises à jour au niveau de notre jeu.
Pour l’exemple que nous allons faire, notre boucle effectuera les taches suivantes :
1- mise à jour des personnages
2- mise à jour de l’environnement
3- repeindre la scène
4- sleep pour 17 millisecondes
Donc dans notre methode run() nous allons créer notre boucle de jeu. Cette boucle sera une boucle while, et se poursuivra indéfiniment. Pour le faire, nous écrivons « true » comme condition de la boucle :
while (true) {}Dans cette boucle nous devons ajouter les lignes suivantes :while (true) { repaint(); // this calls paint try {e.printStackTrace();Thread.sleep(17); } catch (InterruptedException e) { }}
repaint () : il s’agit d’une méthode qui appelle la méthode paint dans laquelle nous dessinons les objets sur l’écran.Nous n’avons pas encore créer la methode paint , mais elle sera réappeler chaque 17 millisecondes.
Maintenant nous allons passer pour définir l’arrière-plan, la taille et le titre de notre applet.
Ceci se fera au niveau de la méthode init() , nous devons donc utiliser :
· setSize(800,480) ;
Permet de passer de 800 pixels à 480 pixels qui constituent la résolution d’écran la plus commune pour les devices Android).
· setBackground(Color.BLACK) ;
qui permet de donner la couleur noir à l’arrière-plan de notre applet, ici vous devez faire l’import de la calsse « Color ».
· setFocusable(true) ;
Cette déclaration fait en sorte que lorsque le jeu démarre, l'applet prend le focus et nous entrons directement en action de jeu. Si cela ne soit pas activé, vous devez cliquer sur l'applet avant qu'il ne commence la gestion des événements de clavier.
· Frame frame = (Frame) this.getParent().getParent();
frame.setTitle("Q-Bot Alpha");
Ici vous devez importer la classe Frame pour pouvoir attribuer un titre à notre applet.
Notre classe prendra la forme suivante :
import java.applet.Applet;import java.awt.Color;public class NomClasse extends Applet implements Runnable {import java.awt.Frame; @OverridesetSize(800, 480);public void init() { setBackground(Color.BLACK);Frame frame = (Frame) this.getParent().getParent();setFocusable(true); frame.setTitle("Q-Bot Alpha"); } @Override public void start() { Thread thread = new Thread(this); thread.start(); } @Overridepublic void destroy() {public void stop() { // TODO Auto-generated method stub } @Override // TODO Auto-generated method stubThread.sleep(17);} @Override public void run() { while (true) { repaint(); try {}} catch (InterruptedException e) { e.printStackTrace(); } } }
Maintenant nous allons voir le code qui permet au jeu de répondre aux actions de l’utilisateur faite à travers le clavier.
Pour cela et pour permettre à notre jeu d’écouter quand le bouton est appuyé et libéré noud devons implémenter l’interface KeyListener.
public class NomClasse extends Applet implements Runnable, KeyListener
Par la suite vous devez faire l’import de votre KeyListener et vous devez ajouter les méthodes non implémentées : keyPressed(), keyReleased(), et keyTyped().
Enfin vous devez ajouter cette ligne dans votre méthode init() : addKeyListener(this);
Maintenant nous allons voir comment écouter les appuis sur nos boutons, pour notre jeu nous allons devoir besoin d’utiliser au moins cinq boutons : les boutons de directions et l’espace pour sauter.
Nous allons travailler maintenant au niveau de la méthode KeyPressed() ;à l’intérieur de cette méthode nous allons faire un « switch… case » qui effectuera l’action approprié en fonction du bouton appuyé.
@Overridepublic void keyPressed(KeyEvent e) {switch (e.getKeyCode()) {case KeyEvent.VK_DOWN:case KeyEvent.VK_UP: break; break;case KeyEvent.VK_RIGHT:case KeyEvent.VK_LEFT: break; break;}case KeyEvent.VK_SPACE: break;}
On va faire la même chose dans la méthode keyReleased() pour effectuer les actions nécessaires lorsque un bouton est libéré.
@Overridepublic void keyReleased(KeyEvent e) {switch (e.getKeyCode()) {case KeyEvent.VK_DOWN:case KeyEvent.VK_UP: break; break;case KeyEvent.VK_RIGHT:case KeyEvent.VK_LEFT: break; break;}case KeyEvent.VK_SPACE: break;}
Jusqu’à présent nous n’avons pas de caractère à faire déplacer ou arrêter, nous allons juste faire apparaitre un texte dans la console qui permet d’afficher l’état des appuis sur les boutons. Voici le code qui permet de faire ceci, juste après avoir collé ce code cliquer sur votre projet puis faites run as java applet.
import java.applet.Applet;import java.awt.Color;import java.awt.event.KeyEvent;import java.awt.Frame;public class StartingClass extends Applet implements Runnable, KeyListener {import java.awt.event.KeyListener; @OverridesetBackground(Color.BLACK);public void init() { setSize(800, 480);Frame frame = (Frame) this.getParent().getParent();setFocusable(true); addKeyListener(this);public void start() {frame.setTitle("Q-Bot Alpha"); } @Overridepublic void stop() {Thread thread = new Thread(this); thread.start(); } @Override// TODO Auto-generated method stub// TODO Auto-generated method stub } @Override public void destroy() { } @Override} catch (InterruptedException e) {public void run() { while (true) { repaint(); try { Thread.sleep(17);switch (e.getKeyCode()) {e.printStackTrace(); } } } @Override public void keyPressed(KeyEvent e) { case KeyEvent.VK_UP:case KeyEvent.VK_LEFT:System.out.println("Move up"); break; case KeyEvent.VK_DOWN: System.out.println("Move down"); break;System.out.println("Jump");System.out.println("Move left"); break; case KeyEvent.VK_RIGHT: System.out.println("Move right"); break; case KeyEvent.VK_SPACE:System.out.println("Stop moving up");break; } } @Override public void keyReleased(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_UP: break; case KeyEvent.VK_DOWN:System.out.println("Stop moving right");System.out.println("Stop moving down"); break; case KeyEvent.VK_LEFT: System.out.println("Stop moving left"); break; case KeyEvent.VK_RIGHT: break; case KeyEvent.VK_SPACE:}System.out.println("Stop jumping"); break; } } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub }
Création du personnage principale de notre jeu
Nous allons passer maintenant pour créer notre personnage principal. Au tout début nous devons créer une nouvelle classe intitulé Robot.java. Cette classe va permettre de gérer et mettre à jour les coordonnées (x,y) pour positionner notre robot et pour gérer sa vitesse.
Il faut mettre dans la tête que les coordonnées (x,y) prennent la localisation (0,0) à l’extrémité gauche en haut. Cette image explique mieux les choses.
Nous supposons que le terrain, sur lequel le personnage va marcher, est situé à environ 440 pixels vers le bas à partir du haut (y=440). Donc notre personnage doit avoir un « y » égale à 382.
Le jeu que nous allons développer est semblable à metal slug, Essayez de regarder quelques seconde de cette video
Vous allez voir que le personnage principal, lorsqu’il avance vers l’avant (il se déplace à droite) il reste à sa place et c’est le background qui se défile. Par contre le personnage se déplace librement dans la moitié gauche de l'écran. De ce fait lorsque le x du personnage est inférieur ou égal à 150 (donc la moitié gauche de l’écran n’est pas dépassé) le personnage va se déplacer et il n’y aura pas de défilement du background.
Il faut noter que :
*lorsque le personnage saute son « y » va diminuer donc le mouvement vertical pourrait être négatif.
*Le mouvement horizontal - qui définit la vitesse du personnage lorsqu’il se déplace à droite et à gauche) - pourrait être négative lorsqu’il se déplace à gauche (puisque la valeur de x va diminuer).
* Si centerX du personnage est moindre que 60, sa main gauche sera à l'extérieur du bord gauche de l'écran.
Pour notre exemple speedX, SpeedY sont les variables qui définit la vitesse à laquelle ces positions X et Y changent.
Dans la classe Robot.java mettez ce code :
public class Robot {
private int centerX = 100;
private int centerY = 382;private boolean jumped = false;private int speedX = 0;public void update() {private int speedY = 1;// déplacer le personnage ou defiler l’arrière plan suivant le casif (speedX < 0) { centerX += speedX;System.out.println("ne pas defiler le background.");} else if (speedX == 0) {} else
{if (centerX <= 150) {centerX += speedX;} else {System.out.println("defiler le Background ici ");} }centerY = 382;// Mise à jour de la position Y if (centerY + speedY >= 382) {// Handles Jumping}else{ centerY += speedY; }centerY = 382;if (jumped == true) { speedY += 1; if (centerY + speedY >= 382) {// empecher le x d’aller au delà de 0speedY = 0; jumped = false; }}public void moveRight() {if (centerX + speedX <= 60) { centerX = 61; } } speedX = 6;speedX = 0;} public void moveLeft() { speedX = -6; } public void stop() { }}public void jump() { if (jumped == false) { speedY = -15;jumped = true; }
update (): cette méthode sera appelée à chaque itération de la boucle. Cette méthode est très importante, nous allons donc prendre du temps pour en parler.
Dissection de la méthode update():
Tout d'abord, nous allons discuter de la section intitulée :
// Déplacer le personnage ou defiler l’arrière plan suivant le cas
1. Notre première instruction if:
Pour notre jeu pour dessiner le caractère à l'emplacement approprié, centerX doit être constamment mis à jour ; Cependant, si le personnage est à l'arrêt (speedX == 0), il n'y a pas besoin de mettre à jour centerX en lui ajoutant la vitesse (speedX).
Maintenant, nous allons discuter les sections intitulées :
// Mise à jour de la position Y et //handles Jumping
La gravité est toujours présente, le personnage est constamment poussé au sol. Nous supposons que le terrain est situé à environ 440 pixels vers le bas à partir du haut, et si la position Y du personnage ainsi que sa vitesse de Y l'amèneront au-dessous du sol, nous utilisons la déclaration : centerY = 382 ; pour régler manuellement le personnage à une hauteur qui lui arrêter de bouger.
La section handles jumping va vérifier la vitesse et la position actuelle pour tester si le personnage est à mi- saut ou sur le terrain.
Enfin, nous allons discuter de la section intitulée : //empecher le x d’aller au delà de 0
Cette section vérifie juste si le personnage se déplace au-delà du bord gauche de l'écran et fixe son centerX à 61 s’il essaie de sortir de l'écran.
Maintenant nous allons passer aux autres méthodes :
MoveRight(), qui fixe la vitesse horizontale du personnage (speedX) à 6 lorsqu’il y à droite.
moveLeft(), qui fixe speedX à -6 lorsqu’il y a déplacement à gauche.
stop(), qui définit la speedX à zéro.
jump(), qui définit la vitesse verticale -15.
Super le tutoriel, je dois le tester pour de vraie. Mais n'y a t il pas de Partie 2?
RépondreSupprimer