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.
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.
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:
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.
Geef de aangepaste handler 'onCaptureInput'. Opmerking: het is belangrijk dat u niet 'aan' typt, omdat het wordt toegevoegd door het dialoogvenster zoals hieronder weergegeven.
Je zou het volgende moeten zien.
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.
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.
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.
Laten we nu het spel testen. Selecteer Animatie in het bovenste barmenu. Selecteer vervolgens Display -> Grootte -> Android -> 480x800, zoals hieronder weergegeven.
Selecteer vervolgens Display -> Weergavemodus -> Runtime.
Druk op F9 om te beginnen met animeren. Het spel begint als volgt te spelen.
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.
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.
Selecteer een lokale map, bijvoorbeeld D: \ temp. Selecteer ook Runtime-pakket voor Android. Klik op Exporteren. (Zie hieronder.)
Er verschijnt een voortgangsdialoog zoals hieronder getoond.
Wacht tot het exporteren is voltooid en druk op OK om het dialoogvenster te sluiten. Zie hieronder:
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.
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.
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.
Controleer vervolgens in de ontwikkelingsopties van uw apparaat USB-foutopsporing, zoals hieronder wordt weergegeven.
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.
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.
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.
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.
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.
Selecteer in stap 3 Buildtype: ontwikkeling en laat alle selectievakjes niet aangevinkt zoals hieronder wordt weergegeven.
Maak ook de volgende selecties:
Die worden hieronder getoond.
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.
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:
Controleer in Stap 3 Installeren op aangesloten apparaat (zie hieronder)
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 .)
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.