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 derde aflevering van de serie, waarin je leert hoe je de scènes van een game bewerkt en begint met het coderen van AI-modellen.
In deel 2 begonnen we met het beschrijven van hoe het spel te ontwikkelen met ShiVa Editor. We introduceerden de ShiVa-editormodules die werden gebruikt bij het ontwikkelen van de zelfstudietoepassing, en we hadden het over de Collada-modelbestanden die de hoofdpersonen in de toepassing vertegenwoordigen. Vervolgens bespraken we enkele eerste stappen die nodig waren om de applicatie te maken, zoals het creëren van het spel en de scène en het importeren van de Collada-modellen. In deel 3 zullen we laten zien hoe we de scène van onze applicatie kunnen bewerken. We beginnen ook met het invoeren van de code voor de AIModels van het spel. In het bijzonder zullen we de code voor de DuckAI invoeren.
We zullen nu verschillende eigenschappen van de scène instellen.
We nemen aan dat het afbeeldingsbestand marble.jpg is gekopieerd onder de map met de naam D: \ temp \ skybox. Als u in uw omgeving het bestand naar een andere locatie kopieert, moet u de onderstaande instructies dienovereenkomstig wijzigen.
Ga in de DataExplorer naar Importeren -> Textuur. Selecteer het bestand in het dialoogvenster zoals hieronder weergegeven en klik op Importeren.
Nu, in de map Textures van DataExplorer ziet u een textuur met de naam marble.
Laten we verschillende kenmerken van de scène bewerken met behulp van de Ambience-editor. Breng Ambience Editor en Gegevensverkenner zij aan zij en dubbelklik op MyScene in de map Scènes. Op dit punt wordt u mogelijk gevraagd de scène op te slaan, zoals hieronder wordt weergegeven. Klik op Ja en sluit het dialoogvenster.
Nu moeten de Ambience Editor en Gegevensverkenner als volgt naast elkaar staan.
Pas in het gedeelte Verlichting de Skylight-kleur aan om een fading-gele tint te verkrijgen, zoals hieronder wordt weergegeven.
Selecteer het marmer voor elk van de skybox-elementen in het gedeelte Lucht.
Breng Game Editor en Data Explorer naast elkaar. Selecteer Duck -> Games in Data Explorer en dubbelklik op Duck. Dit zal het spel in de Game Editor oproepen. Selecteer Bronnen -> Lettertypen in de Gegevensverkenner. Druk in de Game-editor op het tabblad Hulpbronnen. Sleep het standaard lettertype vanuit de Gegevensverkenner naar het tabblad Bronnen (zie hieronder).
We zullen nu een tag aan ei toevoegen. (Een object kan in een game programmatisch worden gezocht en in een game worden gevonden op basis van de tag.) Breng Scene Explorer en Gegevensverkenner zij aan zij. Selecteer in Gegevensverkenner Eend -> Scènes -> MyScene en dubbelklik. Op dit moment wordt u mogelijk gevraagd MyScene als volgt op te slaan. Klik op Ja en sluit het dialoogvenster.
Markeer in de Scene Explorer de bol en selecteer in het menu met de rechtermuisknop de selectie-tag bewerken. Typ in het dialoogvenster 'ei' voor de tag. Die stappen worden getoond in de twee opeenvolgende afbeeldingen hieronder.
We zullen nu de AIModels en de bijbehorende code voor onze game maken. Denk aan de vorige discussie dat de AIModels het gedrag van de objecten in een game vertegenwoordigen. De Eend en het Ei zullen elk respectievelijk hun eigen AIModels, DuckAI en EggAI hebben. Daarnaast zal de game zelf een AIModel hebben, MainAI genaamd. De MainAI is verantwoordelijk voor het initialiseren van de camera en de scène en voor het verwerken en verzenden van gebruikersevents.
Laten we eerst enkele concepten bespreken die betrekking hebben op AIModels, waarbij informatie wordt ontleend aan de helpdocumentatie van ShiVa Editor.
Laten we nu beginnen met het definiëren van de AIModels in onze game. Open de Scene Explorer en de Gegevensverkenner zij aan zij en dubbelklik op MyScene in de Gegevensverkenner onder de map Scènes. (Als u daarom wordt gevraagd, slaat u MyScene op en sluit u het dialoogvenster.) Selecteer in de Scene Explorer het tabblad Objects en selecteer duck en klik met de rechtermuisknop op menu Controllers -> AI -> Create AI. Dit wordt hieronder getoond.
Geef de AI een naam als DuckAI in het dialoogvenster zoals hieronder weergegeven en druk op OK.
Vergelijk ook op het tabblad Objecten van Scene Explorer de optie sphere en klik met de rechtermuisknop op menu Controllers -> AI -> Create AI. Geef de AI een naam als EggAI in het dialoogvenster en klik op OK.
Selecteer in Gegevensverkenner Create -> Resource -> AIModel (zie hieronder). Noem het MainAI.
In Data Explorer ziet u nu drie AIModels in de map Resources -> AIModels: DuckAI, EggAI, MainAI. Open de speleditor en de gegevensverkenner zij aan zij. Selecteer in Game-editor het tabblad Hoofdgroep. Van bronnen -> map AIModels, slepen en neerzetten MainAI naar het tekstgebied van de gebruiker MainAI in Game Editor (zie hieronder).
Open nu de AIModel-editor en Gegevensverkenner zij aan zij. Dubbelklik op de DuckAI, EggAI en MainAI. U zou een apart tabblad voor elk van de AIModels in AIModel Editor moeten zien zoals hieronder getoond.
Klik op het tabblad DuckAI op Variabele toevoegen en voeg een variabele van het type boolean toe. Noem het isPositief met ware de initiële waarde (hieronder getoond). Klik op OK om het dialoogvenster te sluiten.
Voeg op dezelfde manier een variabele toe met de naam 'score', waarbij het type 'nummer' is en de beginwaarde 0 is. Zelfs als u dit als 0 typt, wordt de variabele geïnitialiseerd als een float, d.w.z. 0.000.
Klik nog steeds op het tabblad DuckAI op Handler toevoegen -> onEnterFrame, zoals hieronder weergegeven.
Klik op dezelfde manier op Handler toevoegen -> onInit. Klik ten slotte op Handler toevoegen -> Objecthandler -> onSensorCollisionBegin (zie hieronder).
Nu ziet het tabblad DuckAI er als volgt uit.
Breng de AIModel-editor en de scripteditor naast elkaar. Dubbelklik op het tabblad DuckAI van de AIModel Editor opInInit (). Een skeletcode hiervoor wordt in de Scripteditor geopend, zoals hieronder wordt getoond.
Kopieer en plak het volgende in de scripteditor en vervang de bestaande code volledig (een beoordeling van de code wordt in een later gedeelte gegeven). Klik in de Scripteditor op Control + S om het script op te slaan.
function DuckAI.onInit () -------------------------------------------- ------------------------------------ object.setTranslation (this.getObject (), 2, 3, 2, object.kGlobalSpace) local lUser = application.getCurrentUser () local lComp = hud.newComponent (lUser, hud.kComponentTypeLabel, "HUD.disp") if (lComp ~ = nil) then hud.setComponentPosition (lComp, 75, 7 ) hud.setComponentSize (lComp, 30, 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, string.format ("Score:% 2i", this.score ())) hud.setDefaultFont (lUser, "DefaultFont") hud.setLabelTextHeight (lComp, 100) hud.setLabelTextAlignment (lComp, hud.kAlignCenter, hud.kAlignCenter) einde -------------------------------------- ------------------------------------------ einde --------------------------------------------------------------------------------
Vervang op dezelfde manier de code voor onEnterFrame als volgt.
function DuckAI.onEnterFrame () -------------------------------------------- ------------------------------------ local lObject = this.getObject () if (this.isPositive ( )) en vervolgens object.rotateAroundTo (lObject, 0,0,0,0,0.75,0, object.kGlobalSpace, 0.5) else object.rotateAroundTo (lObject, 0,0,0,0, -0.75,0, object.kGlobalSpace , 0,5) einde lokale x, y, z = object.getRotation (lObject, object.kLocalSpace) object.setRotation (lObject, x + 0.3, y + 0.5, z + 1, object.kLocalSpace) ------- -------------------------------------------------- ----------------------- einde --------------------------------------------------------------------------------
Vervang vervolgens de code voor onSensorCollisionBegin door het volgende:
function DuckAI.onSensorCollisionBegin (nSensorID, hTargetObject, nTargetSensorID) --------------------------------------- ----------------------------------------- this.score (this.score () +1) local lComp = hud.getComponent (application.getCurrentUser (), "HUD.disp") if (lComp) then hud.setLabelText (lComp, string.format ("Score:% 2i", this.score ()) ) einde if (this.isPositive ()) then this.isPositive (false) else this.isPositive (true) end system.openURL ("http://www.stonetrip.com", "") ------ -------------------------------------------------- ------------------------ einde --------------------------------------------------------------------------------
Nu zijn we klaar met de variabelen en code voor DuckAI.
In deel 3 hebben we laten zien 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. Tot nu toe hebben we de code 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.