Comment créer des jeux pour Android. Un échec d'un an ou une expérience dans le développement d'un jeu pour Android

Beaucoup de gens, lorsqu'ils téléchargent des jeux pour plateformes mobiles, pensent : « Pourquoi ne pas réaliser un rêve ? Pourquoi ne pas faire de votre produit un produit qui sera meilleur et plus intéressant que ce que l'industrie du divertissement interactif propose déjà ? Si vous ne savez pas comment créer des jeux sur Android, mais que vous souhaitez apprendre, cet article vous parlera de certains des pièges qui attendent les développeurs novices.

Idée

La première chose dont vous avez besoin pour créer un jeu est une idée. Au premier stade, il peut être écrit sous n'importe quelle forme. Il est souhaitable qu'il « attrape » et soit compréhensible. Très probablement, au cours du processus d'incarnation, il sera modifié. Quelque chose devra être ajouté, et quelque chose devra être complètement supprimé ou refait. Il n'y a rien d'étrange à cela - avec une élaboration plus poussée des détails, la fonctionnalité devra non seulement être décrite en détail, mais également vérifiée pour son adéquation.

Vous ne devez pas abandonner complètement la description initiale de l'idée et commencer à créer des jeux russes pour Android, en sautant cette étape. La collection de pensées est le principal point de départ à partir duquel il est le plus facile de commencer à bouger. De plus, les idées exposées sur papier vous permettront de regarder vos plans de manière plus objective, peut-être de marquer et de corriger les faiblesses à l'avance.

Liste des fonctionnalités

Puisqu'il est impossible de créer des jeux sur "Android" sans leur étude détaillée, à ce stade, vous devrez continuer à travailler et décrire les fonctionnalités qui seront dans le jeu. Par exemple, la série God of War est un slasher. L'arme du personnage principal est un fouet. Pendant la bataille, vous pouvez faire de longues et belles attaques combo. Chaque niveau se termine par un combat de boss.

Cette liste est plutôt avare et ne reflète que les principales caractéristiques, c'est-à-dire celles qui distinguent le jeu des autres. En fait, il y en a beaucoup plus, mais d'autres caractéristiques sont secondaires. Lors de la description, les premiers devraient être ceux sans lesquels votre future création ne peut exister, et les derniers - les moins importants, qui peuvent être sacrifiés au profit de la vitesse de développement.

Dizdok

Comme il est presque impossible de créer un nouveau jeu sans ce document, vous devrez également y travailler. Dizdok est l'abréviation de "design document", il comprend les descriptions les plus détaillées :

  • Modèle d'objet et fonctionnalité d'entité.
  • Spécifications fonctionnelles.
  • Contenu du jeu.
  • Interface.
  • Une base de connaissances peut être ajoutée au besoin.
  • Modèle d'objet.

Modèle d'objet

Le modèle objet contient des informations sur chaque entité du jeu : armes, armures, PNJ, sorts, joueur. Il est unique à chaque jeu.

La fonctionnalité doit être comprise comme :

  • Puis-je mettre / enlever / acheter / vendre / améliorer.
  • Restera-t-il dans l'inventaire après la mort.
  • Perdra-t-il de la force avec le temps ou avec une sorte d'action.
  • Que cela augmente les caractéristiques d'un personnage ou d'un groupe.
  • Si l'ensemble a des propriétés spéciales.

Les points décrits ci-dessus sont facultatifs, leur nombre peut être réduit ou augmenté pour chaque groupe individuel d'entités.

Spécifications fonctionnelles

Poursuivant la réponse à la question de savoir comment créer des jeux pour Android, vous devriez parler de la section suivante du document de conception. Les spécifications fonctionnelles décrivent le gameplay pièce par pièce. Ici, vous devez dire aussi précisément que possible ce que le personnage principal peut faire et comment cela est mis en œuvre. La même chose doit être faite pour chaque PNJ séparément. En plus des personnages jouables, des trousses de premiers secours, des armes, des armures et des éléments environnementaux doivent être abordés.

En fait, cette section est un ensemble de règles qui affectent tous les moments de jeu, du menu à la façon dont les dégâts d'un coup seront calculés. Plus vous travaillez sur chaque point individuel, plus il sera facile de mettre en œuvre votre projet.

Contenu

Avant de créer un bon jeu, vous devez réfléchir à ce qu'il contiendra exactement. Lors de la description des spécifications, vous pouvez spécifier que les personnages tireront avec des armes à feu, qui sont chargées de munitions avec un dommage fixe. Lorsque vous frappez un PNJ, la puissance de l'armure sera déduite de ce paramètre. Vous devrez également indiquer le nom de chaque échantillon individuel d'armes, d'armures et de PNJ. Et, bien sûr, il est nécessaire de décrire le Contenu - ce sont les briques à partir desquelles l'ensemble du jeu sera ensuite construit.

Interface

L'interface est un ensemble de fonctions et de boutons avec lesquels l'utilisateur va interagir avec le programme. La principale chose à considérer lors de sa création est la commodité. Pour comprendre exactement comment organiser tous les éléments, vous pouvez exécuter et analyser les meilleurs exemples du genre, en transférant les solutions les plus appropriées à votre projet.

Choisir un moteur ou un constructeur

Une étape de plus qu'il faudra franchir avant de créer des jeux sur Android est de choisir.L'époque est révolue où tout devait être fait à partir de zéro. Aujourd'hui, en prenant un constructeur prêt à l'emploi, vous pouvez faire tout le travail en écrivant un minimum de code.

Le choix du moteur doit se faire en fonction de certaines de ses caractéristiques :

  • Conditions d'utilisation.
  • Possibilités.
  • Prix.
  • Assistance aux développeurs.
  • Documentation.
  • Taille de la communauté.
  • Simplicité.
  • Extensibilité.

Conditions d'utilisation: il est possible qu'après avoir acheté un constructeur une fois, vous n'en deveniez pas son plein propriétaire. Il arrive qu'avec le succès commercial du jeu, vous deviez payer un pourcentage des bénéfices aux développeurs du moteur. L'essentiel est qu'avant de créer des jeux sur Android, familiarisez-vous avec le produit choisi pour la mise en œuvre.

Possibilités: ils doivent couvrir complètement les besoins du développeur. Si le produit offre plus que ce dont il a besoin, le jeu peut être facilement étendu et de nouvelles fonctionnalités du dock de conception peuvent être utilisées. Mais pensez aussi à l'équilibre ! Utiliser l'Unreal Engine pour Tetris est stupide.

Support: Tout d'abord, il est important de savoir si le produit a un développement ? Les bugs sont-ils corrigés de version en version ? S'agit-il d'acquérir de nouvelles fonctionnalités et de nouveaux outils ? Un moteur qui évolue rapidement a un avantage sur un moteur gelé il y a quelques années.

Communauté: combien de personnes utilisent le constructeur ? Si les utilisateurs un grand nombre de, trouver de la documentation, des leçons, des master classes, des exemples n'est pas un problème. S'il y a relativement peu d'utilisateurs, ces informations peuvent ne pas être disponibles dans la mesure où cela vous permettra de faire quelque chose de compétitif.

Extensibilité: Avant de créer votre propre jeu, prenez la peine de savoir s'il est possible de connecter des modules externes au moteur sélectionné. Ils sont généralement utilisés pour exporter ou importer des modèles 3D, des sons, des scripts, des sprites. S'il existe un support pour de tels outils, le constructeur n'est pas limité aux seuls utilitaires internes pour la création de contenu.

UDK

Le kit de développement Unreal n'est pas le moteur de jeu le plus simple à apprendre, mais c'est l'un des plus puissants. Il est utilisé non seulement par les développeurs novices, mais aussi par les grandes entreprises. Si vous cherchez une réponse à la question : « Comment créer un jeu 3D et quel moteur choisir pour cela ? - vous devriez explorer les possibilités de l'UDK.


Le langage de script interne, UnrealScript, est utilisé pour décrire la logique du programme. Le site du développeur propose de nombreuses leçons, à la fois filmées en vidéo et décrites en texte. En même temps, ils couvrent le maximum de fonctionnalités - de l'éditeur à l'écriture de vos propres scripts.

Couple 2D/3D

Torque est l'un des constructeurs de jeux les plus populaires pour les plateformes mobiles. Possède tous les éditeurs et outils de débogage nécessaires. Au cours du développement, les programmeurs ont accordé une grande attention à la commodité et ont essayé de rendre tous les utilitaires aussi simples et accessibles que possible.

Le constructeur est livré avec une documentation qui décrit la plupart des fonctionnalités. Sur le site officiel, vous pouvez trouver des tutoriels et des codes sources pour plusieurs jeux prêts à l'emploi.

Pour écrire des scripts, Torque dispose d'un langage Torque Script intégré. Les propriétés de chaque objet peuvent être prédéfinies. En outre, le constructeur dispose d'un ensemble Box2D intégré, qui gère les calculs physiques.


Si vous essayez de trouver une réponse à la question : « Comment créer et quel moteur choisir pour cela ? - vous pouvez dire en toute sécurité que Torque vous permettra de réaliser un projet multijoueur en peu de temps. Toutes les fonctionnalités nécessaires sont intégrées à l'avance et les exemples sur le site officiel vous montreront comment les utiliser le plus efficacement possible.

Étudier

Après avoir choisi un moteur de jeu, on ne sait toujours pas comment créer un jeu. Vous devrez consacrer beaucoup de temps à votre formation. Comme il n'y a pas encore d'équipe, vous devrez tout faire vous-même : écrire des scripts, créer des textures, des sprites, des modèles (si le jeu est en trois dimensions), écrire un script, tester. Il est facile de deviner qu'un développeur novice devra maîtriser les bases de nombreux écrivains, testeurs, artistes et concepteurs à la fois.

Il est préférable d'apprendre par la pratique, c'est-à-dire en travaillant sur votre projet. Une autre façon d'apprendre tout ce que vous devez faire est de travailler pour une entreprise de développement de jeux. En même temps, il ne faut pas viser immédiatement le poste de chef programmeur : même si on vous demande de faire des choses routinières, ne refusez pas l'opportunité de regarder gamedev de l'intérieur.

Le travail dans n'importe quelle entreprise commence en bas, ce n'est pas grave. Et les compétences d'un scénariste, d'un level designer, d'un équilibreur, d'un testeur seront très utiles, et ce sont exactement les industries dans lesquelles travaillent la plupart des juniors. Après quelques années de tels cours, il sera possible d'apprendre à créer des documents de conception et des tâches techniques, de se familiariser avec les bug trackers et de constituer une base de contacts. Une fois le travail effectué, pour créer des jeux russes pour Android, vous devrez dépenser beaucoup moins d'efforts, car vous disposerez de toutes les compétences et capacités nécessaires.

Il est fort possible qu'après avoir prouvé votre compétence en matière de développement, vous n'ayez pas à quitter l'ancienne équipe, de plus, vous y prendrez une position de leader avec votre projet.

Comment créer un jeu pour Android ?











Faire un jeu pour n'importe qui système opérateur suppose des connaissances en programmation. Même les jeux les plus simples comme Flappy Bird doivent connaître les bases. Regardons comment un jeu est créé en utilisant le système d'exploitation Android comme exemple.

Moteur

La première étape de l'écriture d'un jeu consiste à installer le moteur. Il existe de nombreux moteurs sur le Web écrits dans divers langages de programmation. Bien sûr, les moteurs payants ont plus de fonctionnalités, sont plus stables et ouvrent plus de possibilités. Cependant, leur coût peut être très élevé. Par conséquent, nous prendrons comme exemple le moteur LibGDX gratuit.

Ce moteur a des capacités assez importantes et a des instructions d'utilisation en russe. Le moteur est multiplateforme, et donc le jeu qui sera écrit dessus pourra être installé sur d'autres plateformes.

Environnement de programmation

C'est aussi très point important est l'utilisation d'un environnement de programmation. Ce terme désigne un outil dans lequel le jeu sera écrit. Dans le cas du moteur LibGDX, l'environnement de programmation sera Exlipce. Étant donné que le moteur de jeu a été écrit dans le langage de programmation Java, pour utiliser l'environnement de programmation, vous devrez utiliser des compétences et des connaissances de base en programmation dans ce langage particulier. Par conséquent, si vous ne connaissez pas les bases, vous devrez les apprendre.

Création de projet

Pour écrire un jeu pour Android, comme toute autre plateforme, vous devez d'abord créer un projet. Ce n'est pas difficile à faire. Dans le cas de LibGDX, il suffit de décompresser le moteur dans un dossier et d'y trouver le fichier du même nom. Ensuite, vous devez cliquer sur le bouton "Créer un projet", et vous serez déjà en train de créer un projet. Ensuite, il vous suffit de sélectionner une plate-forme pour le jeu et de spécifier le nom du projet. Dans la configuration, vous devez spécifier où le jeu sera placé dans l'environnement de programmation. Le moteur créera le projet lui-même et vous dira si vous avez fait quelque chose de mal. Ensuite, vous pouvez accéder à l'environnement de programmation et commencer à écrire un jeu.

Comme vous pouvez le voir, créer un jeu pour Android et tout autre système d'exploitation est tout simplement impossible sans connaître les bases des langages de programmation. Cependant, maintenant, les moteurs s'améliorent et deviennent plus pratiques, même pour ceux qui commencent tout juste leur chemin dans cette entreprise. Game Maker est également un exemple d'un tel moteur. Vous pouvez en savoir plus sur ce moteur et sur la création d'un jeu dessus dans l'article.

Vue : 13378

Il existe de nombreux articles sur Habré sur différents aspects du développement de jeux pour Android, mais je n'ai pas vu un seul historique de développement et de sortie suffisamment complet et j'ai décidé de le corriger. Dans cet article, je parlerai du chemin parcouru par mes partenaires et moi-même, du désir de créer un bon jeu à la sortie effective.
Peu importe les leçons que nous avons apprises et l'expérience que nous avons acquise, bienvenue sous cat.

1) Création du gameplay et développement d'un prototype

L'ensemble du gameplay de notre jeu était l'incarnation des idées décrites dans mon article précédent. En bref, un bon jeu pour Android est extrêmement simple, monotone, avec des commandes en un clic, aucune punition pour la mort, des sons encourageants et réprimandés et de beaux graphismes minimalistes.
Et puis un jour, j'ai eu une idée intéressante pour un jeu qui combinerait toutes les propriétés ci-dessus. L'essentiel, comme on dit, est le suivant: deux gondoles jumelées volent dans l'espace et des obstacles avec des trous symétriques, à travers lesquels vous devez voler, s'en approchent.
L'idée rappelle un peu Jetpack Joyride et le bon vieux jeu dans lequel vous vous précipitez dans un tunnel, glissant à travers des trous dans des cercles tournants.

Eh bien, puisque vous avez une idée, vous devez faire un prototype. Le prototype n'a besoin de rien de superflu ne devrait pas l'être. Pas de menu, pas de boutons, pas de graphisme nécessaire, prototype est un pur concentré de gameplay. La mienne ressemblait à ça : (c'est déjà l'une des versions ultérieures, les premières ont été perdues au cours des siècles)

C'est ce que nous allons affiner, modifier, améliorer.

2) Perfectionner le gameplay et les bêta-tests

À toutes les étapes du développement, vous devez penser à l'utilisateur final, effectuer des tests sur des amis, des connaissances et des parents. Puisque vous faites le jeu personnellement et que vous savez tout à son sujet, il y a de grandes chances de perdre de l'objectivité. C'est à cela que servent les tests alpha et bêta. Lorsque vous regardez une autre personne utiliser votre application, voyez comment elle se comporte, ce qui ne lui semble pas évident dans l'interface, où c'est difficile pour lui. Il est extrêmement important de prendre en compte ce retour d'information et de ne pas retirer l'appareil de vos mains en criant : « Regardez comme il devrait être ».
Par exemple, dans notre jeu, les gens n'aimaient pas trop haute vitesse vol et longueur des gondoles. Par conséquent, il était nécessaire de réduire la vitesse et de raccourcir les gondoles.
N'ayez pas peur des changements globaux s'ils sont bénéfiques. C'est ainsi que l'orientation du vol a changé dans notre jeu, que les gondoles du vaisseau spatial sont devenues des vers et que les pièces permettant de collecter la monnaie du jeu sont devenues des étoiles recrutées pour aller dans le Warp.

3) Interface, son, graphisme

Parallèlement au perfectionnement du gameplay, il vaut la peine de créer une interface. Cela semble facile, mais le travail sur le rivetage des fenêtres et des menus prend beaucoup plus que la mécanique du jeu lui-même. L'interface doit être extrêmement simple, belle et conviviale. Agrandissez les boutons pour que sur les petits téléphones, il soit aussi confortable que sur une grande tablette. La beauté de l'interface est également importante. Par exemple, nous avons créé de magnifiques volets qui se ferment lors du chargement des scènes et des menus.

Une autre partie extrêmement importante du jeu est un didacticiel simple et direct. Voici comment nous l'avons mis en œuvre :

Comme je l'ai décrit dans le jeu, il devrait y avoir des sons accusant l'échec et encourageants pour les bonus et autres bonnes actions. Ils sont tirés du site de notre jeu. J'y ai trouvé le tintement des pièces de monnaie et le triste gémissement de la fanfare à la mort des vers. La musique devra probablement être achetée, mais elle est peu coûteuse.
Les graphismes doivent être minimalistes et caricaturaux. De beaux protagonistes et un arrière-plan discret sont le gage de qualité.

4) Boutique et produits en jeu

Le magasin est une chose très importante dans le jeu, qui oblige le joueur à rester et à le parcourir. Le magasin doit disposer d'une interface simple et intuitive, que nous n'avons pas pu mettre pleinement en œuvre.
Vous pouvez vendre n'importe quel article dans le magasin. Par exemple, nous vendons des vers, des arrière-plans et des bonus. Lors de la vente de bonus, il est important de se rappeler qu'ils doivent affecter de manière significative la facilité de passage, mais pas modifier les mécanismes du jeu.
À mon avis, la partie la plus importante de l'interface du magasin est l'incomplétude. Autrement dit, si tout n'est pas acheté, l'interface doit le montrer clairement. Les gens détestent l'incomplétude et s'efforcent de l'éliminer (c'est le secret du succès du "système trois étoiles" d'Angry Birds). Dans notre jeu, nous avons mis en place des bulles inachevées avec le nombre d'achats possibles à côté des sections du magasin.

Je dirai aussi quelque chose sur les prix du magasin.
Après quelques tours, le joueur devrait déjà être en mesure d'acheter quelque chose et il doit clairement montrer que quelque chose peut déjà être acheté. Mais les produits les plus chers doivent être évalués de manière à ce que le joueur doive jouer 20 à 30 fois avec succès pour les acheter. Voici par exemple les prix de nos vers, tenez compte du fait qu'un joueur expérimenté gagne de 2000 à 6000 points par manche, et un débutant de 300 à 1000 points.

5) Monétisation

Tout est simple ici. Pour les jeux Android, le choix est entre deux options de gains. Soit des publicités, soit des achats intégrés, car jeux payants dans Jeu de Google ne sont pas très populaires. Nous avons décidé de combiner les deux options. Publicité dans le menu, la possibilité de cela arrêt payé, la possibilité d'acheter de la monnaie dans le jeu pour de l'argent réel.

6) Conception de pages sur Google Play

La page GP est le visage de votre jeu. C'est sur elle que les gens décident de télécharger l'application ou non.

  • a) Icône. La partie la plus importante de la page. En le regardant, l'utilisateur ira se renseigner sur votre page. Il doit être simple, minimaliste et poli à la perfection. Il est souhaitable de représenter le personnage principal du jeu dessus. Je pense que notre icône est parfaite


  • b) Titre. Court et accrocheur. Il est souhaitable de partir de deux mots qui expriment toute l'essence du jeu. Nous avons appelé le nôtre Speedy Flyer. Cela sonne court, clair.

  • c) Captures d'écran. Pour comprendre de quoi parle le jeu, l'utilisateur regardera des captures d'écran. Ils ne devraient pas être moins bons que l'icône - lumineux, de préférence avec un post-traitement et des slogans invitants. Par exemple, voici nos belles captures d'écran.


  • d) Bannière en haut de la page. Une partie facultative mais souhaitable du visage du jeu. Une bonne bannière donne une ambiance à une page sur Google Play

  • e) Vidéo. Les vidéos sont comme des captures d'écran. L'homme le regarde pour voir le gameplay. Il est préférable de faire sur commande, car les vidéos faites à la main ont l'air pathétiques.

  • f) Estimations. L'utilisateur regardera certainement les notes avant de télécharger le jeu. Ils ne dépendent que de la qualité de l'application.

  • g) Descriptif. Je trouve que la description est la partie la moins importante de la page. Presque personne ne le lit. Mais si tu veux toujours écrire bonne description, lisez Dan Kennedy, par exemple son livre "Selling Letter"

7) Premiers retours et première mise à jour

Au début, nous avons décidé de ne pas lancer une vaste campagne publicitaire, mais d'abord d'essayer le jeu avec un petit public et d'obtenir des commentaires. Les gens ont aimé la mécanique du jeu, mais quelques défauts ont été trouvés. Par exemple, le jeu est trop statique, il n'y a pas assez de couleurs et de bonus. Par conséquent, nous préparons déjà la première mise à jour, dans laquelle nous corrigeons ces lacunes. Il est important de publier la mise à jour au cours de la première semaine.
Par exemple, nous faisons ceci :

  • a) Nouvelle propulsion et obstacles rotatifs qui augmenteront la dynamique du jeu

  • b) Réduisez légèrement la vitesse, car le jeu semble trop rapide aux gens

  • c) Échappement arc-en-ciel sur tout l'écran en entrant dans la chaîne. Cela ajoutera de la beauté

  • d) Nouvelles planètes et vers. Cela est nécessaire pour que ceux qui ont déjà réussi le jeu reviennent et que les nouveaux joueurs aient quelque chose à faire.

  • e) Beaucoup plus de faux sifflets

Je trouve que les premiers retours du test bêta ouvert sur un petit public jusqu'au début de la promotion sont extrêmement importants.
Aussi, n'ayez pas peur si quelque chose ne fonctionne pas sur certains appareils. C'est un inconvénient inné d'Android, vous devez vivre avec et résoudre les problèmes autant que vous le pouvez.

8) Édition

Nous publions le jeu avec l'habrauser. Beaucoup de ses conseils nous ont beaucoup aidés à améliorer le jeu, et il a également accepté de le promouvoir. Voici une histoire de ses lèvres :

« J'aimais faire de l'édition en général. Il est très intéressant d'aider les créateurs de jeux novices, de leur donner des conseils. Vous vous sentez un peu comme un enseignant. Si quelqu'un d'autre veut sortir un jeu, écrivez. Peut-être que je peux vous aider aussi."

Alors n'enterrez pas vos rêves et faites des jeux sympas.

P.S. :
P.P.S. : pour votre propre sécurité, je vous rappelle : envoyez les messages concernant les erreurs grammaticales à titre personnel, et non dans les commentaires.

Bonjour, Habrasosoobshchestvo!

Dans cet article, je voudrais parler de mon (pas la première) expérience de développement de jeux pour plateformes mobiles, l'historique de la création d'un jeu et les résultats obtenus. Comme il ressort du titre de l'article, cette expérience peut être considérée comme un échec, mais comment regarder ce qui sera discuté ci-dessous.

Contexte
Il y a quelque temps, pendant deux ans, je développais des jeux pour Téléphone Windows... Pendant ce temps, 6 jeux sont sortis, seuls 2 d'entre eux étaient payants + essai et n'ont rapporté que quelques dollars, le reste était gratuit sans publicité. J'ai développé des jeux pour cette plate-forme, car il y avait XNA + C #, j'ai vraiment aimé ce bundle, mais ensuite il y a eu des rumeurs, puis la réalité que le support de XNA prenait fin. J'ai commencé à chercher d'autres moteurs, parmi lesquels j'aimais le plus Unity. Je dis tout de suite que je ne veux pas polémiquer sur l'opportunité de l'utiliser pour des petits jeux, tout me convient ici, même si d'autres moteurs ont un éditeur, C#, cross-platform, etc. A cet instant Prise en charge de Windows Le téléphone dans Unity n'était pas encore disponible, mais cela ne m'a pas dérangé, car Je ne voulais plus développer pour cette plateforme, du moins pas encore (comme l'a dit un ami, pourquoi monter un cheval mort). Franchement, mes jeux étaient faibles, mais le choix était fait. L'abonnement du développeur Windows Phone a été fermé, une nouvelle phase d'études, de tutoriels et, en fait, de développement de jeux a commencé.
Sélection de jeu, démarrage
Comme vous le savez, vous ne pouvez pas commencer avec un problème compliqué. Pour cette raison, une idée a été choisie pour le jeu d'essai, que j'avais déjà commencé à implémenter pour Windows Phone, à savoir un puzzle dans le style des Pilot Brothers (capture d'écran), mais avec des mécaniques légèrement différentes. Dans mon jeu, lorsque je clique sur un objet, l'état change non pas pour toute la ligne et toute la colonne, mais uniquement pour l'objet sélectionné et pour les objets voisins (haut, bas, gauche, droite). Pour afficher visuellement l'effet de commutation, il a été décidé d'utiliser directement la mise en marche ou l'allumage, et qu'est-ce qui peut brûler ? Étoiles! Par conséquent, le nom Shining stars a été choisi assez rapidement. Le développement a commencé.

Il vaut la peine de dire qu'il n'y avait absolument aucun budget. Par conséquent, tout était censé être fait de manière indépendante - programmation, graphisme, promotion, etc.

Développement de
Il n'y avait pratiquement aucun problème ici. La fonctionnalité et la mécanique sont assez simples, j'ai donc fait la base très rapidement et facilement. J'ai dû souffrir uniquement de différents effets sous forme de rotation, de mise à l'échelle, de glissement, etc.

Rotation - Unity propose des méthodes pour faire pivoter les objets. Mais pour être honnête, ils fonctionnent pour moi parfois étrangement, car en partie je viens de fouiller au hasard et j'ai cherché une option qui me conviendrait.

Le glissement a été implémenté dans l'écran de sélection de niveau. Seule une partie des icônes avec des niveaux étaient affichées à l'écran (la taille de la partie dépend de la taille de l'écran), le reste s'affiche lors de la commutation avec les boutons "gauche" et "droite".

La mise à l'échelle s'est également avérée assez simple une fois que je l'ai compris. L'idée de base est que le jeu doit être beau sur toutes les tailles d'écran. Il n'y a pas beaucoup de cours sur ce sujet sur le net, j'ai surtout dû étudier les forums. Soit dit en passant, je veux immédiatement conseiller aux utilisateurs novices d'Unity d'aller sur leur forum en anglais, c'est très vivant, les gens essaient toujours d'aider, contrairement à la plupart des forums en russe sur divers sujets. En conséquence, je suis arrivé à une option dans laquelle une certaine taille d'écran est sélectionnée comme base, puis le coefficient par rapport à la taille réelle de l'écran du téléphone ou de la tablette est calculé. Tous les objets du jeu changent d'échelle et de position en fonction de ce coefficient. Personnellement, j'avais plus d'un coefficient, car différents types les objets du jeu devaient être mis à l'échelle différemment en raison du fait qu'ils étaient perçus différemment sur différents écrans. Certains objets sur les petits écrans pouvaient être laissés dans la taille standard, d'autres devaient être légèrement agrandis par rapport au premier.

Niveaux
Dans la toute, toute première version du jeu, je voulais faire 20 niveaux. Hmm, ce serait un jeu intéressant. Sur de sages conseils, ce nombre a été porté à ~ 100 (dans les plans). Bien sûr, je ne voulais pas créer les niveaux moi-même et vérifier s'ils pouvaient être résolus. Je suis programmeur, alors pourquoi se moquer de moi-même ! Au bout d'un moment, un générateur était prêt, qui produisait toutes les combinaisons possibles de niveaux d'une taille donnée, puis vérifiait si le niveau était résoluble, et le transmettait à fichier texte... C'était mon plus gros problème dans ce jeu. Si, avec la taille du terrain de jeu 4 * 4, le nombre de niveaux se mesurait en dizaines de milliers, alors pour le terrain 5 * 5 il y en avait déjà des millions, pour le terrain 6 * 6 ... Eh bien, vous obtenez le idée. Oui, je suis programmeur, je peux écrire un générateur, je peux lui apprendre à résoudre des niveaux, mais je ne peux pas lui apprendre à choisir quel niveau est beau et ira dans le jeu, et lequel sera éliminé. Par conséquent, tous ces millions de niveaux devaient être visualisés, sélectionnés manuellement. J'ai même essayé au début, mais ensuite j'ai compris l'ampleur de l'action (et je voulais faire le terrain de jeu jusqu'à la taille de 10 * 10) et je me suis senti mal.

Quoi qu'on en dise, mais il fallait revenir à la main en dessinant des motifs divers. Ces modèles ont été introduits dans le jeu, résolus par moi personnellement sur mon propre téléphone (en vérifiant en même temps la solvabilité + le plaisir esthétique de résoudre le niveau). Les niveaux insolubles ont été affinés, les niveaux inintéressants ont été jetés. Et après un certain temps, j'avais 120 niveaux prêts, classés par ordre croissant de leur taille et de leur difficulté dans les limites de taille.

Exemple de création d'un niveau

Voici à quoi ressemble le processus de création d'un niveau. Tout le champ est marqué d'une grille, les cases jaunes sont les endroits où il y a des étoiles, les cases blanches sont là où elles ne sont pas. Dans le coin supérieur gauche se trouve le code de niveau, sous la forme duquel ils sont stockés et traités dans le jeu. Dans le coin supérieur droit, le chiffre en vert clair signifie que le niveau a été résolu par moi en tel ou tel nombre d'étapes (il y a encore des carrés rouges aux niveaux non résolus), et Point d'exclamation signifie que le niveau est sélectionné pour entrer dans le jeu.

Le nombre 120 n'a pas été choisi par hasard. Sur différentes tailles de téléphone, l'écran de sélection de niveau peut contenir un nombre différent d'icônes pour ces niveaux. Avec le nombre 120, j'ai réussi à diviser les icônes en groupes avec le même nombre d'icônes dans chacun, ce qui est important. Je ne voulais pas que les premières pages aient 12 icônes, et la dernière seulement, par exemple, 10.

Arts graphiques
Les graphismes de mon jeu ont connu, à mon avis, toute une évolution ! Au départ, je voulais rendre le jeu très rapide et sortir "ce qui est" avec ces 20 niveaux. Et ce « ça » m'a semblé vraiment bien au début, mais après avoir reçu quelques conseils d'autres personnes, j'ai beaucoup réfléchi et j'ai commencé à tout redessiner. Divers jeux célèbres ont été pris comme base, par exemple Angry Birds, dont j'ai pris l'idée apparence UI, emplacement des icônes de niveau lorsqu'elles sont sélectionnées.

Ancienne version des graphiques

Menu principal avec deux options de bouton. Bien sûr, après le premier, le second semblait merveilleux ! Jusqu'à ce que la version finale soit faite.



Fenêtre d'informations sur le jeu


Fenêtre de sélection de niveau



Pour que le jeu ne semble pas mort, l'idée est venue d'y faire quelque chose qui donnerait l'effet inverse. L'arrière-plan en direct du jeu est devenu une telle idée - si vous regardez attentivement, le ciel étoilé en arrière-plan n'est pas seulement une image, d'autres étoiles colorées (bleu, jaune et jaune pâle) clignotent dessus, et de temps en temps même un l'étoile filante passe ! Oui, cet effet n'attire pas l'originalité et la nouveauté, mais je pense que cela a bien fonctionné et a contribué à créer la bonne atmosphère dans le jeu.

Graphiques finaux

Menu principal avec boutons de paramètres ouverts (afin de ne pas encombrer l'écran, ils sont d'abord minimisés et ouverts en cliquant sur le bouton de paramètres)


Fenêtre d'informations sur le jeu


Fenêtre de sélection de niveau


Une fenêtre avec un niveau pendant le jeu (une des options d'arrière-plan ; il y en a 3, sélectionnées au hasard)



Une attention particulière a été portée à absolument tout. Les objets du jeu ont été améliorés pour être beaux. Les objets de l'interface utilisateur (boutons, icônes de niveau) ont été améliorés pour être à la fois beaux et intuitifs simplement par leur image. Même pour l'icône, plusieurs options ont été développées, parmi lesquelles la dernière a à peine été choisie, puis remplacée par une autre qui m'a semblé plus appropriée. Et combien de fois ai-je redessiné tous les textes !

Icônes

Choix initiaux

Dernière option

TexturePacker m'a beaucoup aidé dans la composition graphique, je le recommande vivement ! Sa opportunités gratuites assez pour nos besoins, et elle collectionne vraiment bien les atlas. J'ai préparé plusieurs atlas - un pour les boutons et deux ensembles pour les objets du jeu (avec localisation en russe et langues anglaises). C'est vrai, dans ancienne version Unity J'ai dû découper les morceaux dont j'avais besoin en utilisant les coordonnées UV, ce qui est un peu gênant. DANS nouvelle version Unity peut rendre tout beaucoup plus facile avec les sprites.

Sons et musique
Il n'y a pas de problèmes ici. Il existe de nombreuses ressources où vous pouvez acheter des sons ou en obtenir gratuitement. Parce que Il n'y avait pas de budget, j'ai choisi plusieurs sons et mélodies adaptés que ces ressources vous permettent de télécharger gratuitement, c'est-à-dire tout est absolument légal et sans vol (oui, c'est important pour moi).
L'idée principale était de créer un environnement calme dans lequel le joueur peut réfléchir avec une musique douce en arrière-plan. Mais la toute première mise à jour du jeu a changé la donne - plus de musique rythmée a été ajoutée avec la possibilité de sélectionner la mélodie souhaitée (calme ou rapide) dans les paramètres.
Sortie, promotion, résultats
Notez que j'allais sortir le jeu uniquement pour Android. J'ai un téléphone correspondant, mais pas d'appareils iOS sur lesquels je pourrais tester le jeu, et je ne veux pas le sortir sans un vrai test. La raison en était que l'inscription sur Google Play est un paiement unique de 25 $, tandis qu'Apple doit payer 99 $ chaque année. Peut-être que je sortirai aussi le jeu pour iOS, mais un peu plus tard.

Immédiatement après la sortie, j'ai écrit sur le jeu sur un certain nombre de forums sur Android et j'ai commencé à suivre les résultats, qui sont apparus rapidement, mais l'affaire s'est pratiquement arrêtée là. Ensuite, j'ai publié deux mises à jour, dont chacune a été publiée sur les forums (au moins certaines, mais bosse). Il y avait aussi une variante d'évaluation croisée (vous donnez une note élevée au jeu de quelqu'un et lui demandez de donner une note élevée à votre jeu). Mais cela signifie installer tout un tas de jeux d'autres personnes (pas toujours au moins quelques bons) sur votre téléphone, tromperie possible de la part des autres (après tout, ce n'est pas un fait qu'ils apprécieront votre jeu en retour), alors je a rapidement abandonné cette option.

Sur le ce moment le nombre de téléchargements est très faible. J'ai deviné qu'il y aurait une sorte d'échec, mais tellement ... C'est en partie dû au fait que j'ai posté sur les forums non seulement un lien vers Google Play, mais moi-même fichier apk, et à en juger par les statistiques, ses téléchargements dépassent les téléchargements du jeu du marché.

Le jeu est gratuit. L'affichage publicitaire a été choisi comme monétisation. Pendant le processus de développement, j'ai voulu connecter plusieurs modules - s'il n'était pas possible d'en afficher un, afficher le second, etc. Le célèbre Chartboost a d'abord été connecté, puis j'ai essayé de connecter RevMob et PlayHaven, mais quelques hoquets sont sortis avec eux (franchement, ils ne fonctionnaient pas dans le jeu, je n'ai pas trouvé la raison), donc il n'y en avait qu'un module à gauche, dont tous les revenus étaient censés aller ... Mais si vous considérez ce qui précède (le nombre de téléchargements et le désir des utilisateurs de cliquer sur des publicités ou d'installer des jeux annoncés), vous comprenez qu'il n'y a pas de revenus.

conclusions
Comme on dit, un mauvais résultat est aussi un résultat. Il a fallu environ 14 à 15 mois entre le début du développement sur Unity (je ne compte pas le temps sur Windows Phone) et la sortie. A l'amiable, un tel jeu s'écrit en un mois de travail à temps partiel, et cela avec une marge. La raison était le manque de temps. Non, il y avait assez de temps - quelques heures le soir, quelques heures le week-end suffisaient pour continuer à faire le jeu sans longues pauses. Et je manquais de bien-être moral. Pendant cette période, il y avait beaucoup de problèmes personnels, alors qu'il y avait une envie de faire un jeu, il y avait des idées, mais je me suis assis devant l'ordinateur, j'ai regardé fixement l'écran, puis j'ai réalisé que je n'avais aucune inspiration, que je ne pouvait absolument rien mettre en œuvre et l'a désactivé ... Et c'est ainsi que cette année est passée.

Commençons par les points négatifs. J'ai vraiment passé beaucoup de temps sur le jeu, mais ici les circonstances sont hors de mon contrôle. Le jeu a franchement échoué, il ne m'a rapporté aucun revenu (enfin, quelques dollars ne comptent pas). Et de ce point de vue, c'est un échec total.

Mais il y a probablement des moments plus positifs. C'est avant tout une expérience ! Sur ce jeu, j'ai étudié les principales fonctionnalités de Unity avec une mise en garde - le jeu a été développé sur une ancienne version, où 2d n'était pas encore disponible. Maintenant, les jeux 2D peuvent être développés avec cela nouvelle technologie, car la plupart de mes développements du jeu ne sont peut-être plus nécessaires.

Dans ce jeu, j'ai réalisé que les graphismes sont vraiment importants ! Ne l'oubliez pas, jamais ! Si je sortais le jeu avec les premières options de conception, j'en aurais honte. Maintenant, j'ai sorti un beau jeu. Oui, elle a échoué, mais je suis toujours fier d'elle ! Si vous avez un budget, vous pouvez engager un bon designer. Sinon, redessinez tout encore et encore jusqu'à ce que le résultat en vaille vraiment la peine.

Je pense que la seule grosse erreur que j'ai faite ici a été le choix du genre du jeu. Probablement, la plupart des joueurs aiment les jeux d'action, les arcades, peut-être autre chose, mais ils n'aiment pas vraiment ce type de puzzle. Les gens voient mon jeu, certains peuvent ne pas aimer les graphismes, et certains le coupent à cause du genre. Et en parlant du prochain jeu que je développerais, je ne changerais que le genre, tout le reste serait pareil !

Balises : ajouter des balises

Bienvenue à tous.
Ce tutoriel a été écrit en mars 2012. J'ai maintenant décidé de le publier sur cette ressource... J'ai décidé de ne pas changer le code, je vous demande de ne pas lui reprocher (j'aurais moi-même trouvé à redire). Le texte de la leçon elle-même et les commentaires dans le code ont été légèrement améliorés. Le but de la leçon n'est pas de vous apprendre à créer des jeux, ce qui en soi est impossible en une seule leçon, mais de démontrer les bases du travail avec l'AIR mobile. Pourquoi Android et pas ios ? Car au moment d'écrire la leçon, lui seul était à portée de main. Pour ios, tout se fait à peu près de la même manière, mais il y a quelques différences, qui sont décrites à la fin de la deuxième partie de la leçon.
Je serai heureux de tous commentaires, remarques, indication d'erreurs.

Un peu de théorie.

Adobe AIR vous permet de créer en ActionScript 3 et MXML pour iOS et Applications Android, qui pour l'utilisateur seront indiscernables des natifs. Elles, comme toutes les applications natives, peuvent être distribuées via magasins de marque Applications Apple AppStore et Google Jouer au magasin (ancien Android Marché). La prise en charge de Stage3D a été ajoutée depuis AIR 3.2. Pour que les applications AIR fonctionnent sur Android, vous devez installer le runtime AIR sur l'appareil ou, lorsqu'il est compilé dans un runtime captif, le runtime est intégré à l'apk. Dans ce cas, l'installation d'AIR Runtime sur l'appareil n'est pas requise.

Lorsque vous travaillez avec des appareils mobiles, il convient de garder à l'esprit que les résolutions de leurs écrans sont inférieures (il y en a déjà des plus élevées) à celles des écrans d'ordinateur et que leurs dimensions physiques sont également beaucoup plus petites. Il existe également des concepts tels que "taille physique des pixels" et "densité de pixels", il faut donc faire attention à la taille des différents éléments graphiques (boutons, personnages du jeu, etc.). En général, c'est toute une science et nous ne nous y attarderons pas en détail.
Procédé d'entrée - écran tactile... Il existe un TouchEvent spécial pour gérer la saisie tactile, bien que les événements de la souris soient gérés correctement. Il y a aussi d'autres caractéristiques dont je parlerai pendant la leçon.
nous ferons très jeu simple Pour Android. Il sera possible de l'exécuter sur smartphones, tablettes et tout autre appareil.
L'environnement d'exécution AIR a certaines exigences matérielles et logicielles.
Pour Android, ils ressemblent à ceci :
- Version Android 2.2 ou supérieur ;
- Processeur avec architecture ARM7 avec une fréquence d'au moins 550MHz ;
- au moins 256 mégaoctets de RAM.

Les exigences pour les autres plates-formes peuvent être trouvées ici.

Pour terminer la leçon, nous avons besoin des éléments suivants :
-FlashDévelopper 4.2 ;
-Flex SDK 4.6 ;
- AIR SDK 3.5 ;
- bibliothèque de greensock ;
- Appareil Android. Vous pouvez vous débrouiller avec un émulateur, mais ce n'est pas si intéressant ;
- installé sur l'appareil AIR Mobile.

Les versions indiquées sont en vigueur au moment de la publication de la leçon. Il existe déjà Flex SDK 4.8, mais en substance c'est le même 4.6. Et à partir de 4.8, mon FlashDevelop commence à consommer trop de RAM, on ne sait pas pourquoi. Il est préférable de toujours utiliser dernière version AIR SDK, car de nouvelles fonctionnalités et bogues sont corrigés à chaque version. Il vous suffit de décompresser le SDK AIR dans le dossier Flex SDK avec remplacement de fichier et de connecter le Flex SDK à FlashDevelop.

Qu'allons-nous faire exactement.

Nous allons faire un petit jeu. Il représente ce qui suit : Les chiffres tombent du haut de l'écran. Ci-dessous, il y a une plate-forme qui doit capturer ou non ces chiffres, selon leur type. Le jeu se compose de trois écrans :
- menu principal avec fond, logo et deux boutons. L'un pour démarrer le jeu, l'autre pour quitter l'application ;
- écran de jeu. Contient une plate-forme, des chiffres en baisse ainsi que des indicateurs du niveau actuel et des scores. Et le bouton de sortie vers le menu principal ;
- un écran d'affichage du nombre de points marqués avec des boutons pour sortir du menu et "rejouer".

Quelques captures d'écran :

Commençons.

Tout d'abord, assurez-vous qu'AIR est installé sur l'appareil, s'il n'est pas installé, installez-le. Installez également sur votre ordinateur les pilotes pour que votre appareil se connecte à l'aide d'un câble.

Lancez FlashDevelop et créez un nouveau projet d'application AIR AS3 Mobile. Voici à quoi ressemble le projet créé :

Ce que nous voyons devant nous :

Le dossier bat contient plusieurs fichiers batch:
- CréerCertificat.bat nécessaire pour générer un certificat auto-signé pour Android. Sans ce certificat, il ne sera pas possible de construire apk ;
- InstallerAirRuntime.bat définit le temps d'exécution d'AIR sur Appareil Android from% FLEX_SDK% \ runtimes \ air \ android \ device \ runtime.apk. Mieux vaut installer la dernière version vous-même à partir de Jeu Android Magasin;
- Conditionneur.bat emballe une clé USB dans apk (android) ou ipa (ios);
- SetupApplication.bat contient divers paramètres d'application (chemins d'accès aux certificats, mots de passe de ceux-ci, nom de l'application, etc.);
- SetupSDK.bat contient le chemin d'accès au FlexSDK. Il est déterminé automatiquement, s'il n'est pas déterminé, vous devez l'enregistrer manuellement. Et contient également le chemin d'accès à AndroidSDK. En fait, seuls trois fichiers sont nécessaires : adb.exe, AdbWinApi.dll et AdbWinUsbApi.dll... De plus, ils sont déjà contenus dans le kit de distribution FlashDevelop et leur chemin d'accès est également attribué automatiquement.

Dans le dossier poubelle le fichier swf compilé est placé.
Dans le dossier certificat il doit y avoir des certificats.
Dossier Icônes contient des jeux d'icônes.
Deux dossiers standards lib et src pour les bibliothèques et les classes, respectivement.

Le dossier racine :
- Norme pour les applications AIR application.xml avec différents paramètres d'application ;
- PackageApp.bat vous permet de sélectionner la plate-forme et le type de package d'application. Après avoir choisi, packs. Un dossier apparaît dist avec apk ou ipa;
- Exécuter.bat télécharge l'application sur appareil mobile et l'exécute là-bas;
- Deux fichiers AIR_Android_readme.txt et AIR_iOS_readme.txt avec des instructions.

Mise en place du projet.

Ouvrir les paramètres du projet Projet / Propriétés, changez la couleur d'arrière-plan en noir. La résolution n'a pas d'importance. Nous allons nous adapter à l'actuel.
Nous avons défini la version AIR sur 3.5. En conséquence, les paramètres devraient ressembler à ceci :

Ouvrir le fichier application.xml, dans celui-ci, dans la deuxième ligne, modifiez la version AIR en 3.5 :

Ouverture des paramètres AIR - Propriétés du projet/de l'application AIR... Dans la fenêtre qui s'ouvre, allez dans l'onglet Fenêtre initiale... Dans cette fenêtre, sélectionnez Plateformes non fenêtrées.
Nous passons le mode d'affichage en portrait. Et désactivez Auto Orient, puisque le jeu ne sera qu'en mode portrait. Mode de rendu CPU ou alors Direct... Les paramètres devraient ressembler à ceci :


Ensuite, directement dans FlashDevelop, double-cliquez pour ouvrir le fichier Exécuter.bat et changer de ligne aller au bureau sur le goto android-debug... Cela est nécessaire pour tester le projet sur l'appareil. Si tu pars aller au bureau, le projet s'exécutera sur l'émulateur.

Nous devons maintenant générer un certificat. Sans cela, vous ne pourrez pas compresser l'application en .apk. Si le dossier certificat manquant dans le projet, créez-le manuellement. Ceci est important, car le fichier bat ne pourra pas atteindre un dossier inexistant. Exécuter le fichier bat / CreateCertificate.bat(clic droit / Exécuter), dans le dossier certificat notre certificat apparaît avec le mot de passe standard "fd". Il vaut la peine de dire que toute application Android doit être signée avec un certificat. Ce que nous avons généré est ce qu'on appelle le "certificat de développement". Cela nous suffit à ce stade.

Nous extrayons le fichier de l'archive du site greensock.com greensock.swc, mettez-le dans un dossier lib et connectez-vous au projet (clic droit / Ajouter à la bibliothèque).

Avec le réglage tout. Ajoutons les graphiques et icônes nécessaires au projet. Créer un dossier les atouts et placez-y les graphiques de l'archive, remplacez également les icônes. Ou vous pouvez dessiner vos propres homologues.

Venons-en au code.

Et maintenant, la chose la plus importante et la plus intéressante est d'écrire le code. Les classes de jeu ressemblent à ceci :

Type d'élément- types d'articles. Ceux-là mêmes qui tombent du haut de l'écran
constantes de package (/ ** * Constantes statiques pour définir le type d'objet de jeu. * * @author illuzor * / public class ItemType (/ ** regular object. Ajoute un aux points * / public static const GOOD: String = "goodItem" ; / ** objet "très bien". Ajoute 5 aux points * / public static const VERY_GOOD : String = "veryGoodItem"; / ** objet "evil". Soustrait un des points * / public static const EVIL : String = "evilitem "; ))
Type d'écran- types d'écrans. Au total, nous en avons trois, et ils sont décrits ci-dessus.
constantes du package (/ ** * Constantes statiques pour définir le type d'écran * * @author illuzor * / public class ScreenType (/ ** menu principal * / public static const MAIN_MENU: String = "mainMenu"; / ** game screen * / public static const GAME_SCREEN : String = "gameScreen" ; / ** écran affichant le résultat du jeu * / public static const SCORE_SCREEN : String = "scoreScreen" ;))
GameEvent- événements de jeu
événements du package (import flash.events.Event; / ** * Événements du jeu. * * @author illuzor * / public class GameEvent étend l'événement (/ ** sortie du jeu vers le menu principal via le bouton menu * / public static const EXIT_GAME : String = "exitGame" ; / ** partie jouée * / public statique const GAME_OVER : String = "gameOver" ; fonction publique GameEvent (type : String, bulles : Boolean = false, annulable : Boolean = false) (super (type , bulles, annulable );) public override function clone (): Event (retourner un nouveau GameEvent (type, bubbles, cancelable);) public override function toString (): String (retourner formatToString ("GameEvent", "type", "bulles) ", " annulable "," eventPhase " );)))
Regardons maintenant le paquet éléments... Ce sont les différents éléments graphiques qui sont utilisés dans le jeu.

Bouton est la classe du bouton. Consiste en image graphique et texte. A deux états : enfoncé / non enfoncé
éléments de package (import com.greensock.TweenLite ; import flash.display.Bitmap ; import flash.display.Sprite ; import flash.events.Event ; import flash.events.TouchEvent ; import flash.text.TextField ; import tools.Bitmaps ; import tools.Tools; / ** * La classe du bouton qui est utilisé dans le menu et ailleurs. * * @author illuzor * / public class Le bouton étend Sprite (/ ** @private texte à afficher sur le bouton * / private var text: String; / ** @private bitmap pour l'arrière-plan du bouton * / private var buttonImage: Bitmap; / ** * Le constructeur écoute les ajouts à la scène. * Ici, nous avons besoin de la scène au cas où il y aurait un clic sur le bouton et en éloignant le doigt du bouton * * @param texte texte à afficher sur le bouton * / public function Button (text: String) (this.text = text; addEventListener (Event.ADDED_TO_STAGE, addedToStage);) / ** * @private ajouter à la scène. * ajouter des graphiques et un champ de texte de bouton. * * @param e ajouter à l'événement de scène * / fonction privée addedToStage (e: Event): void (removeEventListener (Event.ADDED_TO_STAGE, addedToStage); buttonImage = Bitmaps.buttonBitmap; // ajoute un bitmap buttonImage.smoothing = true; addChild (boutonImage); var textField : TextField = Tools.generateTextField (50, texte); // générer un champ de texte ... textField.x = (buttonImage.width - textField.width) / 2; // ... le positionner et l'ajouter à la displayList textField.y = (buttonImage.height - textField.height) / 2; addChild (textField); this.addEventListener (TouchEvent.TOUCH_BEGIN, touchBegin); // toucher le bouton addEventListener (Event.REMOVED_FROM_STAGE, removeFromStage); // supprimer l'auditeur avec scène) / ** * animer l'alpha de moitié * * @param e événement de toucher le bouton avec un doigt * / fonction privée touchBegin (e: TouchEvent): void (TweenLite.to (buttonImage, .3, (alpha : .5)); stage.addEventListener (TouchEvent.TOUCH_END, touchEnd); // retire le doigt de l'écran après avoir appuyé sur le bouton) / ** * renvoie alpha à un * * @param e finger off event * / fonction privée touchEnd ( e: TouchEvent): void (TweenLite.to (buttonImage, .3, (alpha: 1)); stage.removeEventListener (TouchEvent.TOUCH_END, touchEnd)) / ** * lors de la suppression de la scène, kill no auditeurs plus nécessaires * * @ param e remove event from scene * / fonction privée removeFromStage (e: Event): void (removeEventListener (Event.REMOVED_FROM_STAGE, removeFromStage); this.removeEventListener (TouchEvent. TOUCH_BEGIN, touchBegin); stage.removeEventListener (TouchEvent.TOUCH_END, touchEnd)))))
Article- un objet qui tombe d'en haut pendant le jeu. Il peut y avoir trois types, ils sont décrits dans le code
éléments de package (import constants.ItemType; import flash.display.Shape; import flash.filters.GlowFilter; / ** * La classe d'élément (élément) qui tombe du haut de l'écran. * * @author illuzor * / public class L'élément s'étend sur la forme ( / ** type d'élément à partir de constantes.ItemType * / public var type : chaîne ; / ** vitesse de déplacement de l'élément * / public var vitesse : uint ; / ** * Le graphique de l'élément est dessiné dans le constructeur. * * @param type type d'élément * / public function Item (type: String) (this.type = type; switch (type) (// vérifier quel type est passé au constructeur // et, en fonction de cela , dessinez le Graphics.case ItemType.GOOD correspondant : // dessinez un carré vert this.graphics.beginFill (0x00A400); this.graphics.drawRect (0, 0, 14, 14); this.graphics.endFill (); pause ; case ItemType.VERY_GOOD : // dessine un carré bleu avec une lueur this.graphics.beginFill (0x01A6FE); this.graphics.drawRect (0, 0, 14, 14); this.graphics.endFill (); this.filters =; break; case ItemType.EVIL: // dessine en rouge e cercle graphics.beginFill (0xFF0000); graphiques.drawCircle (0, 0, 7); graphiques.endFill (); Pause; ))))
Plate-forme- le "protagoniste" du jeu. Une petite plate-forme contrôlée par le joueur.
éléments du package (import flash.display.Shape; import flash.filters.GlowFilter; / ** * La plate-forme pour attraper des objets, qui se trouve en bas de l'écran. * C'est très simple, dessinez un rectangle blanc et appliquez une lueur filtre. * Classe distincte pour que la plate-forme soit perçue comme une unité de jeu distincte. * * @author illuzor * / classe publique Plate-forme étend Shape (fonction publique Plate-forme () (this.graphics.clear (); this.graphics.beginFill () 0xFFFFFF); this.graphics.drawRect (0, 0, 110, 24); this.graphics.endFill (); this.filters =;)))
Paquet outils avec des outils.

Classer Bitmaps contient des graphiques joints et des méthodes pour l'obtenir de l'extérieur
outils de package (import flash.display.Bitmap; / ** * Bitmaps "générateur" à partir de pièces jointes * * @author illuzor * / bitmaps de classe publique (/ ** fichier graphique d'arrière-plan joint @private * / var statique privée BackgroundBitmap: Class; / ** @private graphique attaché pour le bouton * / private static var ButtonBitmap: Class; / ** @private graphique attaché pour le logo * / private static var LogoBitmap: Class; / ** Background Bitmap * / public static function get backgroundBitmap ( ): Bitmap (retourner le nouveau BackgroundBitmap () en tant que Bitmap;) / ** Bitmap du bouton * / fonction statique publique get buttonBitmap (): Bitmap (retourner le nouveau ButtonBitmap () en tant que Bitmap;) / ** Logo Bitmap * / fonction statique publique get logoBitmap () : Bitmap (retourner le nouveau LogoBitmap () sous forme de Bitmap ;)))
Classer Outils contient d'autres outils. Jusqu'à présent, seul un générateur de champs de texte
package tools (import flash.text.TextField; import flash.text.TextFormat; / ** * Classe avec de petits outils. * Jusqu'à présent, ne contient que le générateur de champ de texte. * * @author illuzor * / public class Tools (/ ** * Générateur de champ de texte basé sur des paramètres spécifiés * * @param size taille de la police * @param texte du texte à afficher * @param couleur du texte couleur * @return champ de texte personnalisé * / fonction statique publique generateTextField (taille : uint, texte : String = "" , color : uint = 0xFFFFFF): TextField (var textFormat: TextFormat = new TextFormat (); textFormat.color = color; textFormat.size = size; var textField: TextField = new TextField (); textField.selectable = false; textField. defaultTextFormat = textFormat ; textField.text = text ; textField.width = textField.textWidth +4 ; textField.height = textField.textHeight +4 ; return textField ;)))
Écrans d'application du package écrans

Menu principal- le menu principal du jeu. Affiché immédiatement après le démarrage. Contient des boutons, un arrière-plan et un logo.
écrans de package (import flash.display.Bitmap ; import flash.display.Sprite ; import flash.events.Event ; import flash.display.DisplayObject ; import tools.Bitmaps ; import elements.Button ; / ** * Classe du menu principal du jeu. * Ceci affiche un arrière-plan, un logo et deux boutons. * * @Author illuzor * / public class MainMenu étend Sprite (/ ** bouton "PLAY" * / public var playButton: Button; / ** " EXIT " bouton * / public var exitButton : Button; / ** * Dans le constructeur, il suffit d'écouter l'ajout à la scène * / public function MainMenu () (addEventListener (Event.ADDED_TO_STAGE, adddedToStage);) / ** * créer et ajouter un arrière-plan, un logo, des boutons * * @param e event ajoutant à la scène * / fonction privée adddedToStage (e: Event): void (removeEventListener (Event.ADDED_TO_STAGE, adddedToStage); // créer un bitmap d'arrière-plan et l'ajouter au scene var background: Bitmap = Bitmaps.backgroundBitmap; background.smoothing = true; addChild (background); placeBackground (background); // positionner l'arrière-plan // crée un bitmap du logo, définit la taille par rapport à la largeur de la scène // définit la position et ajoute à la scène var logo : Bitmap = Bitmaps.logoBitmap; logo.lissage = vrai; logo.width = stage.stageWidth * .7; logo.scaleY = logo.scaleX; logo.x = (stage.stageWidth - logo.width) / 2 ; logo.y = stage.stageHeight / 5; addChild (logo); // conteneur de boutons pour un positionnement pratique de ces boutons var buttonContainer: Sprite = new Sprite (); addChild (boutonsConteneur); // créer les boutons "PLAY" et "EXIT", les redimensionner et les ajouter au conteneur playButton = new Button ("PLAY"); buttonContainer.addChild (playButton); playButton.width = stage.stageWidth / 2; playButton.scaleY = playButton.scaleX; exitButton = nouveau bouton ("EXIT"); buttonContainer.addChild (exitButton); exitButton.y = boutonsConteneur.hauteur + 25 ; exitButton.width = stage.stageWidth / 2; exitButton.scaleY = exitButton.scaleX; // positionnement du conteneur avec les boutons buttonContainer.x = (stage.stageWidth -buttonsContainer.width) / 2; buttonContainer.y = (stage.stageHeight - boutonsContainer.height) / 2 + stage.stageWidth / 6 ; ) / ** * Cette fonction fait en sorte que l'objet DisplayObject qui lui est transmis remplisse toute la scène * sans modifier le rapport hauteur/largeur. Dans notre cas, il s'agit de l'image d'arrière-plan * * @param scaledObject DisplayObject à ajuster * / fonction privée placeBackground (scaledObject: DisplayObject): void (scaledObject.scaleX = scaledObject.scaleY = 1; var scale: Number; if (scaledObject.width / scaledObject.hauteur> stage.stageWidth / stage.stageHeight) (scale = stage.stageHeight / scaledObject.height;) else (scale = stage.stageWidth / scaledObject.width;) scaledObject.scaleX = scaledObject.scaleY = scale; scaledObject. x = ( stage.stageWidth - scaledObject.width) / 2 ; scaledObject.y = (stage.stageHeight - scaledObject.height) / 2 ;)))
En classe Écran de jeu il y a un processus de jeu. Les objets tombent d'en haut. Selon leur type, vous devez les attraper ou les éviter. Contrôle la boucle de jeu
écrans de package (import com.greensock.TweenLite ; import constants.ItemType ; import elements.Button ; import elements.Platform ; import elements.Item ; import events.GameEvent ; import flash.display.Sprite ; import flash.events.Event ; import flash.events.MouseEvent ; importer flash.events.TimerEvent ; importer flash.events.TouchEvent ; importer flash.text.TextField ; importer flash.utils.Timer ; importer tools.Tools ; / ** * La classe principale du jeu. gameplay: * Au bas de l'écran, il y a une plate-forme qui peut être déplacée à gauche / droite en déplaçant votre doigt sur l'écran dans n'importe quelle partie de l'écran. * Du haut tombent les soi-disant éléments, qui peuvent être de trois types: * - ItemType.GOOD - un élément normal. Une fois collecté, ajoute un aux points, lors du passage (en laissant la bordure inférieure de l'écran) * soustrait un des points * - ItemType.VERY_GOOD - élément "renforcé". Une fois collecté, il ajoute 5 aux points. Une fois passé, rien ne se passe. * - ItemType.EVIL - élément "mal". soustrait un des points. Une fois passé, rien ne se passe. * * Si la valeur des points est inférieure à cinq, la perte est comptabilisée et le score maximum est considéré comme le résultat du match. * A chaque nouveau niveau, les éléments se déplacent plus rapidement que le précédent. * * En haut à gauche se trouve l'indicateur des points marqués, en haut à droite se trouve le bouton de sortie vers le menu principal. * Ci-dessous, au centre sous la plate-forme se trouve l'indicateur de niveau actuel. * * * @author illuzor * / public class GameScreen étend Sprite (/ ** @private conteneur pour la plate-forme et les objets * / private var gameContainer: Sprite; / ** @private bouton pour quitter le menu principal * / private var menuButton: Button ; / ** @private platform * / private var platform: Platform; / ** @private gametimer. est nécessaire pour ajouter un nouvel élément * / private var gameTimer: Timer; / ** @private current level number * / private var currentLevel : uint ; / ** @private score actuel * / private var currentScore : int ; / ** @champ de texte privé pour afficher le numéro de niveau * / private var levelText : TextField ; / ** @champ de texte privé pour afficher les points * / private var scoreText: TextField; / ** score maximum * / public var maxScore: uint; / ** * Écoutez l'ajout à la scène dans le constructeur * / public function GameScreen () (addEventListener (Event.ADDED_TO_STAGE, addedtToStage); ) / * * * créer des éléments d'écran * * événement @param e ajouté onstage * / fonction privée addtToStage (e : Event) : void (removeEventListener (Event. ADDED_TO_STAGE, addedtToStage); gameContainer = nouveau Sprite (); // conteneur addChild (gameContainer); plate-forme = nouvelle plate-forme (); // crée une plate-forme, ajuste sa taille et sa position et l'ajoute à la scène platform.width = stage.stageWidth * .18; platform.scaleY = platform.scaleX; platform.x = (stage.stageWidth - platform.width) / 2 ; platform.y = stage.stageHeight * .88; addChild (plateforme); scoreText = Tools.generateTextField (30, "SCORE : 0"); // score du champ de texte scoreText.width = stage.stageWidth / 2; scoreText.x = scoreText.y = 10; addChild (scoreText); levelText = Tools.generateTextField (30, "LEVEL : 1"); // champ de texte de niveau levelText.width = levelText.textWidth + 4; levelText.x = (stage.stageWidth - levelText.width) / 2; levelText.y = stage.stageHeight - levelText.height - 20; addChild (niveauTexte); menuButton = new Button ("MENU"); // bouton pour quitter le menu principal. addChild (menuButton); menuButton.width = stage.stageWidth / 3.2; menuButton.scaleY = menuButton.scaleX; menuButton.x = stage.stageWidth - menuButton.width - 10 ; menuButton.y = 10; startNouveauNiveau (); // démarrer un nouveau niveau menuButton.addEventListener (TouchEvent.TOUCH_TAP, exitGame); // événement d'appuyer sur le bouton de sortie dans le menu stage.addEventListener (MouseEvent.MOUSE_MOVE, moveplatform); // événement du mouvement du doigt sur l'écran stage.addEventListener (MouseEvent.MOUSE_UP, moveplatform); // événement de retrait du doigt de l'écran addEventListener (Event.ENTER_FRAME, updateGame); // mettre à jour l'état du jeu addEventListener (Event.REMOVED_FROM_STAGE, removeFromStage); ) / ** * @private déplace la plateforme en fonction de la position du doigt sur l'écran. * * @param e événement de déplacement de votre doigt sur ou hors de l'écran * / fonction privée moveplatform (e: MouseEvent): void (if (mouseY> menuButton.y + menuButton.height) TweenLite.to (platform, .36, ( x: mouseX + -platform.width / 2));) / ** * @private commence un nouveau niveau. chaque niveau se compose de 20 éléments * / fonction privée startNewLevel (): void (var interval: uint = 2300; // timer call interval if (2300 - currentLevel * 350< 250) { // чем выше уровень, тем меньше интервал interval = 350; } else { interval = 2300 - currentLevel * 350; } gameTimer = new Timer(interval, 20); // создаём и запускаем таймер. gameTimer.start(); gameTimer.addEventListener(TimerEvent.TIMER, addItem); gameTimer.addEventListener(TimerEvent.TIMER_COMPLETE, cicleEnd); } /** * @private Создаём новый айтем по таймеру * * @param e событие тика таймера */ private function addItem(e:TimerEvent):void { var randomRange:Number = Math.random(); // случайное значене var itemType:String = ItemType.GOOD; // тип нового айтема. по умолчнанию все айтемы обычные if (randomRange >0,65 && plage aléatoire< .95) { // если случайное значение в заданном диапазоне (30%)... itemType = ItemType.EVIL; // айтем злой } else if (randomRange >= .95) (// 5% des articles seront "améliorés" itemType = ItemType.VERY_GOOD;) var item: Item = new Item (itemType); // crée un nouvel élément avec le type généré item.x = stage.stageWidth * Math.random (); // mettre au hasard x item.y = -item.height; // et by.y nous retirons de la scène item.speed = currentLevel + 1; // vitesse de l'élément gameContainer.addChild (élément); // et ajoutez-le à la scène) / ** * @private lorsque le minuteur a fini de fonctionner, effacez ce qui n'est pas nécessaire et démarrez un nouveau niveau * * @param e événement lorsque le minuteur se termine * / fonction privée cicleEnd (e: TimerEvent): void ( gameTimer.removeEventListener (TimerEvent.TIMER, addItem); gameTimer.removeEventListener (TimerEvent.TIMER_COMPLETE, cicleEnd); gameTimer = null; // supprime les auditeurs de la minuterie et une référence à la minuterie currentLevel ++; // "augmenter le level.text d'un levelText : "+ String (currentLevel + 1); // mettre à jour le texte du niveau levelText.width = levelText.textWidth +4; startNewLevel (); // démarrer un nouveau niveau) / * * * Boucle de jeu @private * Mettre à jour les positions des éléments. s'ils sortent de la scène, supprimez-les. * Gérer leurs collisions avec la plate-forme * * @param e enterFrame event * / fonction privée updateGame (e : Event) : void (// boucle sur tout le contenu du conteneur de jeu, à l'exception de la plate-forme (i = 1) pour ( var i : entier = 1 ; i< gameContainer.numChildren; i++) { var tempItem:Item = gameContainer.getChildAt(i) as Item; // берём айтем tempItem.y += (tempItem.speed * 3) * .8; // увеличиваем его.y координаты в зависимости от его скорости. if (tempItem.y >stage.stageHeight) (// s'il est tombé en panne ... gameContainer.removeChild (tempItem); // ... le supprimer ... if (tempItem.type == ItemType.GOOD) currentScore--; // .. et si son type s'avère être ordinaire, soustrayez un des points.) if (tempItem.hitTestObject (plate-forme)) (// si l'élément est attrapé par la plate-forme // selon son type, nous effectuons une action. / / Je pense qu'il n'y a pas besoin d'expliquer switch (tempItem.type) (case ItemType.GOOD: currentScore ++; break; case ItemType.VERY_GOOD: currentScore + = 5; break; case ItemType.EVIL: currentScore--; break ;) // également lorsque vous frappez la plate-forme, l'élément n'est plus nécessaire, supprimez-le de la scène gameContainer.removeChild (tempItem);)) scoreText.text = "SCORE:" + currentScore; // met à jour le champ de texte avec les scores if (maxScore< currentScore) maxScore = currentScore; // записываем максимальное количество очков if (currentScore < -5) { // если количество очков меньше, чем -5.. dispatchEvent(new GameEvent(GameEvent.GAME_OVER)); //... генерируем событие проигрыша } } /** * @private генерируем событие выхода из игры * * @param e событие прикосновения к кнопке выхода в меню */ private function exitGame(e:TouchEvent):void { dispatchEvent(new GameEvent(GameEvent.EXIT_GAME)); } /** * @private удаляем все ненужные больше слушатели * * @param e событие удаления со сцены */ private function removedFromStage(e:Event):void { removeEventListener(Event.REMOVED_FROM_STAGE, removedFromStage); removeEventListener(Event.ENTER_FRAME, updateGame); stage.removeEventListener(MouseEvent.MOUSE_MOVE, moveplatform); stage.removeEventListener(MouseEvent.MOUSE_UP, moveplatform); menuButton.removeEventListener(TouchEvent.TOUCH_TAP, exitGame); gameTimer.stop(); gameTimer.removeEventListener(TimerEvent.TIMER, addItem); gameTimer.removeEventListener(TimerEvent.TIMER_COMPLETE, cicleEnd); } } }
Écran de score affiché après une perte. Affiche une zone de texte avec le score final et des boutons pour revenir au menu et répéter le jeu
écrans du package (import elements.Button; import flash.display.Sprite; import flash.events.Event; import flash.text.TextField; import tools.Tools; / ** * Écran d'affichage du résultat du jeu en nombre de points marqués * Se compose du texte "VOTRE SCORE :" et des boutons "MENU" et "ENCORE" * * @author illuzor * / public class ScoreScreen étend Sprite (/ ** @private nombre de points à afficher * / private var score : uint; / ** bouton "MENU" * / public var menuButton: Button; / ** bouton "AGAIN" * / public var againButton: Button; / ** * Dans le constructeur, nous attendons l'ajout à la scène. Ici, le étape est nécessaire pour positionner les éléments * @param score le nombre de points à afficher * / fonction publique ScoreScreen (score : uint) (this.score = score; addEventListener (Event.ADDED_TO_STAGE, addedToStage);) / ** * créer un champ de texte pour afficher les scores et boutons pour rejouer le jeu et revenir au menu principal.* * @param e événement d'ajout à la scène * / fonction privée addedToStag e (e: Event): void (removeEventListener (Event.ADDED_TO_STAGE, addedToStage); // le champ de texte affiche le nombre de points marqués var scoreText: TextField = Tools.generateTextField (40, "YOUR SCORE:" + score); scoreText.x = (stage.stageWidth - scoreText.width) / 2 ; scoreText.y = (stage.stageHeight - scoreText.height) / 2 - stage.stageHeight / 6 ; addChild (scoreText); // bouton pour quitter le menu principal menuButton = new Button ("MENU"); addChild (menuButton); menuButton.width = stage.stageWidth / 2; menuButton.scaleY = menuButton.scaleX; menuButton.x = (stage.stageWidth - menuButton.width) / 2; menuButton.y = scoreText.y + scoreText.height + 30 ; // bouton "jouer plus" againButton = new Button ("AGAIN"); addChild (encore un bouton); encoreBouton.width = stage.stageWidth / 2; againButton.scaleY = againButton.scaleX; againButton.x = (stage.stageWidth - againButton.width) / 2 ; againButton.y = menuButton.y + menuButton.height + 30 ; )))
Et le dernier est la classe Principale de la racine. La classe principale du jeu. Sert à changer d'écran et à effacer ces commutateurs. Écoute les boutons d'écran et les événements de jeu. En fonction d'eux, efface la scène et affiche l'écran souhaité
package (importer des constantes.ScreenType ; importer des événements.GameEvent ; importer flash.desktop.NativeApplication ; importer flash.display.Sprite ; importer flash.display.StageAlign ; importer flash.display.StageScaleMode ; importer flash.events.Event ; importer flash. events.TouchEvent ; importer flash.ui.Multitouch ; importer flash.ui.MultitouchInputMode ; importer screens.GameScreen ; importer screens.MainMenu ; importer screens.ScoreScreen ; / ** * Classe de jeu principale. Contrôle l'affichage des différents écrans de jeu. * Le jeu représente de lui-même ce qui suit : en bas de l'écran se trouve une "plate-forme" qui peut être déplacée. * Du haut tombent des "objets" de trois types : rouge, vert, bleu. Vous devez les attraper avec le * * Créé avec FlashDevelop 4.0.1 et Flex SDK 4.6 * С en utilisant la bibliothèque de greensock - http://www.greensock.com/v11/ * * @author illuzor * @version 0.6 * / public class Main extend Sprite (/ ** @écran du menu principal privé * / private var menuScreen: MainMenu; / ** @écran de jeu privé * / var privé gameScreen : GameScreen ; / ** @écran privé pour afficher le score du jeu (score) * / var privé scoreScreen: ScoreScreen; / ** @private cette variable stocke les valeurs de texte du type d'écran * à partir de constants.ScreenType, qui est actuellement affiché * est nécessaire pour nettoyer correctement les écouteurs et les objets d'écran * / private var currentScreen: String; / ** * Constructeur principal * / fonction publique Main() : void (stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; // événement de désactivation "or" back ") stage.addEventListener (Event.DEACTIVATE, deactivate); // type d'entrée. TOUCH_POINT est défini par défaut et cela nous convient Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT; showMenu (); // affiche le menu principal.) / ** * @private affiche le menu principal * / private function showMenu() : void (currentScreen = ScreenType.MAIN_MENU; // applique le type d'écran menuScreen = new MainMenu (); // crée un menu et l'ajoute à la scène addChild (menuScreen); menuScreen.playButton.addEventListener (TouchEvent. TOUCH_TAP, startGame); // ajoute des écouteurs aux boutons de menu menuScreen.exitButton.addEventListener (TouchEvent.TOUCH_TAP, deactivate);) / ** * @private affiche l'écran de jeu * * @param e event touche le bouton playB utton du menu principal * / fonction privée startGame (e: TouchEvent): void (clear (); // effacer currentScreen = ScreenType. ÉCRAN_JEU ; // applique le type d'écran gameScreen = new GameScreen (); // crée un écran de jeu et l'ajoute à la scène addChild (gameScreen); gameScreen.addEventListener (GameEvent.EXIT_GAME, exitGame); // événement de sortie du jeu par bouton gameScreen.addEventListener (GameEvent.GAME_OVER, gameOver); // événement de perte) / ** * @private sortie du jeu en appuyant sur le bouton * * @param e événement de sortie du jeu * / fonction privée exitGame (e : GameEvent) : void (clear (); // clear showMenu (); // afficher le menu principal) / ** * @private le jeu est joué, affichant le résultat * * @param e loss event * / fonction privée gameOver (e: GameEvent): void (var score: uint = gameScreen.maxScore; // score . extrait de l'écran de jeu à partir de la variable maxScore clear (); // clear currentScreen = ScreenType.SCORE_SCREEN; // appliquer le type d'écran scoreScreen = new ScoreScreen (score); // créer et afficher l'écran de score addChild (scoreScreen); scoreScreen.menuButton.addEventListener (TouchEvent.TOUCH_TAP, exitScore); // bouton écouteurs de l'écran de résultats scoreScreen.againButton.addEventListener (TouchEvent.TOUCH_TAP, startGame);) / ** * @private exits l'écran des résultats par un bouton. * vous devez faire la même chose que lorsque vous appuyez sur le bouton de sortie, alors appelez simplement exitGame () * * @param e événement de toucher le bouton de sortie depuis l'écran des résultats * / fonction privée exitScore (e: TouchEvent): void (exitGame ( null);) / ** * @private nettoie les écouteurs et les objets d'écran inutiles * en fonction de l'écran actuel. * / fonction privée clear() : void (switch (currentScreen) (cas ScreenType.MAIN_MENU : menuScreen.playButton.removeEventListener (TouchEvent.TOUCH_TAP, startGame) ; menuScreen.exitButton.removeEventListener (TouchEvent.TOUCHate_TAP ;; null menuScreen) break ; case ScreenType.GAME_SCREEN : gameScreen.removeEventListener (GameEvent.EXIT_GAME, exitGame); gameScreen.removeEventListener (GameEvent.GAME_OVER, gameOver); removeChild (gameScreen); caseScreen scoreScreen.menuButtonApL. againButton.removeEventListener (TouchEvent.TOUCH_TAP, startGame); removeChild (scoreScreen); scoreScreen = null; break;)) / ** * quitter l'application via NativeApplication * appuyer sur le bouton home ou back pour quitter l'application * * @param e deactivation event * / fonction privée désactiver (e: Event): void (NativeApplication.nativeApplication.e xit (); )))

Compilation et exécution.

Le projet est mis en place, les graphiques sont dessinés, le code est écrit. C'est tout. Vous pouvez tester le jeu. On prend un smartphone, on va à Options de développeur, allumer Mode de débogage USB... Nous le connectons avec un câble à l'ordinateur.

Nous devons maintenant effectuer certaines actions dans FlashDevelop.
- nous compilons le projet Projet / ConstruireProjet(F8). Dans le dossier poubelle un lecteur flash apparaîtra;
- lancement PackageApp.bat... Entrez "2", appuyez sur Entrée. Nous attendons que le projet soit emballé dans apk et apparaisse dans le dossier dist;
- sélectionner dans le menu Déboguer/Démarrer la session à distance;
- Lancer Exécuter.bat- l'application sera téléchargée sur l'appareil, lancée là-bas et connectée au débogueur.

Tout, vous pouvez tester, utiliser un débogueur et même récupérer des traces directement depuis l'appareil. Le profileur ne fonctionne malheureusement pas.

Toutes ces 4 actions peuvent être réalisées de manière différente. Il suffit de choisir Projet / Projet d'essai(F5). Tout se fera automatiquement.

Lorsque l'application est testée et terminée, exécutez PackageApp.bat, nous introduisons l'unité. Dans le dossier dist release apk apparaîtra.

Fin de la première partie.