Fermer

juillet 30, 2018

Que devezvous savoir lors de la conversion d'un jeu Flash en HTML5?


A propos de l'auteur

Tomasz est un développeur de jeux HTML5 à Merixstudio une équipe logicielle agile de full-stack avec HQ à Poznan, en Pologne. Il a 18 ans d'expérience en codage. Tout au long de son …
En savoir plus sur Tomasz

Les astuces présentées dans cet article visent à aider les développeurs de jeux HTML5 à éviter les erreurs courantes lors de la conversion de leurs jeux Flash en JavaScript, ainsi que le processus de développement. lisse comme possible. Une connaissance de base de JavaScript, WebGL et du framework Phaser est requise.

Avec l'augmentation de l'utilisation de HTML5, de nombreuses entreprises commencent à refaire leurs titres les plus populaires pour se débarrasser de Flash obsolète et faire correspondre leurs produits aux dernières normes de l'industrie. Ce changement est particulièrement visible dans les industries du jeu, des casinos et des divertissements et se produit depuis plusieurs années maintenant, donc une sélection décente de titres a déjà été convertie.

Malheureusement, lorsque vous naviguez sur Internet, vous tombez souvent sur des exemples d'un travail apparemment hâtif, ce qui entraîne la qualité d'amant du produit final. C'est pourquoi c'est une bonne idée pour les développeurs de jeux de consacrer une partie de leur temps à se familiariser avec la conversion Flash vers HTML5 et d'apprendre les erreurs à éviter avant de se mettre au travail.

Outre les problèmes techniques évidents, le fait de changer la conception de votre jeu de SWF en JavaScript peut améliorer l'expérience utilisateur, ce qui lui donne un aspect moderne. Mais comment le faire? Avez-vous besoin d'un convertisseur de jeu JavaScript dédié pour se débarrasser de cette technologie obsolète? Eh bien, la conversion Flash vers HTML5 peut être un jeu d'enfant – voici comment s'en occuper

Recommended reading : Principes de la conception de jeux HTML5

Comment améliorer l'expérience de jeu HTML5

Convertir un jeu en une autre plate-forme est une excellente opportunité pour l'améliorer, résoudre ses problèmes et augmenter l'audience. Voici quelques éléments qui peuvent être facilement réalisés et méritent d'être pris en compte:

  • Prise en charge des périphériques mobiles
    La conversion de Flash en JavaScript permet d'atteindre un public plus large (utilisateurs d'appareils mobiles); la prise en charge des commandes tactiles doit également être implémentée dans le jeu. Heureusement, les appareils Android et iOS prennent désormais en charge WebGL, ce qui permet généralement d'obtenir facilement un rendu de 30 ou 60 images par seconde. Dans de nombreux cas, 60 FPS ne causera aucun problème, qui ne fera que s'améliorer avec le temps, car les appareils mobiles deviennent de plus en plus performants.

  • Amélioration des performances
    Pour comparer ActionScript et JavaScript, ce dernier est plus rapide que le premier. Autre que cela, la conversion d'un jeu est une bonne occasion de revisiter les algorithmes utilisés dans le code du jeu. Avec le développement de jeux JavaScript, vous pouvez les optimiser ou supprimer complètement le code inutilisé laissé par les développeurs
  • Corriger des bugs et améliorer le gameplay
    Avoir de nouveaux développeurs dans le code source du jeu peut aider à corriger les bogues connus et très rares. Cela rendrait le jeu moins irritant pour les joueurs, ce qui les inciterait à passer plus de temps sur votre site et à encourager vos autres jeux.
  • Ajouter des analyses Web
    En plus de suivre le trafic, les analyses Web peuvent également être utilisé pour rassembler des connaissances sur la façon dont les joueurs se comportent dans un jeu et où ils sont coincés pendant le jeu.
  • Ajouter une localisation
    Cela augmenterait l'audience et serait important pour les enfants d'autres pays. Ou peut-être votre jeu n'est pas en anglais et vous voulez soutenir cette langue?

Pourquoi sauter HTML et CSS pour l'interface utilisateur en jeu va améliorer les performances du jeu

Quand il s'agit de développement de jeux JavaScript, il peut être tentant CSS pour les boutons dans le jeu, les widgets et autres éléments de l'interface graphique. Mon conseil est de faire attention ici. C'est contre-intuitif, mais en réalité tirer parti des éléments DOM est moins performant sur les jeux complexes et cela gagne plus d'importance sur mobile. Si vous voulez atteindre 60 FPS sur toutes les plates-formes, vous devrez peut-être quitter HTML et CSS.

Les éléments GUI non interactifs, tels que les barres de santé, les barres de munitions ou les compteurs de score peuvent être facilement implémentés dans Phaser. images régulières (la classe Phaser.Image ), tirant parti de la propriété .crop pour le découpage et de la classe Phaser.Text pour les étiquettes de texte simples.

Les éléments interactifs en tant que boutons et cases à cocher peuvent être implémentés en utilisant la classe Phaser.Button intégrée. D'autres éléments plus complexes peuvent être composés de différents types simples, tels que des groupes, des images, des boutons et des étiquettes de texte.

Note: Chaque fois que vous instanciez un objet Phaser.Text ou PIXI.Text, un nouveau la texture est créée pour rendre le texte sur. Cette texture supplémentaire rompt le vertex batching, donc attention à ne pas en avoir trop

Comment s'assurer que les polices personnalisées sont chargées

Si vous voulez rendre du texte avec une police vectorielle personnalisée (par exemple TTF ou OTF), alors vous devez vous assurer que la fonte a déjà été chargée par le navigateur avant de rendre le texte. Phaser v2 ne fournit pas une solution à cette fin, mais une autre bibliothèque peut être utilisée: Web Font Loader .

En supposant que vous avez un fichier de police et incluez le Web Font Loader dans votre page, alors ci-dessous est un exemple simple de comment charger une police:

Faire un simple fichier CSS qui sera chargé par Web Font Loader (vous n'avez pas besoin de l'inclure dans votre HTML):

 @ font-face {
    // Ce nom que vous utiliserez dans JS
    famille de polices: 'Gunplay';
    // URL du fichier de police, peut être relative ou absolue
    src: url ('../ fonts / gunplay.ttf') format ('truetype');
    font-weight: 400;
}

Définissez maintenant une variable globale nommée WebFontConfig . Quelque chose d'aussi simple que cela suffira généralement:

 var WebFontConfig = {
   'classes': faux,
   'timeout': 0,
   'active': function () {
       // La police a été chargée avec succès ...
   },
   'Douane': {
       'familles': ['Gunplay'],
       // URL du CSS précédemment mentionné
       'urls': ['styles/fonts.css']
   }
}

A la fin, n'oubliez pas de mettre votre code dans le rappel 'actif' montré ci-dessus. Et c'est tout!

Comment faciliter l'enregistrement du jeu par les utilisateurs

Pour stocker de manière persistante des données locales dans ActionScript, vous devez utiliser la classe SharedObject. En JavaScript, le remplacement simple est localStorage API qui permet de stocker des chaînes pour une récupération ultérieure, en conservant les rechargements de page.

Sauvegarder des données est très simple:

 var progress = 15;
localStorage.setItem ('myGame.progress', progression);

Notez que dans l'exemple ci-dessus, la variable de progression qui est un nombre, sera convertie en chaîne.

Le chargement est également simple, mais rappelez-vous que les valeurs récupérées seront ] null si elles n'existent pas.

 var progress = parseInt (localStorage.getItem ('myGame.progress')) || 0;

Ici, nous nous assurons que la valeur de retour est un nombre. S'il n'existe pas, alors 0 sera affecté à la variable progression .

Vous pouvez également stocker et récupérer des structures plus complexes, par exemple, JSON:

 var stats = {'goals ': 13,' gagne ': 7,' pertes ': 3,' dessine ': 1};
localStorage.setItem ('myGame.stats', JSON.stringify (stats));
...
var stats = JSON.parse (localStorage.getItem ('monGame.stats')) || {};

Il y a des cas où l'objet localStorage ne sera pas disponible. Par exemple, lors de l'utilisation du protocole file: // ou lorsqu'une page est chargée dans une fenêtre privée. Vous pouvez utiliser l'instruction try and catch pour vous assurer que votre code continuera à fonctionner et utilisera les valeurs par défaut, ce qui est montré dans l'exemple ci-dessous:

 try {
    var progress = localStorage.getItem ('myGame.progress');
} catch (exception) {
    // localStorage non disponible, utilisez les valeurs par défaut
}

Une autre chose à retenir est que les données stockées sont sauvegardées par domaine et non par URL. Donc, s'il y a un risque que de nombreux jeux soient hébergés sur un seul domaine, il est préférable d'utiliser un préfixe (espace de noms) lors de l'enregistrement. Dans l'exemple ci-dessus 'myGame.' est un tel préfixe et vous voulez généralement le remplacer par le nom du jeu.

Note : Si votre jeu est imbriqué dans un iframe, localStorage ne persistera pas sur iOS. Dans ce cas, vous devrez stocker les données dans le cadre iframe parent .

Comment tirer parti du shader de fragment par défaut

Lorsque Phaser et PixiJS affichent vos sprites, ils utilisent un simple fragment interne. Il n'a pas beaucoup de fonctionnalités, car il est conçu pour une vitesse. Cependant, vous pouvez remplacer ce shader pour vos besoins. Par exemple, vous pouvez en tirer parti pour inspecter ou prendre en charge plus de fonctions pour le rendu.

Voici un exemple de la façon de fournir votre propre fragment shader par défaut à Phaser v2:

 function preload () {
    this.load.shader ('filename.frag', 'shaders / filename.frag');
}

function create () {
    var renderer = this.renderer;
    var batch = renderer.spriteBatch;
    batch.defaultShader =
        nouveau PIXI.AbstractFilter (this.cache.getShader ('filename.frag'));
    batch.setContext (renderer.gl);
}

Note: Il est important de se rappeler que le shader par défaut est utilisé pour TOUS les sprites ainsi que pour le rendu d'une texture. Gardez à l'esprit que l'utilisation de shaders complexes pour tous les sprites dans le jeu réduira grandement les performances de rendu

Comment changer la méthode de teinte avec un shader par défaut

dans Phaser et PixiJS.

Teinter dans Phaser et PixiJS fonctionne en multipliant les pixels de texture par une couleur donnée. La multiplication assombrit toujours les couleurs, ce qui n'est évidemment pas un problème; c'est simplement différent de la teinte Flash. Pour l'un de nos jeux, nous devions implémenter une teinte similaire à Flash et avons décidé qu'un shader par défaut personnalisé pouvait être utilisé. Voici un exemple de fragment shader:

 // Variant de teinte spécifique, similaire à la teinte Flash qui ajoute
// à la couleur et ne se multiplie pas. Un négatif d'une couleur
// doit être fourni pour que ce shader fonctionne correctement, c'est-à-dire
// sprite.tint à 0 pour transformer le sprite entier en blanc.
flotteur bas de précision;

variant vec2 vTextureCoord;
variant vec4 vColor;

échantillonneur uniforme 2DdSampler;

void principal (vide) {
    vec4 f = texture2D (uSampler, vTextureCoord);
    float a = clamp (vColor.a, 0,00001, 1,0);
    gl_FragColor.rgb = f.rgb * vColor.a + pince (1.0 - vColor.rgb / a, 0.0, 1.0) * vColor.a * f.a;
    gl_FragColor.a = f.a * vColor.a;
}

Ce shader éclaircit les pixels en ajoutant une couleur de base à la teinte. Pour que cela fonctionne, vous devez fournir le négatif de la couleur que vous voulez. Par conséquent, pour obtenir du blanc, vous devez définir:

 sprite.tint = 0x000000; // Ceci colorie le sprite en blanc
Sprite.tint = 0x00ffff; // Cela donne du rouge

Le résultat dans notre jeu ressemble à ceci (remarquez comment les chars clignotent en blanc quand ils sont touchés):

 Exemple de shader par défaut personnalisé dans le développement du jeu
Shader par défaut personnalisé (chars clignotant blanc). Inspecter le surimpression pour détecter les problèmes de taux de remplissage

Le remplacement du shader par défaut peut également être utilisé pour faciliter le débogage. Ci-dessous j'ai expliqué comment overdraw peut être détecté avec un tel shader.

Overdrawing se produit lorsque plusieurs ou tous les pixels sur l'écran sont rendus plusieurs fois. Par exemple, beaucoup d'objets prennent le même endroit et sont rendus l'un sur l'autre. Le nombre de pixels qu'un GPU peut restituer par seconde est décrit comme le taux de remplissage. Les GPU de bureau modernes ont un taux de remplissage excessif à des fins 2D habituelles, mais les mobiles sont beaucoup plus lents.

Il existe une méthode simple pour savoir combien de fois chaque pixel est écrit en remplaçant le fragment global shader par défaut dans PixiJS et Phaser avec celui-ci:

 void main (void) {
    gl_FragColor.rgb + = 1,0 / 7,0;
}

Ce shader éclaircit les pixels en cours de traitement. Le nombre 7.0 indique combien d'écritures sont nécessaires pour activer le pixel blanc; vous pouvez accorder ce numéro à votre goût. En d'autres termes, des pixels plus clairs sur l'écran ont été écrits plusieurs fois, et les pixels blancs ont été écrits au moins sept fois.

Ce shader aide également à trouver des objets "invisibles" qui sont restitués et des sprites trop transparents. les zones autour de cette zone doivent être supprimées (le GPU doit toujours traiter les pixels transparents dans vos textures).


 Exemple de shader Overdraw en action dans le développement d'un jeu
Overdraw shader in action. ( Grand aperçu )

L'image sur la gauche montre comment un joueur voit le jeu, tandis que celui de droite montre l'effet de l'application de la surbrillance sur la même scène.

Pourquoi les moteurs de physique sont vos amis

Un moteur physique est un intergiciel qui est responsable de la simulation des corps physiques (généralement la dynamique du corps rigide) et de leurs collisions. Les moteurs de physique simulent des espaces 2D ou 3D, mais pas les deux. Un moteur physique typique fournira:

  • le mouvement des objets en réglant les vitesses, les accélérations, les articulations et les moteurs;
  • en détectant les collisions entre différents types de formes;

Chez Merixstudio, nous sommes de grands fans du moteur physique Box2D et l'avons utilisé à quelques reprises. Il y a un plugin Phaser qui fonctionne bien à cet effet. Box2D est également utilisé dans le moteur de jeu Unity et GameMaker Studio 2.

Bien qu'un moteur physique accélère votre développement, il y a un prix à payer: des performances d'exécution réduites. La détection des collisions et le calcul des réponses constituent une tâche gourmande en ressources processeur. Vous pouvez être limité à plusieurs dizaines d'objets dynamiques dans une scène sur les téléphones mobiles ou faire face à des performances dégradées, ainsi qu'une fréquence d'images réduite inférieure à 60 FPS.


 Exemple de différence dans la scène d'un jeu avec et sans débogage Phaser superposition affichée en haut
Superposition de débogage de la physique de Phaser. ( Grand aperçu )

La partie gauche de l'image est une scène d'un jeu, tandis que le côté droit montre la même scène avec la superposition de débogage de la physique Phaser affichée en haut.

Comment exporter des sons depuis un .fla Fichier

Si vous avez des effets sonores de jeu Flash dans un fichier .fla il n'est pas possible de les exporter depuis l'interface graphique (du moins pas dans Adobe Animate CC 2017) en raison de l'absence d'option de menu servant à cette fin. Mais il existe une autre solution – un script dédié qui fait exactement cela:

 function normalizeFilename (name) {
   // Convertit un nom camelCase en nom snake_case
   return name.replace (/ ([A-Z]) / g, '_ $ 1'). replace (/ ^ _ /, '') .toLongueCase ();
}

function displayPath (chemin) {
   // Rend le chemin du fichier plus lisible
   return unescape (chemin) .replace ('file: ///', '') .replace ('|', ':');
}


fl.outputPanel.clear ();

if (fl.getDocumentDOM (). library.getSelectedItems (). longueur> 0)
   // Obtenir uniquement les éléments sélectionnés
   var bibliothèque = fl.getDocumentDOM (). library.getSelectedItems ();
autre
   // Obtenir tous les éléments
   var library = fl.getDocumentDOM (). library.items;

// Demande à l'utilisateur le répertoire de destination d'exportation
var root = fl.browseForFolderURL ('Sélectionnez un dossier.');
var erreurs = 0;

pour (var i = 0; i 

Comment utiliser le script pour exporter des fichiers son:

  1. Enregistrez le code ci-dessus en tant que fichier .jsfl sur votre ordinateur;
  2. Ouvrez un ] .fla fichier avec Adobe Animate;
  3. Sélectionnez 'Commandes' → 'Exécuter la commande' dans le menu principal et sélectionnez le script dans le dialogue qui s'ouvre;
  4. Maintenant un autre fichier de dialogue apparaît pour sélectionner la destination d'exportation

Et maintenant, vous devriez avoir les fichiers WAV dans le répertoire spécifié, il vous reste à les convertir, par exemple en MP3, OGG, ou AAC.

Comment utiliser les MP3 dans Flash vers les conversions HTML5

Le bon vieux format MP3 est de retour, car certains brevets ont expiré et maintenant chaque navigateur peut décoder et lire des MP3, ce qui rend le développement un peu plus facile puisqu'il n'est finalement pas nécessaire de préparer deux formats audio séparés. , OGG et AAC, alors que maintenant MP3 suffira.

Néanmoins, il y a deux choses importantes vous devez vous rappeler à propos de MP3:

  • MP3 doit décoder après le chargement, ce qui peut prendre beaucoup de temps, en particulier sur les appareils mobiles. Si vous voyez une pause après que tous vos assets aient été chargés, alors cela signifie probablement que les MP3 sont décodés;
  • jouer sans relâche des MP3 en boucle est un peu problématique. La solution est d'utiliser mp3loop, à propos duquel vous pouvez lire l'article posté par Compu Phase .

Alors, pourquoi devriez-vous convertir Flash en JavaScript?

Comme vous pouvez le voir, Flash to JavaScript la conversion n'est pas impossible si vous savez quoi faire. Avec les connaissances et les compétences, vous pouvez arrêter de lutter avec Flash et profiter des jeux lisses et divertissants créés en JavaScript. N'essayez pas de corriger Flash – débarrassez-vous de cela avant que tout le monde ne soit forcé de le faire!

Voulez-vous en savoir plus?

Dans cet article, je me concentrais principalement sur Phaser v2. Cependant, une version plus récente de Phaser est maintenant disponible, et je vous encourage fortement à y jeter un coup d'œil, car elle présente une pléthore de nouvelles fonctionnalités, telles que plusieurs caméras, scènes, nappes ou Matter. js physics engine

Si vous êtes assez courageux et que vous voulez créer des choses vraiment remarquables dans les navigateurs, alors WebGL est la bonne chose à apprendre à partir de zéro. Il s'agit d'un niveau d'abstraction inférieur à celui de divers outils ou frameworks de construction de jeux, mais il permet d'obtenir de meilleures performances et une meilleure qualité même si vous travaillez sur des jeux 2D ou des démos. Parmi les nombreux sites Web que vous pourriez trouver utiles lors de l'apprentissage des bases de WebGL, il y aurait WebGL Fundamentals (utilise des démos interactives). En plus de cela, pour en savoir plus sur les taux d'adoption des fonctionnalités WebGL, cochez WebGL Stats .

Rappelez-vous toujours qu'il n'y a pas trop de connaissances – surtout quand il s'agit de développement de jeux! ] Éditorial brisant « /> (rb, ra, yk, il)




Source link

Revenir vers le haut