Le flash est lentement abandonné par Adobe en faveur de HTML5 et JavaScript; Son fin de vie officiel est fixée pour l'année 2020. Et c'est là que cet article sera utile.
Les conseils décrits ci-dessous visent à aider les développeurs de jeux HTML5 à éviter les erreurs courantes lors de la conversion de jeux flash à JavaScript, ainsi que de rendre tout le processus de développement aller aussi bien que possible. Tout ce dont vous avez besoin est la connaissance de base de JavaScript, WebGL et le cadre Phaser.
Changer votre conception de jeu de SWF vers JavaScript peut donner un meilleur expérience utilisateur , qui lui donne un look moderne. Mais comment le faire? Avez-vous besoin d'un convertisseur de jeu JavaScript dédié pour vous débarrasser de cette technologie obsolète? Eh bien, Flash to HTML5 Conversion peut être un morceau de gâteau - voici ce qu'un développeur expérimenté JavaScript a à dire sur la question.
J'aime garder votre processus de conception simple? UNE Générateur de site Web et la droite hébergement Web Le fournisseur peut le garder de cette façon.
Conversion d'une partie à une autre plate-forme est une excellente occasion de l'améliorer, de résoudre ses problèmes et d'augmenter le public. Vous trouverez ci-dessous peu de choses qui peuvent être facilement faites et méritent d'être envisagées:
En ce qui concerne le développement de jeux JavaScript, il peut s'empêcher de tirer parti de HTML et de CSS pour les boutons de jeu, les widgets et autres éléments d'interface graphique. Notre conseil est de faire attention ici. C'est contre-intuitif, mais en tirant réellement des éléments DOM est moins performant sur des jeux complexes et cela gagne plus de signification sur mobile. Si vous souhaitez obtenir une constante 60 FPS sur toutes les plates-formes, vous devez vous démissionner de HTML et de CSS.
Les éléments d'interface graphique non interactifs, tels que les barres de santé, les munitions de munitions ou les compteurs de score peuvent être facilement implémentés dans des images phases à l'aide d'images régulières (la classe 'Phaser.Image'), en tirant parti de la propriété "Croprop" pour la rognage et le 'Phaser. Classe de texte pour les étiquettes de texte simples.
Des éléments interactifs tels que des boutons et des cases à cocher peuvent être mis en œuvre à l'aide de 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.
Si vous souhaitez rendant du texte avec une police de vecteur personnalisé (par exemple, TTF ou OTF), vous devez vous assurer que la police a déjà été chargée par le navigateur avant de rendre n'importe quel texte. Phaser v2.6 ne fournit pas de solution à cette fin, mais une autre bibliothèque peut être utilisée - Chargeur de polices Web .
En supposant que vous ayez un fichier de polices et incluez le chargeur de polices Web de votre page, vous trouverez ci-dessous un exemple simple de la manière de charger une police. Faites un simple fichier CSS qui sera chargé par le chargeur de polices Web (vous n'avez pas besoin d'y inclure dans votre HTML):
@ font-face {
// Ce nom que vous utiliserez dans JS
Font-famille: 'Gunplay';
// URL au fichier de polices, peut être relatif ou absolu
SRC: URL ('../ Fonts / Gunplay.ttf') Format ('TrueType');
Poids de la police: 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,
'actif': fonction () {
// la police a chargé avec succès ...
},
'Douane': {
"Familles": [Gunplay '],
// URL au CSS mentionné précédemment
'URL': ['Styles / Fonts.css']
}
};
N'oubliez pas de mettre votre code dans le rappel «actif» indiqué ci-dessus. Et c'est tout!
Maintenant, nous sommes au centre de notre flash à la conversion JavaScript - il est temps de prendre soin des shaders. Pour stocker de manière persistante les données locales dans ActionScript, vous utiliseriez la classe 'SharedObject'. En JavaScript, le simple remplacement est le API localStorage , qui permet de stocker des chaînes pour obtenir des recharges de page survivants ultérieurs.
Sauver les données est très simple:
var progrès = 15;
localtstorage.settitem ('mygame.progress', progrès);
Notez que dans l'exemple ci-dessus, la variable "Progress", qui est un nombre, sera convertie en une chaîne.
Le chargement est simple aussi, mais rappelez-vous que les valeurs récupérées seront des cordes ou des nuls s'ils n'existent pas.
var progrès = parseint (localStorage.getem ('mygame.progress')) || 0;
Nous assurons ici que la valeur de retour est un nombre. Si cela n'existe pas, il sera attribué à la variable «Progrès».
Vous pouvez également stocker et récupérer des structures plus complexes, par exemple, JSON:
var statistiques = {'buts': 13, 'gagne': 7, "pertes": 3, "tire": 1
};
localtstorage.settitem ('mygame.stats', json.stringify (statistiques));
...
var statistiques = json.parse (localstorage.getem ('mygame.stats')) || {};
Il y a quelques cas lorsque l'objet «localStorage» ne sera pas disponible. Par exemple, lors de l'utilisation du fichier: // Protocole ou lorsqu'une page est chargée dans une fenêtre privée. Vous pouvez utiliser l'instruction «Essayez et attraper» pour vous assurer que votre code continuera à fonctionner et à utiliser les valeurs par défaut, qui est affichée dans l'exemple ci-dessous:
Essayez {
var progrès = localStorage.getem ('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 enregistrées par domaine et non par URL. Donc, s'il existe 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 préfixe et vous voulez généralement le remplacer par le nom du jeu.
Si votre jeu est intégré dans un iframe, LocalStorage ne persiste pas sur iOS. Dans ce cas, vous auriez besoin de stocker des données dans le parent iframe.
Lorsque Phaser et Pixijs rendent vos sprites, ils utilisent un simple shader interne. Il n'a pas beaucoup de fonctionnalités car il est adapté à la vitesse. Cependant, vous pouvez remplacer ce shader à vos fins. Par exemple, vous pouvez le tirer parti d'inspecter la découverte ou de la prise en charge de plus de fonctionnalités pour le rendu. Vous trouverez ci-dessous un exemple de la manière de fournir votre propre fragment par défaut Shader à Phaser V2.
Fonction précharge () {
ceci.load.shader ('FileName.frag', 'Shaders / FileName.frag');
}
fonction créer () {
var rendu = ceci.render;
var batch = renduer.spritTBatch;
batch.defaultshader =
nouveau pixi.abstractfilter (ce.cache.getshader ('FileName.frag'));
Batch.setContext (rendu.gl);
}
Un shader par défaut personnalisé peut être utilisé pour remplacer les méthodes de teinture par défaut dans Phaser et Pixijs. Tinting dans Phaser et Pixijs fonctionne en multipliant les pixels de texture par une couleur donnée. La multiplication sombre toujours des couleurs, ce qui n'est évidemment pas un problème; C'est simplement différent de la teinture flash. Pour l'un de nos jeux, nous devions mettre en œuvre une teinte similaire à Flash et ont décidé qu'un shader par défaut personnalisé pourrait être utilisé. Vous trouverez ci-dessous un exemple d'un tel shader de fragment:
// Variante de teinte spécifique, similaire à la teinture flash qui ajoute
// à la couleur et ne se multiplie pas. Un négatif de couleur
// doit être fourni pour ce shader fonctionner correctement, c'est-à-dire ensemble
// sprite.tint à 0 pour tourner toute la sprite en blanc.
float de précision lowp;
Vec2 VTexturecoord;
variant Vec4 vcolor;
Sampler2D uniforme USampler;
vide principal (void) {
VEC4 F = Texture2D (Usampler, VTexturecoord);
flotter a = pince (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 éclaire des pixels en ajoutant une couleur de base à la teinte une. Pour que cela fonctionne, vous devez fournir des négatifs de la couleur que vous souhaitez. Par conséquent, afin de devenir blanc, vous devez définir:
sprite.tint = 0x000000; // cela coulent le sprite au blanc
Sprite.tint = 0x00ffff; // cela donne rouge
Le remplacement d'une shader par défaut peut également être exploité pour aider au débogage. Ci-dessous nous avons expliqué comment le découvert peut être détecté avec un tel shader.
La découverte se produit lorsque beaucoup ou tous les pixels de l'écran sont rendus plusieurs fois. Par exemple, de nombreux objets prennent le même endroit et sont rendus un sur un autre. Combien de pixels qu'un GPU peut rendre par seconde est décrit comme un taux de remplissage. Les GPU de bureau modernes ont un taux de remplissage excessif à des fins de 2D habituelles, mais les mobiles sont beaucoup plus lentes.
Il existe une méthode simple pour déterminer le nombre de fois que chaque pixel sur l'écran est écrit en remplaçant le shader de fragment global par défaut dans Pixijs et Phaser avec celui-ci:
vide principal (void) {
gl_fragcolor.rgb + = 1,0 / 7,0;
}
Ce shader éclaire des pixels qui sont en cours de traitement. Le numéro 7.0 indique combien d'écritures sont nécessaires pour transformer les pixels blancs; Vous pouvez accorder ce numéro à votre goût. En d'autres termes, des pixels plus clairs à l'écran ont été écrits à plusieurs reprises et des pixels blancs ont été écrits au moins sept fois.
Ce shader aide également à trouver à la fois des objets «invisibles» que, pour une raison quelconque, sont toujours rendus, et des sprites qui ont des zones transparentes excessives qui doivent être dépouillées (GPU doit encore traiter des pixels transparents dans vos textures).
Un moteur de physique est un middleware responsable de simuler des organismes de physique (généralement une dynamique corporelle rigide) et de leurs collisions. Les moteurs de physique simulent des espaces 2D ou 3D, mais pas les deux. Un moteur de physique typique fournira:
Il y a un plugin phaser qui fonctionne bien à cette fin. Box2D est également utilisé dans le moteur de jeu Unity et Gamemaker Studio 2.
Alors qu'un moteur de physique accélérera votre développement, vous devez payer un prix: réduit les performances d'exécution. Détecter les collisions et le calcul des réponses est une tâche intensive de la CPU. Vous pouvez être limité à plusieurs dizaines d'objets dynamiques dans une scène sur les téléphones mobiles ou les performances dégradées par la face, ainsi que la vitesse de trame réduite au-dessous de 60 fps.
Si vous avez un jeu de jeu de jeu flash à l'intérieur d'un fichier .fla, les exporter de GUI n'est pas possible (au moins pas dans Adobe Animate CC 2017) en raison du manque d'options de menu servant cet objectif. Mais il y a une autre solution - un script dédié qui fait que:
Fonction normaliséefileName (nom) {
// convertit un nom de camelcase en nom de Snake_Case
nom de retour.replace (/ (a-z]) / g, '_ $ 1'). Remplacez (/ ^ _ /, '') .tolowercase ();
}
Fonction displaypath (chemin) {
// rend le chemin de fichier plus lisible
Renvoyer unescape (chemin) .replace ('Fichier: ///', '') .replace ('|', ':');
}
fl.outputpanel.clear ();
Si (fl.getdocumentdom (). Bibliothèque.getselectedems (). Longueur & GT; 0)
// Obtenir uniquement les éléments sélectionnés
var bibliothèque = fl.getdocumentdom (). Bibliothèque.getselectedems ();
autre
// obtenir tous les articles
var bibliothèque = fl.getdocumentdom (). Bibliothèque.items;
// demander à l'utilisateur du répertoire de destination d'exportation
var root = fl.browseforforfolderurl ("Sélectionnez un dossier");
erreurs de var = 0;
pour (var i = 0; i & lt; bibliothèque.length; i ++) {
item var = bibliothèque [i];
Si (item.itemType! == 'Sound')
Continuez;
chemin var = root + '/';
if (item.originalcompressiontype === 'cru')
chemin + = normaliséfileName (item.name.split ('.') ) + '.wav';
autre
chemin + = normaliséfileName (item.name);
Var Success = item.exporttofile (chemin);
Si (! Succès)
erreurs + = 1;
fl.trace (displaypath (chemin) + ':' + (succès? 'OK': 'Erreur'));
}
fl.trace (erreurs + 'erreur (s)');
Comment utiliser le script pour exporter des fichiers son:
C'est fait! Vous devriez maintenant avoir des fichiers WAV dans le répertoire spécifié. Ce qui reste à faire est de les convertir, par exemple, mp3, OGG ou AAC. (Si vous avez des fichiers de jeu pour rester en sécurité, effectuez une mise à niveau vers une décente stockage en ligne .)
Le bon vieux format MP3 est de retour, car certains brevets ont expiré et que chaque navigateur peut maintenant décoder et jouer des mp3. Cela rend le développement un peu plus facile, car enfin, il n'est pas nécessaire de préparer deux formats audio distincts. Auparavant, vous avez besoin, par exemple, les fichiers OGG et AAC, tandis que MP3 suffira maintenant.
Néanmoins, il y a deux choses importantes que vous devez vous souvenir de mp3:
Cet article a été publié à l'origine dans le numéro 277 de Creative Web Design Magazine Web Designer. Achetez le numéro 277 ici ou Abonnez-vous à Web Designer ici .
Articles Liés:
[dix] [dix] [dix] [dix] Création d'applications de navigateur avec node.js devient fastidieuse. ..
Page 1 sur 2: Page 1 [dix] Page 1 [dix] Page 2 La tâche principale d'un environnement de développement visu..
[dix] [dix] [dix] [dix] Lors de la création de la visualisation architecturale, vous devez représen..
[dix] [dix] [dix] [dix] Lorsque vous développez des projets Web simples impliquant une interaction u..
[dix] [dix] [dix] [dix] Pour les nouveaux arrivants de Zbrush , l'inte..
Le logiciel moderne peut être extrêmement puissant et tout englobant. Maya n'est pas différente, offrant une matrice déroutante aux outils, commandes et options pour vous aider à atteind..
[dix] [dix] [dix] [dix] Démontrer la construction d'une créature dans zbrush, j'utilise ce morceau ..
[dix] [dix] [dix] [dix] Plippednormals Est-ce qu'un site géré par Henning S..