3D-spelontwikkeling met ShiVa3D Suite AI & Animation

Benieuwd naar 3D-game-ontwikkeling? Nu is het tijd om te leren! Deze vijfdelige tutorialserie laat zien hoe je een eenvoudig spel kunt bouwen met ShiVa3D Suite, een platformonafhankelijke 3D-game-engine en een authoringtool. Dit is de vierde aflevering van de serie, waarin je de AI Model-programmering voor het spel voltooit en leert hoe eenheidstests te maken om je werk te controleren.


Het spel in de ShiVa-editor ontwikkelen - Vervolg

In deel 3 hebben we geleerd hoe we de scène van onze applicatie kunnen bewerken. We zijn ook begonnen met het invoeren van de code voor de AIModels van het spel en hebben de codering voor de DuckAI voltooid. In deel 4 voltooien we de codering voor de resterende AIModels, EggAI en de MainAI en voeren we eenheidstests uit door het spel te animeren. We exporteren het spel vervolgens vanuit de ShiVa-editor voor importeren in de Shiva Authoring Tool. Ten slotte bespreken we twee verschillende authoringopties in de Shiva Authoring Tool: een voor het genereren van een Android-uitvoerbaar bestand en een ander voor het genereren van een Eclipse-project.


Voer variabelen en code in voor de EggAI

Selecteer de EggAI-tab in de AIModel-editor. (Als u het tabblad EggAI niet ziet, brengt u de AIModel-editor en de Gegevensverkenner naast elkaar. Ga vervolgens naar Gegevensverkenner -> Bronnen -> AIModels en dubbelklik op EggAI. Dit moet EggAI weergeven in een tabblad in AIModel Editor.)
Voeg twee variabelen toe aan EggAI:

  • naam: isBack, type: boolean, Init Value: true
  • naam: spring, type: nummer, Init Waarde: 0

Voeg de handlers toe aanInit en onEnterFrame zoals we eerder deden. Voeg ook een aangepaste handler toe door Handler -> Aangepast te selecteren zoals hieronder wordt weergegeven.

Figuur 53. Aangepaste handler

Geef de aangepaste handler 'onCaptureInput'. Opmerking: het is belangrijk dat u niet 'aan' typt, omdat het wordt toegevoegd door het dialoogvenster zoals hieronder weergegeven.

Figuur 54. Aangepaste handler een naam geven

Je zou het volgende moeten zien.

Figuur 55. EggAI-handlers

Breng nu de AIModel-editor en de Scripteditor naast elkaar, zoals we eerder deden. Selecteer in de AIModel Editor het tabblad EggAI. Dubbelklik op onInit, onEnterFrame en onCaptureInput één voor één, breng de bijbehorende code in de Scripteditor en vervang ze door het volgende. Vergeet in beide gevallen de scripts niet op te slaan in de Scripteditor via Control + S.

Voor onInit:

 function EggAI.onInit () -------------------------------------------- ------------------------------------ object.setTranslation (this.getObject (), 0, 3, 0, object.kGlobalSpace) -------------------------------------------- ------------------------------------ einde --------------------------------------------------------------------------------

Voor onEnterFrame:

 function 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) if (zp < -5) then this.isBack (false ) elseif(zp > 5) dan is this.isBack (true) end if (this.isBack ()) en dan object.setTranslation (this.getObject (), 0, 3, zp-0.005-math.abs (this.jump ()), object. kGlobalSpace) else object.setTranslation (this.getObject (), 0, 3, zp + 0.005 + math.abs (this.jump ()), object.kGlobalSpace) beëindigen this.jump (0) ------- -------------------------------------------------- ----------------------- einde --------------------------------------------------------------------------------

Voor onCaptureInput:

 function EggAI.onCaptureInput (d) ------------------------------------------- ------------------------------------- if (d == 1) dan this.jump (0.1 ) this.isBack (false) elseif (d == - 1) en this.jump (-0.1) this.isBack (true) end -------------------- -------------------------------------------------- ---------- einde --------------------------------------------------------------------------------

We zijn klaar met de variabelen en code voor EggAI.


Voer variabelen en code in voor de MainAI

Nu gaan we werken aan de MainAI. Dit is het laatste stukje code voordat we alles compileren en een lokale test uitvoeren. Voeg in het tabblad MainAI van de AIModel-editor de drie variabelen toe die hieronder worden weergegeven.

  • naam: ei, type: object, init waarde: nihil
  • naam: prevTouchCount, type: nummer, init waarde: 0
  • naam: vorige0, type: nummer, init waarde: 0

Door op Functie toevoegen te klikken, voegt u drie functies toe: displayRestart, requestRestart en reset.

Voeg ten slotte vier handlers toe: onInit, onTouchSequenceBegin, onTouchSequenceChange en onTouchSequenceEnd. Merk op dat om de laatste drie handlers toe te voegen, u Handler toevoegen -> Gebruikershandler moet selecteren.

Vervang voor elk van de bovenstaande functies en handlers de code met de volgende in de Scripteditor. Vergeet niet om te bewaren met behulp van Control + S.

Voor displayRestart:

 function MainAI.displayRestart () -------------------------------------------- ------------------------------------ local lUser = application.getCurrentUser () local lComp = hud.newComponent (lUser, hud.kComponentTypeLabel) if (lComp ~ = nil) then hud.setComponentPosition (lComp, 50, 50) hud.setComponentSize (lComp, 100, 10) hud.setComponentBackgroundColor (lComp, 0, 0, 0, 0) hud .setComponentBorderColor (lComp, 0, 0, 0, 0) hud.setComponentVisible (lComp, true) hud.setComponentZOrder (lComp, 255) hud.setLabelText (lComp, "Game Restarting") hud.setDefaultFont (lUser, "DefaultFont") hud.setLabelTextHeight (lComp, 100) hud.setLabelTextAlignment (lComp, hud.kAlignCenter, hud.kAlignCenter) end --------------------------- -------------------------------------------------- --- einde --------------------------------------------------------------------------------

Voor requestRestart:

 function MainAI.requestRestart () -------------------------------------------- ------------------------------------ application.restart () --------- -------------------------------------------------- --------------------- einde --------------------------------------------------------------------------------

Voor reset:

 function MainAI.reset () -------------------------------------------- ------------------------------------ this.prevTouchCount (0) this.prevY0 (0) - -------------------------------------------------- ---------------------------- einde --------------------------------------------------------------------------------

Voor onInit:

 function MainAI.onInit () -------------------------------------------- ------------------------------------ application.setCurrentUserScene ("MyScene") application.setOption (application. kOptionViewportRotation, 3) local lCamera = application.getCurrentUserActiveCamera () object.setTranslation (lCamera, 6, 7, 5, object.kGlobalSpace) object.lookAt (lCamera, 0, 1.9, -1, object.kGlobalSpace, 1) this.egg (scene.getTaggedObject (application.getCurrentUserScene (), "egg")) input.enableMultiTouch (this.getUser (), true) this.reset () ----------------- -------------------------------------------------- ------------- einde --------------------------------------------------------------------------------

Voor onTouchSequenceBegin:

 function MainAI.onTouchSequenceBegin () -------------------------------------------- ------------------------------------ this.reset () --------- -------------------------------------------------- --------------------- einde --------------------------------------------------------------------------------

Voor onTouchSequenceChange:

 function MainAI.onTouchSequenceChange (nTaps0, nX0, nY0, nTaps1, nX1, nY1, nTaps2, nX2, nY2, nTaps3, nX3, nY3, nTaps4, nX4, nY4) --------------- -------------------------------------------------- --------------- local touchCount = 0 if (nTaps0> 0) en dan touchCount = 1 end if (nTaps1> 0) en danCountCount = 2 end if (nTaps2> 0) en danCount = 3 end if (nTaps3> 0) en dan touchCount = 4 end if (nTaps4> 0) en dan opCount = 5 end if (touchCount == this.prevTouchCount ()) en dan if (touchCount == 1) en dan if (nY0> dit. prevY0 ()) en vervolgens 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) en vervolgens dit.displayRestart () this.postEvent (1, "requestRestart") end-end end - sla de variabelen van deze gebeurtenis op voor de volgende gebeurtenis this.prevTouchCount (touchCount) this.prevY0 (nY0) ------- -------------------------------------------------- ----------------------- einde --------------------------------------------------------------------------------

Voor onTouchSequenceEnd:

 function MainAI.onTouchSequenceEnd () -------------------------------------------- ------------------------------------ this.reset () --------- -------------------------------------------------- --------------------- einde --------------------------------------------------------------------------------

Druk nu op F7 om alles te compileren. U zou 0 fouten en 0 waarschuwingen moeten zien.

Figuur 56. Compilatieresultaten

Animate Game to Test

Laten we nu het spel testen. Selecteer Animatie in het bovenste barmenu. Selecteer vervolgens Display -> Grootte -> Android -> 480x800, zoals hieronder weergegeven.

Figuur 57. Weergavegrootte selecteren

Selecteer vervolgens Display -> Weergavemodus -> Runtime.

Figuur 58. Weergavemodus selecteren

Druk op F9 om te beginnen met animeren. Het spel begint als volgt te spelen.

Figuur 59. Het spel animeren

Merk op dat u het ei op dit moment niet kunt verplaatsen, omdat de beweging van het ei wordt bestuurd via schermaanraakgebeurtenissen. Daarom kan de eigenlijke test om het ei te verplaatsen alleen worden gedaan nadat het in een Android-apparaat is geïnstalleerd. Tijdens het animeren in de ShiVa Editor, zullen de eend en het ei vrij bewegen zonder enige input. Tijdens de vrije beweging kunnen ze af en toe tegen elkaar botsen. Wanneer dit gebeurt, zal de eend de draairichting in de globale as veranderen. U zult ook merken dat na elke botsing een browser wordt geopend om de URL http://www.stonetrip.com weer te geven. Dit komt door de volgende regel in functie DuckAI.onSensorCollisionBegin:

... system.openURL ("http://www.stonetrip.com", "")

Het doel van deze lijn is om het apparaat te laten trillen wanneer zich een botsing voordoet. We zullen de Java-code in Eclipse bewerken om de code te overschrijven system.openURL () gebeurtenishandler om het apparaat te laten trillen in plaats van een browser te openen. Voorlopig kunt u voorkomen dat de ShiVa-editor een browser automatisch opent tijdens de animatie. Noteer daarvoor de regel code in DuckAI.onSensorCollisionBegin zoals hieronder en compileer vervolgens voordat u de animatie start.

... --system.openURL ("http://www.stonetrip.com", "")

Vergeet echter niet om het dubbele streepje (-) te verwijderen en alles opnieuw te compileren voordat het spel wordt geëxporteerd.


Exporteer het spel

Nadat we onze game hebben ontwikkeld, zullen we deze nu exporteren voor gebruik door de ShiVa Authoring Tool.

Markeer in de Gegevensverkenner de map Games en selecteer Eend. Selecteer in het rechtermuisknopmenu Exportspel zoals hieronder wordt weergegeven.

Figuur 60. Het spel exporteren

Selecteer een lokale map, bijvoorbeeld D: \ temp. Selecteer ook Runtime-pakket voor Android. Klik op Exporteren. (Zie hieronder.)

Figuur 61. Dialoog exporteren

Er verschijnt een voortgangsdialoog zoals hieronder getoond.

Figuur 62. Voortgangsdialoog exporteren

Wacht tot het exporteren is voltooid en druk op OK om het dialoogvenster te sluiten. Zie hieronder:

Figuur 63. Sluit het dialoogvenster Exportvoortgang af

Nu zou u een bestand met de naam Duck.stk moeten zien in de lokale map die u had geselecteerd om het spel te exporteren.


Shiva Authoring Tool

In dit gedeelte bespreken we de Shiva Authoring Tool. Zoals eerder vermeld, is het belangrijkste doel van de ShiVa Authoring Tool om een ​​game, gemaakt via de ShiVa-editor, om te zetten in een applicatie die op een bepaald apparaat kan worden ingezet. Hieronder beschrijven we de stappen om het spel om te zetten in een Android-applicatie.

Bereid het Android-apparaat voor op installatie

Omdat de Shiva Authoring Tool kan worden gebruikt om de game op het Android-apparaat te installeren, moet je het apparaat voorbereiden voor installatie. Controleer eerst in Toepassingsinstellingen de optie Onbekende bronnen zoals hieronder weergegeven.

Figuur 64. Apparaat applicatie-instellingen

Controleer vervolgens in de ontwikkelingsopties van uw apparaat USB-foutopsporing, zoals hieronder wordt weergegeven.

Figuur 65. Opties voor apparaatontwikkeling

Zorg er ook voor dat uw apparaat via een USB-kabel is aangesloten op uw ontwikkelingsmachine. Merk op dat wanneer u een bepaald Android-apparaat voor de eerste keer aansluit op uw ontwikkelcomputer, Windows het juiste apparaatstuurprogramma op uw computer installeert. U moet mogelijk de Wizard Hardware toevoegen naar de locatie van de Android SDK-installatiemap brengen voor de wizard om een ​​geschikte driver te vinden.

Authoring for Project

Zoals we eerder in de zelfstudie hebben besproken, zijn de twee beschikbare authoringtypen in de Shiva Authoring Tool Project- en APK-pakket. Authoring for Project genereert een Eclipse-project om de game-app verder aan te passen in Eclipse. Authoring for APK Package genereert een Android APK-bestand voor het rechtstreeks installeren van de gametoepassing op het apparaat. Omdat we het spel willen aanpassen om het apparaat te laten trillen wanneer er een botsing plaatsvindt, zullen we eerst het schrijfproces voor het project beoordelen.

In de onderstaande instructies wordt aangenomen dat Duck.stk is geïnstalleerd in D: \ tmp. Als u het op een andere locatie hebt opgeslagen, wijzigt u die instructies dienovereenkomstig.

Bereid als voorbereiding op deze sectie app_icon.png en app_splash.png uit het downloadarchief bij deze zelfstudie en sla ze op onder een lokale map, bijvoorbeeld D: \ tmp. Het app_splash.png-bestand wordt weergegeven als de splash-pagina op het apparaat voor de game wanneer deze start. De app_icon.png wordt weergegeven in het startscherm van het Android-apparaat, zoals hieronder weergegeven.

Figuur 66. De pictogramlocatie

Breng de Shiva Authoring Tool ter sprake. Selecteer Android in de linker navigatie. Klik op de afbeelding van de pijl onder 'Of ga nu aan de slag' zoals hieronder wordt getoond.

Figuur 67. Startpagina van Shiva Authoring Tool

Selecteer in stap 1 Duck.stk, app_icon.png en app_splash.png uit lokale mappen van uw computer, zoals hieronder wordt weergegeven. Hier ziet u dat het mapscheidingsteken slash (/) is, en geen backslash (\). Druk op Volgende.

Figuur 68. Shiva Authoring Tool Stap 1

Selecteer Project in stap 2 onder Auteurstype. Voor bundel-ID-type in een naam, bijvoorbeeld com.shiva3d.demo. Deze naam komt overeen met de naam van het Java-pakket. Standaardinstellingen voor versie en versienummer accepteren (zie hieronder). Klik op Stap 3: Build.

Figuur 69. Shiva Authoring Tool Stap 2 - Project

Selecteer in stap 3 Buildtype: ontwikkeling en laat alle selectievakjes niet aangevinkt zoals hieronder wordt weergegeven.

Figuur 70. Shiva Authoring Tool Step 3 - Bouwtype

Maak ook de volgende selecties:

  • Audio-backend: standaard
  • Minimale OS-ondersteuning: Android 3.2 (API-niveau: 13)
  • Verstrek een uitvoermap, bijvoorbeeld D: \ temp
  • Accepteer de optie Geen script voor Aangepast bericht-build-script

Die worden hieronder getoond.

Figuur 71. Shiva Authoring Tool Stap 3

Merk op dat ons belangrijkste doel in deze tutorial Android 3.2 is, waarvoor de applicatie is getest.

Klik op Build. Hiermee wordt de consoleweergave geopend. Als alles goed gaat, ziet u een bericht met de tekst 'Build finished successfully!', Zoals hieronder wordt weergegeven. In de uitvoermap (D: \ temp) zou je ook Duck_Android.zip moeten zien.

Figuur 72. Shiva Authoring Tool - Build Finished

Authoring for APK Package

Hier zullen we het authoringproces bekijken dat is gebruikt om een ​​APK-bestand te maken (een Android-applicatie) dat direct op een apparaat kan worden geïnstalleerd. Als een optie kun je de game op je apparaat installeren als onderdeel van de build. Hiervoor moet u de stappen hebben uitgevoerd die hierboven zijn beschreven in 'Het Android-apparaat voorbereiden voor installatie'..

Merk op dat als u ontwerpt voor APK-pakket, het aanpassen van de code in Eclipse niet mogelijk is. Als gevolg hiervan zal de trilfunctie niet beschikbaar zijn (d.w.z. wanneer de eend en het ei botsen, zal het apparaat niet trillen). Om deze reden moet u DuckAI.onSensorCollisionBegin bewerken en een commentaar plaatsen of de volgende regel verwijderen:

 system.openURL ("http://www.stonetrip.com", "")

Maak en export vervolgens Duck.stk zoals we eerder deden.

Breng nu de Shiva Authoring Tool aan en doorloop dezelfde stappen als hierboven, met de volgende uitzonderingen.

Selecteer in stap 2 het auteurstype als APK-pakket in plaats van als ontwikkeling:

Figuur 73. Shiva Authoring Tool Stap 2 - APK-pakket

Controleer in Stap 3 Installeren op aangesloten apparaat (zie hieronder)

Figuur 74. Shiva Authoring Tool Step 3 - Installeren

Wanneer de build-stappen voltooid zijn, zou je Duck-debug.apk in de output map moeten zien. De game moet ook op uw apparaat zijn geïnstalleerd. (Merk op dat als u de applicatie niet in het apparaat wilt installeren als onderdeel van de build, u niet op het aangesloten apparaat moet installeren.) U kunt Duck-debug.apk nog een keer op uw apparaat installeren met behulp van de ADB Tool in Android SDK .)


Afsluitende opmerkingen voor deel 4

In deel 4 hebben we de EggAI en de MainAI gecodeerd en eenheidstests uitgevoerd door het spel te animeren. Vervolgens hebben we de game geëxporteerd uit de ShiVa-editor voor importeren in de Shiva Authoring Tool. Ten slotte bespraken we twee verschillende authoring-opties in de Shiva Authoring Tool, een voor het genereren van een Android-uitvoerbaar bestand en een ander voor het genereren van een Eclipse-project. In deel 5 beginnen we met het leren aanpassen van het spel in Eclipse. Dit omvat de Eclipse-projectinstellingen, codewijzigingen, het bouwen van de Java-code en native bibliotheken. Op dat moment hebben we de tutorial voltooid in termen van ontwikkeling en implementatie. In de rest van deel 5 zullen we de code bekijken en bespreken hoe de game naar iOS-apparaten kan worden overgedragen.