3D-spelontwikkeling met ShiVa3D Suite scènebewerking

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.


Het spel in de ShiVa-editor ontwikkelen - Vervolg

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.


Bewerk de scène

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.

Figuur 33. De textuur importeren

Nu, in de map Textures van DataExplorer ziet u een textuur met de naam marble.

Figuur 34. Textures-map

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.

Figuur 35. Bewaar prompt

Nu moeten de Ambience Editor en Gegevensverkenner als volgt naast elkaar staan.

Figuur 36. Sfeereditor

Pas in het gedeelte Verlichting de Skylight-kleur aan om een ​​fading-gele tint te verkrijgen, zoals hieronder wordt weergegeven.

Figuur 37. Dakraam kleur

Selecteer het marmer voor elk van de skybox-elementen in het gedeelte Lucht.

Figuur 38. Skybox-instellingen

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).

Figuur 39. Standaardlettertype

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.

Figuur 40. Bewaar prompt voor MyScene

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.

Figuur 41. De selectietag bewerken Figuur 42. Tag Dialoog

AIModels en de code

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.

  • EEN handler bevat code om een ​​bepaalde gebeurtenis te verwerken. Naast een vooraf gedefinieerde set handlers, kan ook aangepaste handlers worden gedefinieerd. We zullen slechts een subset van de vooraf gedefinieerde handlers implementeren, zoals hieronder vermeld.
    • onInit: deze handler wordt aangeroepen wanneer het object dat is gekoppeld aan het AIModel is gemaakt; meestal gebruikt voor initialisatietaken.
    • onEnterFrame: een game is een lus van frames. Deze handler wordt op elk frame genoemd. Je zou deze handler voornamelijk gebruiken om de beweging van een object te definiëren.
    • onTouchSequenceBegin: deze handler wordt aangeroepen wanneer de gebruiker het scherm van het apparaat begint aan te raken. Deze gebeurtenishandler is een manier om de AIModel-code te melden dat een reeks aanraakgebeurtenissen begint.
    • onTouchSequenceChange: deze handler wordt aangeroepen voor elke aanraakgebeurtenis in de aanraakvolgorde, waarbij het aantal aanrakingen en coördinaten van elke aanraking wordt doorgegeven.
    • onTouchSequenceEnd: deze handler wordt gebeld wanneer de gebruiker het scherm van het apparaat niet meer aanraakt. Deze gebeurtenishandler is een manier om de AIModel-code te melden dat de reeks aanraakgebeurtenissen is beëindigd. De aanraakgebeurtenissen die moeten worden verwerkt door onTouchSequenceBegin, onTouchSequenceChange en onTouchSequenceEnd zijn alleen beschikbaar voor een multitouch-compatibel apparaat.
    • onSensorCollisionBegin: deze gebeurtenishandler wordt aangeroepen wanneer een sensor die bij het object hoort, botst met een andere sensor.
  • EEN functie bevat code voor het verwerken van specifieke taken. Functies zijn niet vooraf gedefinieerd, u zou ze definiëren en implementeren zoals u nodig hebt. Een functie kan gebeurtenissen naar een handler verzenden of posten. (Het basisverschil tussen het verzenden en plaatsen van een gebeurtenis is dat de uitvoering van een sendEvent onmiddellijk plaatsvindt, terwijl de uitvoering van een postEvent wordt uitgevoerd na een gevraagde vertraging.) Een functie kan direct worden aangeroepen vanuit een andere functie of handler. Bovendien kan een functie het doelwit zijn van een sendEvent of een postEvent.
  • EEN veranderlijk kan globaal worden benaderd vanuit de functies en handlers in een bepaald AIModel.
  • AIModels ondersteunt ook het concept van staat welke niet wordt gebruikt in deze zelfstudie.

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.

Figuur 43. De DuckAI maken

Geef de AI een naam als DuckAI in het dialoogvenster zoals hieronder weergegeven en druk op OK.

Figuur 44. Maak een dialoogvenster voor de DuckAI

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.

Figuur 45. De MainAI maken

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).

Figuur 46. De MainAI

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.

Figuur 47. AIModel-editor

Voer variabelen en code in voor de DuckAI

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.

Figuur 48. Een variabele definiëren

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.

Figuur 49. Een handler toevoegen

Klik op dezelfde manier op Handler toevoegen -> onInit. Klik ten slotte op Handler toevoegen -> Objecthandler -> onSensorCollisionBegin (zie hieronder).

Figuur 50. Een handler voor de botsingssensor toevoegen

Nu ziet het tabblad DuckAI er als volgt uit.

Figuur 51. DuckAI Tab

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.

Figuur 52. onInit () Skeleton Code

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.


Afsluitende opmerkingen voor deel 3

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.