This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
Cette page propose un guide pratique et une liste de points à vérifier lors de la publication d’un jeu ou de son portage sur une nouvelle plateforme.
Le portage d’un jeu Defold sur une nouvelle plateforme ou sa première publication est généralement un processus simple. En théorie, il suffit de s’assurer que les sections pertinentes sont configurées dans le fichier game.project, mais pour tirer le meilleur parti de chaque plateforme, il est recommandé d’adapter le jeu à ses spécificités.
Veillez à adapter le jeu aux méthodes d’entrée de la plateforme. Envisagez d’ajouter la prise en charge des manettes si la plateforme le permet ! Et assurez-vous que le jeu dispose d’un menu de pause : si une manette se déconnecte soudainement, le jeu devrait être mis en pause !
Traduisez tous les textes du jeu. Pour une publication en Europe et dans les Amériques, envisagez de traduire au moins dans les langues EFIGS (anglais, français, italien, allemand et espagnol). Assurez-vous qu’il est facile de passer d’une langue à l’autre dans le jeu (via le menu de pause).
iOS uniquement : veillez à renseigner Localizations dans game.project, car sys.get_info() ne renverra jamais une langue qui ne figure pas dans cette liste.
Traduisez le texte de la page de la boutique, car cela aura un effet positif sur les ventes ! Certaines plateformes exigent que le texte de la page de la boutique soit traduit dans la langue de chaque pays où le jeu est disponible.
Assurez-vous que votre jeu se démarque de la concurrence. L’icône est souvent votre premier point de contact avec les joueurs potentiels. Elle doit être facile à repérer sur une page remplie d’icônes de jeux.
Veillez à utiliser des visuels percutants et attrayants pour votre jeu. Il vaut probablement la peine de dépenser un peu d’argent pour travailler avec un artiste afin de créer des visuels qui attirent les joueurs.
Les sauvegardes de parties et les autres états sauvegardés peuvent être enregistrés à l’aide de la fonction sys.save(filename, data) de l’API Defold et chargés avec sys.load(filename). Vous pouvez utiliser sys.get_save_file(application_id, name) pour obtenir le chemin d’un emplacement propre au système d’exploitation où les fichiers peuvent être enregistrés, généralement dans le dossier personnel de l’utilisateur connecté.
L’utilisation de sys.get_save_file() et de sys.save() fonctionne bien sur la plupart des plateformes, mais une approche différente est recommandée sur console. Les plateformes de console associent généralement un utilisateur à chaque manette connectée ; les sauvegardes de parties, les succès et les autres fonctionnalités devraient donc être associés à leur utilisateur respectif.
Les événements d’entrée des manettes contiendront un identifiant d’utilisateur qui peut servir à associer les actions d’une manette à un utilisateur sur la console.
Les plateformes de console et leurs extensions natives exposeront des fonctions d’API propres à la plateforme pour enregistrer et charger les données associées à un utilisateur donné. Utilisez ces API pour l’enregistrement et le chargement sur console.
Les API des plateformes de console pour les opérations sur les fichiers sont généralement asynchrones. Lorsque vous développez un jeu multiplateforme destiné aux consoles, il est recommandé de concevoir votre jeu de sorte que toutes les opérations sur les fichiers soient asynchrones, quelle que soit la plateforme. Exemple :
local function save_game(data, user_id, cb)
if console then
local filename = "savegame"
consoleapi.save(user_id, filename, data, cb)
else
local filename = sys.get_save_file("mygame", "savegame" .. user_id)
local success = sys.save(filename, data)
cb(success)
end
end
Veillez à générer les symboles de débogage pour chaque version publiée afin de pouvoir déboguer les plantages. Conservez-les avec le bundle de l’application.
Consultez le manuel d’optimisation pour savoir comment optimiser les performances, la taille, l’utilisation de la mémoire et la consommation de batterie de votre application.
Testez toujours sur le matériel cible ! Vérifiez les performances du jeu et optimisez-le si nécessaire. Utilisez le profileur pour trouver les goulots d’étranglement dans le code.
Pour les plateformes dont l’orientation et la résolution d’écran sont fixes : vérifiez que le jeu fonctionne avec la résolution et le rapport largeur/hauteur de l’écran de la plateforme cible. Pour les plateformes dont la résolution et le rapport largeur/hauteur de l’écran sont variables : vérifiez que le jeu fonctionne avec différentes résolutions et différents rapports largeur/hauteur. Prenez en compte le type de projection de vue utilisé dans le script de rendu et la caméra.
Pour les plateformes mobiles, verrouillez l’orientation de l’écran dans game.project ou assurez-vous que le jeu fonctionne aussi bien en mode paysage qu’en mode portrait.
L’utilisation d’une petite découpe dans l’écran pour accueillir la caméra frontale et les capteurs (également appelée encoche ou poinçon) est de plus en plus courante. Lorsque vous portez un jeu sur mobile, veillez à ce que les informations essentielles restent dans la zone sûre de la plateforme.
Defold intègre la prise en charge de la zone sûre sur Android et iOS. Définissez gui.safe_area_mode dans game.project pour contrôler quelles marges de la zone sûre, sur des bords opposés, influencent l’ajustement de l’interface graphique. none est la valeur par défaut et ignore ces marges ; long applique les marges gauche/droite en mode paysage et haut/bas en mode portrait ; short applique la paire opposée ; et both applique les marges des quatre bords. Un script d’interface graphique peut remplacer, pour sa scène, le mode défini à l’échelle du projet à l’aide de gui.set_safe_area_mode(). Pour une logique d’interface graphique ou de rendu personnalisée, window.get_safe_area() renvoie le rectangle de la zone sûre et les marges de chaque bord. Les plateformes sans marges de zone sûre intégrées renvoient la fenêtre entière et des marges nulles.
L’extension Safe Area reste une solution possible pour les anciens projets ou les flux de travail qui nécessitent un comportement allant au-delà des API intégrées ; elle n’est pas nécessaire pour la gestion standard de la zone sûre sur Android et iOS.
window.get_reserved_areas() indique les régions individuelles qui obstruent la fenêtre du jeu, comme les découpes de caméra et la Dynamic Island. Utilisez ces rectangles pour placer le contenu autour de chaque obstruction. Utilisez window.get_safe_area() lorsqu’il vous faut un seul rectangle sûr pour la mise en page et ses marges par rapport aux bords.
Le résultat est un tableau de tables comportant les champs x, y, width et height. Chaque rectangle est limité à la fenêtre du jeu. L’origine se trouve en bas à gauche : x est le bord gauche et y le bord inférieur, en pixels de fenêtre correspondant à window.get_size(). Ces coordonnées sont indépendantes de l’ajustement GUI et de la résolution logique de game.project ; tenez donc compte de vos transformations GUI avant de les utiliser comme positions de nœuds.
La prise en charge par plateforme est la suivante :
La fonction renvoie une table vide sur les plateformes et versions du système non prises en charge, ou lorsqu’aucune obstruction n’est signalée pour la fenêtre. Une table vide ne signifie pas que toute la fenêtre est sûre pour du contenu important : les plis, barres système, claviers et zones de gestes ne relèvent pas de cette API. Utilisez window.get_safe_area() pour obtenir le rectangle sûr de la plateforme.
Interrogez les zones réservées à l’initialisation, puis à chaque callback window.WINDOW_EVENT_RESIZED. Après la première interrogation, les changements de géométrie des zones réservées déclenchent aussi cet événement sur les plateformes compatibles, même si la taille de la fenêtre ne change pas. Chaque table renvoyée est un instantané ; les tables conservées ne sont pas mises à jour automatiquement.
Sur iOS, cet événement est également envoyé après les transitions d’orientation et les modifications des marges de la zone sûre. Une rotation de 180° en paysage peut déplacer une découpe de caméra ou la Dynamic Island vers le côté opposé sans modifier les dimensions de la fenêtre ni les marges de la zone sûre. Rafraîchissez votre géométrie à cet événement même si data.width et data.height sont identiques aux valeurs précédentes.
Le script suivant maintient les deux ensembles de géométrie à jour :
local function refresh_screen_areas(self)
self.safe_area = window.get_safe_area()
self.reserved_areas = window.get_reserved_areas()
-- Update your UI using the new safe rectangle and reserved areas.
end
local function on_window_event(self, event, data)
if event == window.WINDOW_EVENT_RESIZED then
-- Refresh even when the width and height have not changed.
refresh_screen_areas(self)
end
end
function init(self)
refresh_screen_areas(self)
window.set_listener(on_window_event)
end
function final(self)
window.set_listener(nil)
end
Un seul écouteur d’événements de fenêtre peut être enregistré à la fois. Si votre jeu en possède déjà un, ajoutez cette logique de rafraîchissement à cet écouteur. Remplacer le tableau conservé à chaque rafraîchissement supprime également les rectangles périmés lorsque le résultat devient vide.
Veillez à conserver votre magasin de clés dans un endroit sûr afin de pouvoir mettre à jour votre jeu.
Conservez le bundle complet de chaque version. Vous aurez besoin de ces fichiers si vous souhaitez appliquer un correctif au jeu.
Intégrez le code propre à la plateforme : pour Nintendo Switch, une extension distincte fournit des fonctions utilitaires pour la sélection de l’utilisateur, etc.
Defold pour Nintendo Switch utilise Vulkan comme moteur de rendu graphique : veillez à tester le jeu avec le moteur de rendu graphique Vulkan.
Intégrez le code propre à la plateforme : pour PlayStation®4, une extension distincte fournit des fonctions utilitaires pour la sélection de l’utilisateur, etc.
Les jeux Web sur téléphone mobile gagnent en popularité : essayez de faire en sorte que le jeu fonctionne bien aussi dans un navigateur mobile ! Gardez également à l’esprit que les jeux Web sont censés se charger rapidement ! Veillez à optimiser la taille du jeu. Pensez aussi à l’expérience de chargement dans son ensemble pour ne pas perdre de joueurs inutilement.
En 2018, les navigateurs ont introduit une politique de lecture automatique des sons qui empêche les jeux et les autres contenus Web de jouer des sons tant qu’aucun événement d’interaction utilisateur (toucher, bouton, manette, etc.) n’a eu lieu. Il est important d’en tenir compte lors du portage en HTML5 et de ne commencer à jouer les sons et la musique qu’à la première interaction de l’utilisateur. Les tentatives de lecture de sons avant toute interaction utilisateur seront consignées comme des erreurs dans la console de développement du navigateur, mais n’auront aucun effet sur le jeu.
Veillez également à mettre en pause tous les sons en cours de lecture si le jeu affiche des publicités.