PROGRAMME ANDROID Que ce soit de la création de jeux, de l informatique de gestion toute la problématique lorsque on tente de comprendre comment fonctionne tous les jeux va être de dégager, les différents objets qui vont composer le jeu et de créer un framework qui va permettre d encapsuler les tâches communes à tous les jeux pour ne pas avoir a refaire les mêmes programmes gérant les aspects techniques tous le temps. Un jeu est constitué de différents objets : Un objet gérant le rendu des jeux (graphiques, audio) Un objet gérant le graphique Un objet gérant les sons et l audio I) Création d une activité réagissant au click comme un bouton package com.helloworld; //Importation des classes indispensables au lancement de l activité. import android.app.activity; import android.os.bundle; import android.view.view; import android.widget.button; // Création de la classe comme heritant d une activité et implémentant un listener qui va réagir aux clics de souris public class HelloWorldActivity extends Activity implements View.OnClickListener { //Définition de deux propriétés un objet Button et un objet de type primitive ici un entier Button button; int touchcount; //Méthode executé au lancement de l activité qui va initialiser le contexte du programme sur le téléphone public void oncreate(bundle savedinstancestate) { //Initialisation de l activité super.oncreate(savedinstancestate); // Création de l objet Button button = new Button(this); //Définition du libéllé du bouton button.settext( "Touch me!" ); //Association du listener au button button.setonclicklistener(this); //Le bouton va correspondre à la vue setcontentview(button); //Méthode qui sera execute à chaque clic sur le bouton public void onclick(view v) { //Incrémentation du nombre entire a chaque clic touchcount++; //Changement du libéllé du bouton après chaque clic button.settext("touched me " + touchcount + " time(s)");
2) Interface pour gérer les entrées via le clavier et l écran et l orientation de l écran On peut utiliser l écran tactile du téléphone pour envoyer des commandes au téléphone, ou le clavier egalement. On va définir un interface qui va permettre de définir les propriétés et les méthodes liés aux événements de l écran tactile ou des touches clavier ou l orientation de l écran. Cette interface une fois qu il sera impplémenté permettra de gérer les touches clavier, écran et le changement d orientation de l appareil ce qui est très utile pour les jeux. import java.util.list; //Ici on définit l interface public interface Input { // Ici la classe statique gérant les événements clavier public static class KeyEvent { // La propriété touché enfoncé ou relaché public static final int KEY_DOWN = 0; public static final int KEY_UP = 1; // Les propriétés définissant le type de la touché le code associé à cette touché et le caractére qu elle représente public int type; public int keycode; public char keychar; //Ici la classe statique gérant les événements lié à l écran tactile public static class TouchEvent { //Index appuyant sur l écran public static final int TOUCH_DOWN = 0; //Index relevé public static final int TOUCH_UP = 1; //index se déplacant sur l écran public static final int TOUCH_DRAGGED = 2; //definition du type de l action, des coordonnées de l index, et du numéro de pointer en supposons que plusieurs points peuvent être activés sur l écran. public int type; public int x, y; public int pointer; // Nous définissons les methodes gérant les evenements sur l écran tactile et le clavier, la touche est elle pressé, l index appuie t il sur l écran,récupération de la coordonnée X et de la coordonnée Y, récupération des éléments permettant de connaître l orientation de l écran public boolean iskeypressed(int keycode); public boolean istouchdown(int pointer); public int gettouchx(int pointer); public int gettouchy(int pointer); public float getaccelx(); public float getaccely(); public float getaccelz(); //Définition de liste permettant de gérer les événements de l écran tactile ainsi que celle du clavier public List<KeyEvent> getkeyevents(); public List<TouchEvent> gettouchevents();
3) Interface pour gérer la lecture et ecriture de fichiers Cette interface permet de définir les méthodes qui permettront de lire et d écrire dans des fichiers, on pourra ainsi récupérer des fichiers images, de texte, de son, de vidéo etc import java.io.ioexception; import java.io.inputstream; import java.io.outputstream; public interface FileIO { //Ici on lit les fichiers situés dans le dossier asset public InputStream readasset(string filename) throws IOException; //Ici on lit les fichiers texte (image, musique, vidéo) public InputStream readfile(string filename) throws IOException; //Ici on écrit dans un fichier public OutputStream writefile(string filename) throws IOException; 4) Interface pour gérer les fichiers de musique sur disque //On définit les méthodes qui vont permettre de jouer un fichier de musique que l on aura préalablement récupéré du dossier assetr public interface Music { //On joue le fichier, on l arrête, le met en pause, on déroule le fichier en boucle, au met la gestion du volume en place, on vérifie si le fichier est en lecture, est stoppé est lu en boucle, on libére la mémoire. public void play(); public void stop(); public void pause(); public void setlooping(boolean looping); public void setvolume(float volume); public boolean isplaying(); public boolean isstopped(); public boolean islooping(); public void dispose(); 5) Interface pour gérer un son en mémoire //Ici on définit un interface avec des méthodes pour gérer un son en mémoire, comme des bruits pour les jeux, on définit le volume et on libére la mémoire. public interface Sound { public void play(float volume);,,, public void dispose(); 5) Interface pour gérer les graphiques
Cette interface va permettre de récupérer des parties d un graphique pour les afficher à l écran et gérer des actions, on pourra ainsi définir un scénario avec tous les éléments de ce scénario sur le même graphique et on ne récupérra alors que les parties qui nous intéressent //Ici on définit un interface permettant de gérer les graphiques c'est-à-dire l affichage à l écran d images bitmap. public interface Graphics { //On définit le format d affichage des images public static enum PixmapFormat { ARGB8888, ARGB4444, RGB565 //On définit un nouveau graphique sur la base d un fichier image qui aura été récupéré et en considérant une resolution des couleurs public Pixmap newpixmap(string filename, PixmapFormat format); // On réinitialise la couleur public void clear(int color); //Pour représenter un pixel public void drawpixel(int x, int y, int color); //Pour dessiner une ligne public void drawline(int x, int y, int x2, int y2, int color); //Pour dessiner un rectangle public void drawrect(int x, int y, int width, int height, int color); //Pour dessiner une portion d une image public void drawpixmap(pixmap pixmap, int x, int y, int srcx, int srcy, int srcwidth, int srcheight); //Pour dessiner une image entiéren public void drawpixmap(pixmap pixmap, int x, int y); //Récuperer la taille et la largeur d une image public int getwidth(); public int getheight(); 6) Interface pour gérer les Pixmap Cette interface va nous permettre de définir les méthodes permettant de gérer les pixmap import com.badlogic.androidgames.framework.graphics.pixmapformat; public interface Pixmap { public int getwidth(); public int getheight(); public PixmapFormat getformat(); public void dispose(); 7) Fonctionnement général du framework de jeu Le fonctionnement général du framework de jeux que nous allons batir va être le suivant. 1) Dans une premiere etape il faut définir l objet qui va gérer la fenêtre et les composants a afficher 2) Dans une autre etapes il faut définir un objet qui va gérer les entrés (clavier, ecran tactile, acceleremotre)
3) Dans une autre étape il faut définir un objet qui va gérer les graphiques 4) Dans une autre étape il faut définir un objet qui va gérer l audio 5) Ensuite il faut définir un objet qui va gérer le menu principal 6) On enregistre le temps initial 7) On calcule le délai entre le temps actuel et le temps de la derniére image 8) On enregistre le temps actuel 9) On met à jour l objet ecran avec les entrée au clavier et à l écran 10) On affiche le contenu de la mise à jour avec les éléments graphiques, audio 11) On libére les ressources createwindowanduicomponent(); Input input = new Input(); Graphics graphics = new Graphics(); Audio audio = new Audio(); Screen currentscreen = new MainMenu(); Float lastframetime = currenttime(); while(!userquit() ) { float deltatime = currenttime() lastframetime; lastframetime = currenttime(); currentscreen.updatestate(input, deltatime); currentscreen.present(graphics, audio, deltatime); cleanupresources(); 8) L interface de jeu Cette interface de jeu va permettre de récupérer, les touches du clavier et sur l écran tactile. Les fichiers en entrée ou en sortie du jeu. Les éléments graphiques du jeu, l audio de gérer l écran. public interface Game { public Input getinput(); public FileIO getfileio(); public Graphics getgraphics(); public Audio getaudio(); public void setscreen(screen screen); public Screen getcurrentscreen(); public Screen getstartscreen(); 9) La classe abstraite ecran Cette classe permet de gérer l écran, on définit un constructeur qui prend pour paramétre un objet game et des méthodes qui vont permettre la mise à jour, le rendu, mettre en pause de reprendre et de libérer les ressources, le rendu et la presentation à l écran dépende d un paramétre délai. public abstract class Screen { protected final Game game; public Screen(Game game) { this.game = game; public abstract void update(float deltatime); public abstract void present(float deltatime); public abstract void pause(); public abstract void resume(); public abstract void dispose();
10) Exemple de jeu simple avec déplacement d un point sur l ecran //Nous définissons une classe qui herite de la classe screen public class MySuperAwesomeStartScreen extends Screen { //Nous définissons deux objets un objet de type Pixmap et un entier Pixmap awesomepic; int x; // Nous définissons le constructeur de la classe public MySuperAwesomeStartScreen(Game game) { // Nous faisons appel au constructeur de la classe parente Screen,pour définir un objet screen prenant comme paramétre un objet Game. super(game); //Nous récupérons la propriété graphiques de l objet Game, et nous faisons appel à la méthode newpixmap de cet objet qui va permettre de récupérer un fichier png, qui va s afficher avec un certain format graphique awesomepic = game.getgraphics().newpixmap("data/pic.png", PixmapFormat.RGB565); //Cette méthode va permettre de faire une mise à jour de la coordonnée sur l axe des abscisses chaque deltatime public void update(float deltatime) { x += 1; if (x > 100) x = 0; //Cette méthode va permettre d afficher à l écran les elements a chaque deltatime public void present(float deltatime) { game.getgraphics().clear(0); game.getgraphics().drawpixmap(awesomepic, x, 0, 0, 0, awesomepic.getwidth(), awesomepic.getheight()); public void pause() { // nothing to do here public void resume() { // nothing to do here public void dispose() { awesomepic.dispose(); L element <manifest> On peu indiquez le code de android utilise, le nom de la version, le support de stockage de l application <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.helloworld" android:versioncode="1" android:versionname="1.0"
android:installlocation="preferexternal">... </manifest> L element <application> <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">... </application> L element <activite> On définit toutes les activités android avec celle qui sera lancé la premiére <activity android:name=".mrnomactivity" android:label="mr. Nom" android:screenorientation="portrait"> android:configchanges="keyboard keyboardhidden orientation"> <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> <activity android:name=".mysubactivity" android:label= Sub Activity Title" android:screenorientation="portrait"> android:configchanges="keyboard keyboardhidden orientation"/> L element <uses-permission> <uses-permission android:name="string"/> L element <uses-feature> <uses-feature android:name="string" android:required=["true" "false"] android:glesversion="integer" /> <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="true"/> <uses-feature android:glesversion="0x00020000"android:required="true"/> <uses-feature android:name="android.hardware.usb.host" android:required="false"/> L element <uses-sdk> <uses-sdk android:minsdkversion="3" android:targetsdkversion="13"/> <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android=http://schemas.android.com/apk/res/android package="com.badlogic.awesomegame" android:versioncode="1" android:versionname="1.0" android:installlocation="preferexternal"> <application android:icon="@drawable/icon" android:label="awesomnium" android:debuggable="true"> <activity android:name=".gameactivity" android:label="awesomnium" android:screenorientation="landscape" android:configchanges="keyboard keyboardhidden orientation"> <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.write_external_storage"/> <uses-permission android:name="android.permission.wake_lock"/> <uses-sdk android:minsdkversion="3" android:targetsdkversion="9"/> </manifest>