Curieux de développer des jeux en 3D? C'est le moment d'apprendre! Cette série de tutoriels en cinq parties montrera comment créer un jeu simple avec ShiVa3D Suite, un moteur de jeu 3D multiplate-forme et un outil de création. Il s’agit du quatrième volet de la série, dans lequel vous terminerez la programmation du modèle AI pour le jeu et apprendrez à créer des tests unitaires pour vérifier votre travail..
Dans la troisième partie, nous avons appris à modifier la scène de notre application. Nous avons également commencé à saisir le code des AIModels du jeu et à compléter le codage de DuckAI. Dans la partie 4, nous terminerons le codage des modèles AIM restants, EggAI et MainAI, et effectuerons des tests unitaires en animant le jeu. Nous exporterons ensuite le jeu à partir de l'éditeur ShiVa pour l'importer dans l'outil de création de Shiva. Enfin, nous allons discuter de deux options de création différentes dans l'outil de création de Shiva: une pour générer un exécutable Android et une autre pour générer un projet Eclipse..
Dans l'éditeur AIModel, sélectionnez l'onglet EggAI. (Si vous ne voyez pas l'onglet EggAI, mettez l'éditeur de modèle AIModel et l'explorateur de données côte à côte. Ensuite, allez dans Explorateur de données -> Ressources -> AIModels et double-cliquez sur EggAI. Cela devrait afficher EggAI dans un onglet de AIModel Éditeur.)
Ajoutez deux variables à EggAI:
Ajoutez les gestionnaires onInit et onEnterFrame comme nous l’avions fait précédemment. Ajoutez également un gestionnaire personnalisé en sélectionnant Ajouter un gestionnaire -> Personnalisé, comme indiqué ci-dessous..
Nommez le gestionnaire personnalisé "onCaptureInput". Remarque: il est important de ne pas taper "on" car il est ajouté par la boîte de dialogue, comme indiqué ci-dessous..
Vous devriez voir ce qui suit.
Amenez maintenant l'éditeur AIModel Editor et l'éditeur de script, comme nous le faisions auparavant. Dans l'éditeur AIModel, sélectionnez l'onglet EggAI. En double-cliquant sur onInit, onEnterFrame et onCaptureInput un par un, apportez le code correspondant dans l'éditeur de script et remplacez-le par le suivant. Dans chaque cas, n'oubliez pas de sauvegarder les scripts dans l'éditeur de script via Control + S.
Pour onInit:
fonction EggAI.onInit () ------------------------------------------------ ------------------------------------ object.setTranslation (this.getObject (), 0, 3, 0, object.kGlobalSpace) ---------------------------------------------------- ------------------------------------ fin --------------------------------------------------------------------------------
Pour onEnterFrame:
fonction EggAI.onEnterFrame () ------------------------------------------------ ------------------------------------ local lObject = this.getObject () local x, y, z = object.getRotation (lObject, object.kLocalSpace) object.setRotation (lObject, x + 1, y, z, object.kLocalSpace) local xp, yp, zp = object.getTranslation (this.getObject (), object.kGlobalSpace) si (zp < -5) then this.isBack (false ) elseif(zp > 5) alors this.isBack (true) termine if (this.isBack ()) puis object.setTranslation (this.getObject (), 0, 3, zp-0.005-math.abs (this.jump ()), objet. kGlobalSpace) else object.setTranslation (this.getObject (), 0, 3, zp + 0.005 + math.abs (this.jump ()), object.kGlobalSpace) end this.jump (0) ------- -------------------------------------------------- ----------------------- fin --------------------------------------------------------------------------------
Pour onCaptureInput:
fonction EggAI.onCaptureInput (d) ------------------------------------------- ------------------------------------- if (d == 1) alors this.jump (0.1 ) this.isBack (false) elseif (d == - 1) puis this.jump (-0.1) this.isBack (true) fin -------------------- -------------------------------------------------- ---------- fin --------------------------------------------------------------------------------
Nous avons terminé avec les variables et le code pour EggAI.
Maintenant, nous allons travailler sur MainAI. Ceci est le dernier morceau de code avant que nous puissions tout compiler et exécuter un test local. Dans l'onglet MainAI de l'éditeur AIModel, ajoutez les trois variables ci-dessous..
En cliquant sur Ajouter une fonction, ajoutez trois fonctions: displayRestart, requestRestart et reset.
Enfin, ajoutez quatre gestionnaires: onInit, onTouchSequenceBegin, onTouchSequenceChange et onTouchSequenceEnd. Notez que pour ajouter les trois derniers gestionnaires, vous devez sélectionner Ajouter un gestionnaire -> Gestionnaire de l'utilisateur..
Pour chacune des fonctions et des gestionnaires ci-dessus, remplacez le code par le suivant dans l'éditeur de script. N'oubliez pas de sauvegarder avec Control + S.
Pour displayRestart:
fonction MainAI.displayRestart () ------------------------------------------------ ------------------------------------ local lUser = application.getCurrentUser () local lComp = hud.newComponent (lUser, hud.kComponentTypeLabel) if (lComp ~ = nil) alors hud.setComponentPosition (lComp, 50, 50) hud.setComponentSize (lComp, 100, 10) hud.setComponentBackgroundColor (lComp, 0, 0, 0) .setComponentBorderColor (lComp, 0, 0, 0, 0) hud.setComponentVisible (lComp, true) hud.setComponentZOrder (lComp, 255) hud.setLabelText (lComp, "Game Restarting") hud.setDefaulteron hud.setLabelTextHeight (lComp, 100) hud.setLabelTextAlignment (lComp, hud.kAlignCenter, hud.kAlignCenter) fin --------------------------- -------------------------------------------------- --- fin --------------------------------------------------------------------------------
Pour requestRestart:
fonction MainAI.requestRestart () ------------------------------------------------ ------------------------------------ application.restart () --------- -------------------------------------------------- --------------------- fin --------------------------------------------------------------------------------
Pour réinitialiser:
fonction MainAI.reset () ------------------------------------------------ ------------------------------------ this.prevTouchCount (0) this.prevY0 (0) - -------------------------------------------------- ---------------------------- fin --------------------------------------------------------------------------------
Pour onInit:
fonction MainAI.onInit () ------------------------------------------------ ------------------------------------ application.setCurrentUserScene ("MyScene") application.setOption (application. kOptionViewportRotation, 3) lCamera locale = application.getCurrentUserActiveCamera () object.setTranslation (lCamera, 6, 7, 5, object.kGlobalSpace) object.lookAt (lCamera, 0, 1.9, -1, object.kGlobalSpace, 1) this.gg (scene.getTaggedObject (application.getCurrentUserScene (), "egg")) input.enableMultiTouch (this.getUser (), true) this.reset () ----------------- -------------------------------------------------- ------------- fin --------------------------------------------------------------------------------
Pour onTouchSequenceBegin:
fonction MainAI.onTouchSequenceBegin () ------------------------------------------------ ------------------------------------ this.reset () --------- -------------------------------------------------- --------------------- fin --------------------------------------------------------------------------------
Pour onTouchSequenceChange:
fonction MainAI.onTouchSequenceChange (nTaps0, nX0, nY0, nTaps1, nX1, nY1, nTaps2, nX2, nY2, nTaps3, nX3, nY3, nTaps4, nX4, nY4) --------------- -------------------------------------------------- --------------- local touchCount = 0 if (nTaps0> 0) puis touchCount = 1 fin si (nTaps1> 0) puis touchCount = 2 fin si (nTaps2> 0) puis touchCount = 3 fin si (nTaps3> 0) puis touchCount = 4 fin si (nTaps4> 0) puis touchCount = 5 fin si (touchCount == this.prevTouchCount ()) puis si (touchCount == 1) puis si (nY0> this. prevY0 ()) puis local d = -1 object.sendEvent (this.egg (), "EggAI", "onCaptureInput", d) elseif (nY0 < this.prevY0()) then local d = 1 object.sendEvent ( this.egg ( ), "EggAI", "onCaptureInput", d ) end elseif(touchCount == 2) then if(math.abs (nY0 - nY1) > 0.2) puis this.displayRestart () this.postEvent (1, "requestRestart") end end end - stocke les variables de cet événement pour le prochain événement this.prevTouchCount (touchCount) this.prevY0 (nY0) ------- -------------------------------------------------- ----------------------- fin --------------------------------------------------------------------------------
Pour onTouchSequenceEnd:
fonction MainAI.onTouchSequenceEnd () ------------------------------------------------ ------------------------------------ this.reset () --------- -------------------------------------------------- --------------------- fin --------------------------------------------------------------------------------
Maintenant, appuyez sur F7 pour tout compiler. Vous devriez voir 0 erreurs et 0 avertissements.
Maintenant, testons le jeu. Dans le menu du haut, sélectionnez Animation. Ensuite, sélectionnez Affichage -> Taille -> Android -> 480x800 comme indiqué ci-dessous.
Ensuite, sélectionnez Affichage -> Mode d'affichage -> Exécution.
Appuyez sur F9 pour commencer l'animation. Le jeu commence à jouer comme suit.
Notez que vous ne pouvez pas déplacer l'œuf à ce stade, car le mouvement de l'œuf est contrôlé via des événements tactiles à l'écran. Par conséquent, le test effectif du déplacement de l'œuf ne peut être effectué qu'après l'avoir installé sur un appareil Android. Pendant l'animation dans l'éditeur ShiVa, le canard et l'œuf bougeront librement sans aucune entrée. Pendant le mouvement libre, ils peuvent se heurter de temps en temps. Lorsque cela se produit, le canard change de sens de rotation dans l'axe global. Vous remarquerez également qu'après chaque collision, un navigateur s'ouvre pour afficher l'URL http://www.stonetrip.com. Cela est dû à la ligne suivante dans la fonction DuckAI.onSensorCollisionBegin:
… System.openURL ("http://www.stonetrip.com", "")
Le but de cette ligne est de faire vibrer le périphérique en cas de collision. Nous allons éditer le code Java dans Eclipse pour remplacer le system.openURL ()
gestionnaire d'événements pour faire vibrer le périphérique au lieu d'ouvrir un navigateur. Pour l'instant, vous pouvez empêcher l'éditeur ShiVa d'ouvrir un navigateur automatiquement pendant l'animation. Dans ce but, commentez la ligne de code dans DuckAI.onSensorCollisionBegin comme ci-dessous, puis recompilez-la avant de lancer l'animation..
… --System.openURL ("http://www.stonetrip.com", "")
Cependant, n'oubliez pas de supprimer le double tiret (-) et de tout recompiler avant d'exporter le jeu..
Ayant fini de développer notre jeu, nous allons maintenant l'exporter pour qu'il soit utilisé par l'outil de création de ShiVa..
Dans l'explorateur de données, mettez en surbrillance le dossier Jeux et sélectionnez Canard. Dans le menu contextuel, sélectionnez Exporter le jeu comme indiqué ci-dessous..
Sélectionnez un dossier local, par exemple. D: \ temp. Sélectionnez également le package d'exécution pour Android. Cliquez sur Exporter. (Voir ci-dessous.)
Un dialogue de progression apparaîtra comme indiqué ci-dessous.
Attendez la fin de l'exportation et appuyez sur OK pour fermer la boîte de dialogue. Voir ci-dessous:
Maintenant, vous devriez voir un fichier nommé Duck.stk dans le dossier local que vous avez sélectionné pour exporter le jeu..
Dans cette section, nous aborderons l'outil de création de Shiva. Comme mentionné précédemment, l'outil de création ShiVa a pour objectif principal de convertir un jeu créé via l'éditeur ShiVa en une application pouvant être déployée sur un appareil donné. Ci-dessous, nous allons décrire les étapes pour convertir le jeu en une application Android..
Étant donné que Shiva Authoring Tool peut être utilisé pour installer le jeu sur le périphérique Android, vous devez préparer le périphérique en vue de son installation. Tout d'abord, dans les paramètres de l'application, vérifiez les sources inconnues comme indiqué ci-dessous.
Ensuite, dans les options de développement de votre appareil, vérifiez le débogage USB comme indiqué ci-dessous..
Assurez-vous également que votre périphérique est connecté à votre ordinateur de développement via un câble USB. Notez que lorsque vous connectez un périphérique Android particulier à votre ordinateur de développement pour la première fois, Windows installe le pilote de périphérique approprié sur votre ordinateur. Vous devrez peut-être indiquer l’Assistant Ajout de matériel à l’emplacement du dossier d’installation du SDK Android pour que celui-ci trouve le pilote approprié.
Comme nous l'avons vu précédemment dans le didacticiel, les deux types de création disponibles dans Shiva Authoring Tool sont Project et APK Package. Authoring for Project génère un projet Eclipse pour personnaliser davantage l'application de jeu dans Eclipse. Authoring for APK Package génère un fichier APK Android pour installer directement l'application de jeu sur l'appareil. Puisque nous voulons personnaliser le jeu pour faire vibrer le périphérique en cas de collision, nous allons d'abord examiner le processus de création du projet..
Dans les instructions ci-dessous, il est supposé que Duck.stk est installé dans D: \ tmp. Si vous l'avez stocké ailleurs, modifiez ces instructions en conséquence.
En préparation de cette section, extrayez app_icon.png et app_splash.png de l’archive de téléchargement accompagnant ce didacticiel et enregistrez-les dans un dossier local, par exemple. D: \ tmp. Le fichier app_splash.png sera affiché en tant que page de démarrage dans le périphérique pour le jeu au démarrage. App_icon.png sera affiché dans l'écran d'accueil du périphérique Android, comme indiqué ci-dessous.
Affichez l'outil de création de Shiva. Sélectionnez Android sur la navigation de gauche. Cliquez sur l'image de la flèche sous "Ou lancez-vous maintenant ..." comme indiqué ci-dessous.
À l'étape 1, sélectionnez Duck.stk, app_icon.png et app_splash.png à partir des dossiers locaux de votre ordinateur, comme indiqué ci-dessous. Notez que le séparateur de dossiers est une barre oblique (/) et non une barre oblique inverse (\). Appuyez sur Suivant.
À l'étape 2, sous Type de création, sélectionnez Projet. Pour l'identifiant de paquet, entrez un nom, par exemple, com.shiva3d.demo. Ce nom correspond au nom du package Java. Acceptez les valeurs par défaut pour Version et Code de version (voir ci-dessous). Cliquez sur Étape 3: Construire.
A l'étape 3, sélectionnez Type de construction: Développement et laissez toutes les cases cochées comme indiqué ci-dessous..
De plus, effectuez les sélections suivantes:
Ceux-ci sont montrés ci-dessous.
Notez que notre objectif principal dans ce tutoriel est Android 3.2, pour lequel l'application a été testée..
Cliquez sur Construire. Cela apportera la vue de la console. Si tout se passe correctement, vous verrez un message disant «La construction est terminée avec succès!», Comme indiqué ci-dessous. De plus, dans le dossier de sortie (D: \ temp), vous devriez voir Duck_Android.zip.
Ici, nous allons passer en revue le processus de création utilisé pour créer un fichier APK (qui est une application Android) pouvant être directement installé sur un appareil. En option, vous pouvez installer le jeu sur votre appareil dans le cadre de la construction. Pour ce faire, vous devez avoir suivi les étapes décrites ci-dessus dans «Préparation du périphérique Android pour l'installation»..
Notez que si vous créez pour APK Package, la personnalisation du code dans Eclipse ne sera pas possible. En conséquence, la fonction de vibration ne sera pas disponible (c'est-à-dire que, lorsque le canard et l'œuf entrent en collision, le dispositif ne vibre pas). Pour cette raison, vous devez éditer DuckAI.onSensorCollisionBegin et commenter ou supprimer la ligne suivante:
system.openURL ("http://www.stonetrip.com", "")
Ensuite, compilez et exportez Duck.stk comme nous le faisions auparavant.
Maintenant, ouvrez l'outil de création de Shiva et suivez les mêmes étapes que ci-dessus avec les exceptions suivantes.
A l'étape 2, sélectionnez le type de création comme package APK plutôt que comme développement:
A l'étape 3, cochez Installer sur un périphérique connecté (voir ci-dessous).
Lorsque les étapes de construction sont terminées, vous devriez voir Duck-debug.apk dans le dossier de sortie. En outre, le jeu doit avoir été installé sur votre appareil. (Notez que si vous ne souhaitez pas installer l'application sur le périphérique dans le cadre de la construction, ne cochez pas la case Installer sur le périphérique connecté. Vous pouvez installer Duck-debug.apk ultérieurement sur votre périphérique à l'aide de l'outil ADB dans Android SDK. .)
Dans la partie 4, nous avons terminé le codage de EggAI et de MainAI et avons effectué des tests unitaires en animant le jeu. Nous avons ensuite exporté le jeu à partir de l'éditeur ShiVa pour l'importer dans l'outil de création de Shiva. Enfin, nous avons discuté de deux options de création différentes dans Shiva Authoring Tool: une pour générer un exécutable Android et une autre pour générer un projet Eclipse. Dans la cinquième partie, nous commencerons par apprendre à personnaliser le jeu dans Eclipse. Cela inclura la configuration du projet Eclipse, les modifications de code, la construction du code Java et les bibliothèques natives. À ce stade, nous aurons terminé le didacticiel en termes de développement et de déploiement. Dans la suite de la partie 5, nous examinerons le code et discuterons du portage du jeu sur des appareils iOS..