Développement jeux
Android
Retour d’expérience
Lead developper plateforme
cloud mobile chez Sage
Développeur de
Space Corsair
• Introduction au développement mobile
• Comment développer son premier jeu
• Monétiser son projet
• Conseils pour réussir sa sortie
Plan de la présentation
Statistiques sur le jeu vidéo mobile
• Un marché estimé à 22 Milliards de $ en 2015
• 80% des revenus mobile viennent des jeux
• En 2012, les 25 premiers développeurs prennent à eux
seuls 50% des revenus.
• Dépense moyenne de 21$ par joueur en 2011
• 80 % des développeurs mobile ne gagnent pas assez
pour en faire une activité principale.
Pourquoi développer son jeu?
• Apprendre, développer ses compétences
• Ajouter une expérience sur son CV
• Revenus complémentaires
• S’évader des contraintes de son emploi principal
• Sortie sur le marché d’un vrai produit ( préparation
marketing, publicité)
Dur développer un jeu?
On peut faire un jeu à succès en utilisant uniquement les
composants d’une application Android non ludique
(quizz , jeu de gestion).
La complexité dépend du type de jeu et de son
expérience en développement, l’important c’est de
choisir un projet à sa portée.
Différents types de jeux mobiles
• 3D / simulation (Asphalt)
• 2D / action rpg ( Space corsair)
• Réflexion / physique (angry birds, cut the rope)
• 2D scrolling ( jetpack joyride)
• Gestion / action (Clash of clan, tower defense)
• Puzzle games (candy crush)
• Cartes / casino
• Mix de tout ça et autres ...
Réalisation du projet
Je suis motivé, j'ai du temps, je souhaite me lancer dans
la réalisation d’un jeu mobile ...
Comment faire ?
Trouver une idée
Originale ...
• Avoir un concept de base amusant et ajouter des éléments autour
… ou inspirée
• Reprendre un concept existant (vieux jeu pc, jeu d’une autre
plateforme, actualité, ...)
=> Dans tous les cas, choisir un élément démarquant.
Exemple de flappy bird :
• Gameplay limité, concept très classique, son élément démarquant est
une difficulté exagérément haute.
Trouver une idée
Pour un premier projet, éviter de :
• Partir sur un projet de trop grande envergure.
o Risque de perte de motivation plus important
o Moins de chance de le sortir
• Mettre la barre trop haut techniquement
o Privilégier la 2D à la 3D
o Sortir un jeu solo plutôt que multijoueur
Tester son idée
• Faire un storyboard
• Lister les points clés du gameplay
• Chercher des jeux similaires sur les stores
• Réfléchir à la monétisation
• Présenter le concept à des tiers, recueillir des retours.
Avoir une équipe
Rôles à remplir
• Manager (Chef produit, marketing, chef de projet)
• Game designer (level design, son, ergonome, design)
• Graphiste (Graphiste 2d, modeleur et textureur 3d)
• Techno (Dev Moteur physique, gameplay, IA, réseau, ... )
Conseils
• Etre à plusieurs permet de compenser les baisses de motivations.
• Partir du principe que le jeu aura du succès: décider dès le début
comment les gains sont répartis dans l’équipe.
Réalisation : Composition d’un jeu
• Logique du jeu (règles, moteur physique, …)
• Moteur de rendu graphique (canvas, opengl, …)
• Ressources (textures, son, textes, localisation ...)
• Gestion des entrées utilisateur (touche écran,
gyroscope, ...)
• IA
• Stockage sur le device( sauvegardes, ...)
• Communication réseau
• Intégration api externes (pub, achat inapp, réseaux
Réalisation : Moteur
Un choix important s’impose dès le début du projet :
L’utilisation ou non d’un moteur de jeu.
Réalisation : Moteur
Pour :
• Réaliser des trucs “cool” plus simplement
• Code du moteur testé et de haute qualité
• On se concentre davantage sur son jeu que sur l’aspect technique
• Des exemples clé en main, communauté.
Contre :
• Peut être dur de sortir du cadre du moteur : risque de jeu “clone”
• On développe des compétences spécifiques au moteur et pas forcément
utiles ou valorisables ailleurs
• Ne convient pas à tout type de jeu
Box 2D
• Moteur physique uniquement
• Implémentation java et native
• Gestion des collisions
• Gestion de formes complexes (cercles et polygones)
• Gestion des forces (gravité, friction, spin, …)
Utilisé pour : angry birds
Chipmunk2D
• Moteur physique uniquement
• Utilisé par le moteur iOS coco2d
• Codé en c : pas compatible android SDK
• Intégration android plus compliquée (NDK)
• Globalement même fonctionnalités que Box2d
• Plus optimisé pour objets de même taille
• Version gratuite et Pro
Unity 2d/3d
• Solution intégrée à 100%
• Licence gratuite (si revenus < 100K$ annuel)
• Large compatibilité (Android, iOS, WP8, ...)
• Grosse communauté
• Mieux adapté à la 3D (a suivre version 4.3)
• Langage propriétaire ou C#/JS
• Mais ... on développe des compétences Unity
uniquement
Utilisé pour : Dead trigger 2
LibGDX
• Api java (ou autre langage JVM) multi plateforme
• Gère l’affichage, l’audio, les contrôles, le stockage.
• Pas d’IDE dédié, intégration à éclipse.
• Extension pour moteur physique (box2d natif)
• Compatible 3D
• Moteur d'exécution desktop
• Beaucoup d’exemples disponibles
AndEngine
• Framework java opensource
• Surcouche opengl
• Intégration du moteur physique box2d (natif ou jar)
• Pas de 3D
• On conserve la main sur le code
• Android only
• moins complet que libGDX mais plus facile à prendre
en main
Réalisation : Moteur
Choisir un moteur pour :
• Faire un test, sans vouloir trop s'investir et avoir un bon résultat
• Aller plus loin sur un projet commencé en POC sans moteur.
• Réaliser un jeu multi plateforme
• Réaliser un jeu 2D/3D sans expérience
Faire tout à la main si :
• Le jeu est non graphique
• Le jeu possède des contraintes spécifiques non adaptées au moteur
• L’on souhaite monter en compétence techniquement et qu’on est prêt à
en baver.
Réalisation : retour d’xp
Motivation pour faire Space Corsair sans moteur
• Monter en compétence sur OpenGL.
• Les moteur physiques ne gèrent pas bien les collisions avec plus de
400/500 objets ce qui pouvait être mon cas dans le gamedesign prévu.
• Savoir faire soi-même pour mieux comprendre le moteur ensuite.
Réalisation : Dev
Itération : Temps nécessaire pour dessiner la scène du jeu et calculer les
éléments de la scène suivante.
Objectif : Faire tenir une itération entre 20 et 30 millisecondes.
Plusieurs thread :
• Thread opengl
• Thread physique / logique du jeu
• Thread de l’activity (reçoit les input)
• Thread musique et son
Thread graphique
Possède sa propre liste d’éléments à afficher
Algo :
• Attendre d’avoir une nouvelle liste d’éléments à afficher
• Afficher chaque élément de la liste via des appels openGL
Réalisation : Dev
Thread physique
Possède une liste des éléments du niveau en cours (joueur, astéroïdes,
ennemis, …)
Algo simplifié V1 :
• Déterminer combien de ms depuis ma dernière exécution
• Appliquer à chacun de mes objets son mouvement en fonction des ms
• Gérer les collisions entre objets
• Ajouter l'objet à la file des éléments à dessiner
Réalisation : Dev
Réalisation : Dev
Chaque objet du jeu est un objet java qui étend d’une classe commune
“Element”. Cette classe contient des paramètres qui permettent de gérer
sa physique, affichage, l’ia.
• Drawable (Objet qui contient les infos opengl pour se dessiner)
• Puissance de poussée
• Vecteur vitesse actuel
• Masse
• Dimension
• Vie
• Visible sur le radar oui/non
Un Element contient aussi des méthodes utilisées pour l’affichage ou la
logique de jeu :
• doPhysic(long elapsed)
• public void registerYourselfToDrawQueue() {
• public void applyMovement(long elapsed)
• public void applyAcceleration(long elapsed)
• estimateFurutrePosition(long futureInMs)
• testColide(Element otherElement)
• applyDamage(float dmge, Element damageSource, Projectile projectile)
• public void onDestroyed(boolean playerLootCompatible)
Réalisation : Dev
• Exemple de la méthode pour appliquer le mouvement
Réalisation : Dev
public void applyMovement(long elapsed) {
this.position.x += this.speed.x * elapsed / 10;
this.position.y += this.speed.y * elapsed / 10;
this.spin += spinSpeed * elapsed / 10;
}
Communication inter-thread : permettre au moteur de modifier les objets pendant
que le thread graphique les affiche
Réalisation : Dev
Utilisation de deux listes d’objets
Une liste A d'éléments à dessiner en ce moment :
● ne change pas pendant l'itération, destiné au thread d'affichage
Une liste B d'élément à dessiner à la prochaine itération :
● vide au début et se remplit avec la progression du thread physique
A la fin d'une itération, on inverse les deux listes, B devient A, et A est vidé et sert a
préparer les éléments N+1
Thread physique
Algo simplifié V2 :
• Déterminer combien de ms depuis ma dernière exécution
• Déterminer la position de la caméra
• Appliquer à chacun de mes objets son mouvement en fonction des ms
• Si objet visible, ajouter l'objet à la file des éléments à dessiner
• Gérer les collisions entre objets
• Si le temps d’exécution < 16 ms (60 FPS), se mettre en “pause” le temps
d’atteindre 16 ms.
Réalisation : Dev
Gestion des inputs
les inputs ne doivent pas accéder au thread physique “en direct”.
• Risque de modification concurrente : les input viennent de
l'activité/view qui n'est pas le même thread que celui qui exécute le
moteur.
Utiliser à la place une file d’attente d’évènement utilisateur à prendre en
compte
• Le thread physique décide quand traiter les derniers traitements depuis
sa dernière exécution .
Réalisation : Dev
Thread physique
Algo simplifié V3 :
• Déterminer combien de ms depuis ma dernière exécution
• Déterminer la position de la caméra
• Appliquer à chacun de mes objets son mouvement en fonction des ms
• Si objet visible, ajouter l'objet à la file des éléments à dessiner
• Gérer les collisions entre objets ( on en parlera plus tard)
• Gérer les input utilisateur (touch, move, gyro, …)
• Si le temps d’exécution < 16 ms (60 FPS), se mettre en “pause” le temps
d’atteindre 16 ms.
Réalisation : Dev
Gestion des collisions
• Brute force
• Découpage en grille
• Sweep and Prune
Réalisation : Dev
• Simple
• Ne permet pas de gérer beaucoup d’objets
Brute force
Réalisation : Dev
for (int i = 0 ; i < elementSize-1; i++){
for (int y = i+1; y < elementSize ; y++){
detectionCollision(elements.get(i),elements.get(y));
}
}
Découpe en grille
Réalisation : Dev
● Plus efficace que le brute force
● Bien choisir sa taille de carré
Optimisation : QuadTree
Sweep and prune
Réalisation : Dev
● Phase 1 : Sweep
Extrait des paires d’objet
potentiellement en collision.
● Phase 2 : Prune
On effectue le test de collision
complet sur les paires.
Intégrer des missions
Utilisation d’interfaces, chaque mission doit fournir une implémentation
que contient la logique de la mission.
Réalisation : Dev
public abstract class MissionListener {
public abstract void onElementDestroyedByPlayer(Element element);
public abstract void onPlayerDeath();
// trigger every 10 sec
public abstract void onEveryTenGameSec();
}
Exemple de mission
Détruire x objets d’un même type (ennemis, astéroides, …)
Réalisation : Dev
@Override
public void onElementDestroyedByPlayer(Element element) {
if ( elementToDestroy.isInstance(element) && !completed) {
remainingElementToDestroy--;
if (remainingElementToDestroy <= 0) {
completed = true;
currentPhase = Phase.GATHER_RECOMP;
}
}
}
Gestion de la musique
Utilisation de la classe MediaPlayer
Réalisation : Dev
MediaPlayer levelMusic = MediaPlayer.create(context, R.raw.space1);
levelMusic.setLooping(true);
levelMusic.start;
●
● Lit la plupart des formats audio. Format Ogg bon compromis entre
performance et qualité.
● Créer un thread dédié pour le mediaplayer évite des problèmes
Effets sonores
Utilisation de la classe SoundPools
Réalisation : Dev
// chargement
private int[] soundPoolIndex = new int[30];
soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 100);
int laserSoundIndex = soundPool.load(context, R.raw.laser11, 1);
// utilisation
soundPool.play(laserSoundIndex, volume, volume, 1, 0, 1f);
Optimisations
• Limiter au maximum la création d’objets après le chargement du jeu.
o Utilisation de pool d’objets
o Un objet à retirer de la scène retourne dans le pool.
Réalisation : Dev
public static RubyAsteroid newRubyAsteroid() {
RubyAsteroid rubyAsteroid = GamePools.rubyAsteroidPool.getObject();
if (rubyAsteroid == null) {
rubyAsteroid = new RubyAsteroid();
rubyAsteroid.myPool = GamePools.rubyAsteroidPool;
}
return rubyAsteroid;
}
Optimisations
• Ne pas utiliser de boucle de type foreach
• Utiliser les types primitifs au maximum, ne pas faire d’autoboxing.
• Limiter les appels de méthode
o Remplacer les getter setter par des champs pubic
Réalisation : Dev
Localisation
• Supporter au minimum l’anglais
• Idéalement : koréen, japonais, russe
• Penser aux images
• Texte du play store (très important)
Réalisation : Dev
Sécuriser son code
• Utiliser un obfuscateur (proguard)
• Ne pas laisser de chaînes de caractères sensibles dans le code
• Retirer les logs
Réalisation : Dev
Courbe de motivation
Réalisation
Utiliser les fonctionnalités beta du play store
• Basé sur les communauté G+
• Permet d’inviter des personnes à tester son jeu depuis le store
• Attention notes et commentaires actifs.
Beta
Eléments à intégrer pour une béta
• Un message qui alerte que le jeu est en béta
• Formulaire de contact / fonction d’email au dev
• Librairie de gestion d’erreur
o ACRA (Application Crash Report for Android)
o Crashlytics
• Google analytics
Beta
Différents modèles
• Payant
• Gratuit avec pub
• Freemium (gratuit et inapp premium upgrade)
• Vente de code source
• Partenariat
• Dons
• Vente de stats
Monétiser son app
Types de publicité
• Bannière
• Interstitiel (le plus rentable)
• Vidéo
• Pub géolocalisée
• Cross promotion network
Utiliser un “ad network” : admob, appBrain, greyStrike, ...
Monétiser son app
Achat inapp
• Différents types (Upgrade, Consommable, Monnaie virtuelle)
• Doit être codé pour chaque app store
• Plus compliqué à intégrer proprement que la pub
• Commission des stores de 30%
• Adapter les prix en fonction du pays
• Avantage des gifts code
Monétiser son app
Modèle freemium
• 90% des joueurs n’achèteront rien
o Mais les notes positives de ceux-ci font venir les 10% restants
• 50% des revenus de jeux viennent de 0.15% des joueurs
• Modèle le plus rentable
Monétiser son app
Principaux stores
• Google play store
• Amazon app store
• Opera mobile store
• Samsung apps mobile
• …
Publier son app
• Localiser la description dans les stores
• Publier plus tôt sans forcément avoir toutes les features
• Choisir sa date de sortie : idéalement un vendredi
• Ajouter un lien pour noter son app
• Ajouter un changelog
Publier son app
• Faire une vidéo
o Genymotion + capture vidéo
• Préparer un dossier de presse
o Présentation de l’équipe
o Date de lancement
o Point discriminent de l’app
o Screenshot/vidéos
o Statistiques
• Avoir un article dans les site de niche
Promouvoir son app
Promouvoir son app
• Ajouter une dimension sociale
o facebook api
o google play game services
• Présentation dans les forums, réseaux sociaux
• Campagne de pub
o Optimiser le nombre de week end
o Ne promouvoir que les pays dont l’app est localisée
• Classement (quotidien, hebdo, mensuel, …)
• Succès
• Multijoueur (mise en relation)
• Stockage en ligne de backup
• Les joueurs se connectent avec un compte g+
Google Play Games Services
• Surveiller les bugs et les corriger
• Répondre aux mails des joueurs
• Répondre aux commentaires sur les stores
• Orienter ses futures mises à jour en fonction des retours des joueurs.
• Faire des mises à jour régulières
Après la sortie

Retour d'expérience développement jeux android

  • 1.
  • 2.
    Lead developper plateforme cloudmobile chez Sage Développeur de Space Corsair
  • 3.
    • Introduction audéveloppement mobile • Comment développer son premier jeu • Monétiser son projet • Conseils pour réussir sa sortie Plan de la présentation
  • 4.
    Statistiques sur lejeu vidéo mobile • Un marché estimé à 22 Milliards de $ en 2015 • 80% des revenus mobile viennent des jeux • En 2012, les 25 premiers développeurs prennent à eux seuls 50% des revenus. • Dépense moyenne de 21$ par joueur en 2011 • 80 % des développeurs mobile ne gagnent pas assez pour en faire une activité principale.
  • 5.
    Pourquoi développer sonjeu? • Apprendre, développer ses compétences • Ajouter une expérience sur son CV • Revenus complémentaires • S’évader des contraintes de son emploi principal • Sortie sur le marché d’un vrai produit ( préparation marketing, publicité)
  • 6.
    Dur développer unjeu? On peut faire un jeu à succès en utilisant uniquement les composants d’une application Android non ludique (quizz , jeu de gestion). La complexité dépend du type de jeu et de son expérience en développement, l’important c’est de choisir un projet à sa portée.
  • 7.
    Différents types dejeux mobiles • 3D / simulation (Asphalt) • 2D / action rpg ( Space corsair) • Réflexion / physique (angry birds, cut the rope) • 2D scrolling ( jetpack joyride) • Gestion / action (Clash of clan, tower defense) • Puzzle games (candy crush) • Cartes / casino • Mix de tout ça et autres ...
  • 8.
    Réalisation du projet Jesuis motivé, j'ai du temps, je souhaite me lancer dans la réalisation d’un jeu mobile ... Comment faire ?
  • 9.
    Trouver une idée Originale... • Avoir un concept de base amusant et ajouter des éléments autour … ou inspirée • Reprendre un concept existant (vieux jeu pc, jeu d’une autre plateforme, actualité, ...) => Dans tous les cas, choisir un élément démarquant. Exemple de flappy bird : • Gameplay limité, concept très classique, son élément démarquant est une difficulté exagérément haute.
  • 10.
    Trouver une idée Pourun premier projet, éviter de : • Partir sur un projet de trop grande envergure. o Risque de perte de motivation plus important o Moins de chance de le sortir • Mettre la barre trop haut techniquement o Privilégier la 2D à la 3D o Sortir un jeu solo plutôt que multijoueur
  • 11.
    Tester son idée •Faire un storyboard • Lister les points clés du gameplay • Chercher des jeux similaires sur les stores • Réfléchir à la monétisation • Présenter le concept à des tiers, recueillir des retours.
  • 12.
    Avoir une équipe Rôlesà remplir • Manager (Chef produit, marketing, chef de projet) • Game designer (level design, son, ergonome, design) • Graphiste (Graphiste 2d, modeleur et textureur 3d) • Techno (Dev Moteur physique, gameplay, IA, réseau, ... ) Conseils • Etre à plusieurs permet de compenser les baisses de motivations. • Partir du principe que le jeu aura du succès: décider dès le début comment les gains sont répartis dans l’équipe.
  • 13.
    Réalisation : Compositiond’un jeu • Logique du jeu (règles, moteur physique, …) • Moteur de rendu graphique (canvas, opengl, …) • Ressources (textures, son, textes, localisation ...) • Gestion des entrées utilisateur (touche écran, gyroscope, ...) • IA • Stockage sur le device( sauvegardes, ...) • Communication réseau • Intégration api externes (pub, achat inapp, réseaux
  • 14.
    Réalisation : Moteur Unchoix important s’impose dès le début du projet : L’utilisation ou non d’un moteur de jeu.
  • 15.
    Réalisation : Moteur Pour: • Réaliser des trucs “cool” plus simplement • Code du moteur testé et de haute qualité • On se concentre davantage sur son jeu que sur l’aspect technique • Des exemples clé en main, communauté. Contre : • Peut être dur de sortir du cadre du moteur : risque de jeu “clone” • On développe des compétences spécifiques au moteur et pas forcément utiles ou valorisables ailleurs • Ne convient pas à tout type de jeu
  • 16.
    Box 2D • Moteurphysique uniquement • Implémentation java et native • Gestion des collisions • Gestion de formes complexes (cercles et polygones) • Gestion des forces (gravité, friction, spin, …) Utilisé pour : angry birds
  • 17.
    Chipmunk2D • Moteur physiqueuniquement • Utilisé par le moteur iOS coco2d • Codé en c : pas compatible android SDK • Intégration android plus compliquée (NDK) • Globalement même fonctionnalités que Box2d • Plus optimisé pour objets de même taille • Version gratuite et Pro
  • 18.
    Unity 2d/3d • Solutionintégrée à 100% • Licence gratuite (si revenus < 100K$ annuel) • Large compatibilité (Android, iOS, WP8, ...) • Grosse communauté • Mieux adapté à la 3D (a suivre version 4.3) • Langage propriétaire ou C#/JS • Mais ... on développe des compétences Unity uniquement Utilisé pour : Dead trigger 2
  • 19.
    LibGDX • Api java(ou autre langage JVM) multi plateforme • Gère l’affichage, l’audio, les contrôles, le stockage. • Pas d’IDE dédié, intégration à éclipse. • Extension pour moteur physique (box2d natif) • Compatible 3D • Moteur d'exécution desktop • Beaucoup d’exemples disponibles
  • 20.
    AndEngine • Framework javaopensource • Surcouche opengl • Intégration du moteur physique box2d (natif ou jar) • Pas de 3D • On conserve la main sur le code • Android only • moins complet que libGDX mais plus facile à prendre en main
  • 21.
    Réalisation : Moteur Choisirun moteur pour : • Faire un test, sans vouloir trop s'investir et avoir un bon résultat • Aller plus loin sur un projet commencé en POC sans moteur. • Réaliser un jeu multi plateforme • Réaliser un jeu 2D/3D sans expérience Faire tout à la main si : • Le jeu est non graphique • Le jeu possède des contraintes spécifiques non adaptées au moteur • L’on souhaite monter en compétence techniquement et qu’on est prêt à en baver.
  • 22.
    Réalisation : retourd’xp Motivation pour faire Space Corsair sans moteur • Monter en compétence sur OpenGL. • Les moteur physiques ne gèrent pas bien les collisions avec plus de 400/500 objets ce qui pouvait être mon cas dans le gamedesign prévu. • Savoir faire soi-même pour mieux comprendre le moteur ensuite.
  • 23.
    Réalisation : Dev Itération: Temps nécessaire pour dessiner la scène du jeu et calculer les éléments de la scène suivante. Objectif : Faire tenir une itération entre 20 et 30 millisecondes. Plusieurs thread : • Thread opengl • Thread physique / logique du jeu • Thread de l’activity (reçoit les input) • Thread musique et son
  • 24.
    Thread graphique Possède sapropre liste d’éléments à afficher Algo : • Attendre d’avoir une nouvelle liste d’éléments à afficher • Afficher chaque élément de la liste via des appels openGL Réalisation : Dev
  • 25.
    Thread physique Possède uneliste des éléments du niveau en cours (joueur, astéroïdes, ennemis, …) Algo simplifié V1 : • Déterminer combien de ms depuis ma dernière exécution • Appliquer à chacun de mes objets son mouvement en fonction des ms • Gérer les collisions entre objets • Ajouter l'objet à la file des éléments à dessiner Réalisation : Dev
  • 26.
    Réalisation : Dev Chaqueobjet du jeu est un objet java qui étend d’une classe commune “Element”. Cette classe contient des paramètres qui permettent de gérer sa physique, affichage, l’ia. • Drawable (Objet qui contient les infos opengl pour se dessiner) • Puissance de poussée • Vecteur vitesse actuel • Masse • Dimension • Vie • Visible sur le radar oui/non
  • 27.
    Un Element contientaussi des méthodes utilisées pour l’affichage ou la logique de jeu : • doPhysic(long elapsed) • public void registerYourselfToDrawQueue() { • public void applyMovement(long elapsed) • public void applyAcceleration(long elapsed) • estimateFurutrePosition(long futureInMs) • testColide(Element otherElement) • applyDamage(float dmge, Element damageSource, Projectile projectile) • public void onDestroyed(boolean playerLootCompatible) Réalisation : Dev
  • 28.
    • Exemple dela méthode pour appliquer le mouvement Réalisation : Dev public void applyMovement(long elapsed) { this.position.x += this.speed.x * elapsed / 10; this.position.y += this.speed.y * elapsed / 10; this.spin += spinSpeed * elapsed / 10; }
  • 29.
    Communication inter-thread :permettre au moteur de modifier les objets pendant que le thread graphique les affiche Réalisation : Dev Utilisation de deux listes d’objets Une liste A d'éléments à dessiner en ce moment : ● ne change pas pendant l'itération, destiné au thread d'affichage Une liste B d'élément à dessiner à la prochaine itération : ● vide au début et se remplit avec la progression du thread physique A la fin d'une itération, on inverse les deux listes, B devient A, et A est vidé et sert a préparer les éléments N+1
  • 30.
    Thread physique Algo simplifiéV2 : • Déterminer combien de ms depuis ma dernière exécution • Déterminer la position de la caméra • Appliquer à chacun de mes objets son mouvement en fonction des ms • Si objet visible, ajouter l'objet à la file des éléments à dessiner • Gérer les collisions entre objets • Si le temps d’exécution < 16 ms (60 FPS), se mettre en “pause” le temps d’atteindre 16 ms. Réalisation : Dev
  • 31.
    Gestion des inputs lesinputs ne doivent pas accéder au thread physique “en direct”. • Risque de modification concurrente : les input viennent de l'activité/view qui n'est pas le même thread que celui qui exécute le moteur. Utiliser à la place une file d’attente d’évènement utilisateur à prendre en compte • Le thread physique décide quand traiter les derniers traitements depuis sa dernière exécution . Réalisation : Dev
  • 32.
    Thread physique Algo simplifiéV3 : • Déterminer combien de ms depuis ma dernière exécution • Déterminer la position de la caméra • Appliquer à chacun de mes objets son mouvement en fonction des ms • Si objet visible, ajouter l'objet à la file des éléments à dessiner • Gérer les collisions entre objets ( on en parlera plus tard) • Gérer les input utilisateur (touch, move, gyro, …) • Si le temps d’exécution < 16 ms (60 FPS), se mettre en “pause” le temps d’atteindre 16 ms. Réalisation : Dev
  • 33.
    Gestion des collisions •Brute force • Découpage en grille • Sweep and Prune Réalisation : Dev
  • 34.
    • Simple • Nepermet pas de gérer beaucoup d’objets Brute force Réalisation : Dev for (int i = 0 ; i < elementSize-1; i++){ for (int y = i+1; y < elementSize ; y++){ detectionCollision(elements.get(i),elements.get(y)); } }
  • 35.
    Découpe en grille Réalisation: Dev ● Plus efficace que le brute force ● Bien choisir sa taille de carré Optimisation : QuadTree
  • 36.
    Sweep and prune Réalisation: Dev ● Phase 1 : Sweep Extrait des paires d’objet potentiellement en collision. ● Phase 2 : Prune On effectue le test de collision complet sur les paires.
  • 37.
    Intégrer des missions Utilisationd’interfaces, chaque mission doit fournir une implémentation que contient la logique de la mission. Réalisation : Dev public abstract class MissionListener { public abstract void onElementDestroyedByPlayer(Element element); public abstract void onPlayerDeath(); // trigger every 10 sec public abstract void onEveryTenGameSec(); }
  • 38.
    Exemple de mission Détruirex objets d’un même type (ennemis, astéroides, …) Réalisation : Dev @Override public void onElementDestroyedByPlayer(Element element) { if ( elementToDestroy.isInstance(element) && !completed) { remainingElementToDestroy--; if (remainingElementToDestroy <= 0) { completed = true; currentPhase = Phase.GATHER_RECOMP; } } }
  • 39.
    Gestion de lamusique Utilisation de la classe MediaPlayer Réalisation : Dev MediaPlayer levelMusic = MediaPlayer.create(context, R.raw.space1); levelMusic.setLooping(true); levelMusic.start; ● ● Lit la plupart des formats audio. Format Ogg bon compromis entre performance et qualité. ● Créer un thread dédié pour le mediaplayer évite des problèmes
  • 40.
    Effets sonores Utilisation dela classe SoundPools Réalisation : Dev // chargement private int[] soundPoolIndex = new int[30]; soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 100); int laserSoundIndex = soundPool.load(context, R.raw.laser11, 1); // utilisation soundPool.play(laserSoundIndex, volume, volume, 1, 0, 1f);
  • 41.
    Optimisations • Limiter aumaximum la création d’objets après le chargement du jeu. o Utilisation de pool d’objets o Un objet à retirer de la scène retourne dans le pool. Réalisation : Dev public static RubyAsteroid newRubyAsteroid() { RubyAsteroid rubyAsteroid = GamePools.rubyAsteroidPool.getObject(); if (rubyAsteroid == null) { rubyAsteroid = new RubyAsteroid(); rubyAsteroid.myPool = GamePools.rubyAsteroidPool; } return rubyAsteroid; }
  • 42.
    Optimisations • Ne pasutiliser de boucle de type foreach • Utiliser les types primitifs au maximum, ne pas faire d’autoboxing. • Limiter les appels de méthode o Remplacer les getter setter par des champs pubic Réalisation : Dev
  • 43.
    Localisation • Supporter auminimum l’anglais • Idéalement : koréen, japonais, russe • Penser aux images • Texte du play store (très important) Réalisation : Dev
  • 44.
    Sécuriser son code •Utiliser un obfuscateur (proguard) • Ne pas laisser de chaînes de caractères sensibles dans le code • Retirer les logs Réalisation : Dev
  • 45.
  • 46.
    Utiliser les fonctionnalitésbeta du play store • Basé sur les communauté G+ • Permet d’inviter des personnes à tester son jeu depuis le store • Attention notes et commentaires actifs. Beta
  • 47.
    Eléments à intégrerpour une béta • Un message qui alerte que le jeu est en béta • Formulaire de contact / fonction d’email au dev • Librairie de gestion d’erreur o ACRA (Application Crash Report for Android) o Crashlytics • Google analytics Beta
  • 48.
    Différents modèles • Payant •Gratuit avec pub • Freemium (gratuit et inapp premium upgrade) • Vente de code source • Partenariat • Dons • Vente de stats Monétiser son app
  • 49.
    Types de publicité •Bannière • Interstitiel (le plus rentable) • Vidéo • Pub géolocalisée • Cross promotion network Utiliser un “ad network” : admob, appBrain, greyStrike, ... Monétiser son app
  • 50.
    Achat inapp • Différentstypes (Upgrade, Consommable, Monnaie virtuelle) • Doit être codé pour chaque app store • Plus compliqué à intégrer proprement que la pub • Commission des stores de 30% • Adapter les prix en fonction du pays • Avantage des gifts code Monétiser son app
  • 51.
    Modèle freemium • 90%des joueurs n’achèteront rien o Mais les notes positives de ceux-ci font venir les 10% restants • 50% des revenus de jeux viennent de 0.15% des joueurs • Modèle le plus rentable Monétiser son app
  • 52.
    Principaux stores • Googleplay store • Amazon app store • Opera mobile store • Samsung apps mobile • … Publier son app
  • 53.
    • Localiser ladescription dans les stores • Publier plus tôt sans forcément avoir toutes les features • Choisir sa date de sortie : idéalement un vendredi • Ajouter un lien pour noter son app • Ajouter un changelog Publier son app
  • 54.
    • Faire unevidéo o Genymotion + capture vidéo • Préparer un dossier de presse o Présentation de l’équipe o Date de lancement o Point discriminent de l’app o Screenshot/vidéos o Statistiques • Avoir un article dans les site de niche Promouvoir son app
  • 55.
    Promouvoir son app •Ajouter une dimension sociale o facebook api o google play game services • Présentation dans les forums, réseaux sociaux • Campagne de pub o Optimiser le nombre de week end o Ne promouvoir que les pays dont l’app est localisée
  • 56.
    • Classement (quotidien,hebdo, mensuel, …) • Succès • Multijoueur (mise en relation) • Stockage en ligne de backup • Les joueurs se connectent avec un compte g+ Google Play Games Services
  • 57.
    • Surveiller lesbugs et les corriger • Répondre aux mails des joueurs • Répondre aux commentaires sur les stores • Orienter ses futures mises à jour en fonction des retours des joueurs. • Faire des mises à jour régulières Après la sortie