Sviluppo di giochi 3D con ShiVa3D Suite editing di scene

Sei curioso di sviluppare il gioco in 3D? Ora è il momento di imparare! Questa serie di tutorial in cinque parti mostrerà come creare un gioco semplice con ShiVa3D Suite, un motore di gioco 3D multipiattaforma e uno strumento di authoring. Questa è la terza parte della serie, in cui imparerai come modificare le scene di un gioco e iniziare a codificare modelli AI.


Sviluppare il gioco nell'editor ShiVa - Continua

Nella parte 2, abbiamo iniziato descrivendo come sviluppare il gioco usando ShiVa Editor. Abbiamo introdotto i moduli di ShiVa Editor utilizzati nello sviluppo dell'applicazione tutorial e abbiamo parlato dei file di modello Collada che rappresentano i personaggi principali dell'applicazione. Abbiamo quindi discusso alcuni passaggi iniziali necessari per creare l'applicazione, come la creazione del gioco e della scena e l'importazione dei modelli Collada. Nella parte 3, mostreremo come modificare la scena della nostra applicazione. Inizieremo anche a inserire il codice per gli AIModels del gioco. In particolare, inseriremo il codice per DuckAI.


Modifica la scena

Ora imposteremo varie proprietà della scena.

Supponiamo che il file immagine marble.jpg sia stato copiato nella cartella D: \ temp \ skybox. Nel tuo ambiente, se copi il file in un'altra posizione, assicurati di modificare di conseguenza le seguenti istruzioni.

Nel DataExplorer, vai a Importa -> Texture. Nella finestra di dialogo, seleziona il file come mostrato di seguito e fai clic su Importa.

Figura 33. Importare la trama

Ora, nella cartella Textures di DataExplorer, dovresti vedere una texture chiamata marble.

Figura 34. Cartella di trame

Modifichiamo vari attributi della scena usando l'Editor Ambience. Accompagna parallelamente Ambience Editor e Data Explorer e fai doppio clic su MyScene nella cartella Scene. A questo punto, potrebbe essere richiesto di salvare la scena, come mostrato di seguito. Fare clic su Sì e chiudere la finestra di dialogo.

Figura 35. Salva Prompt

Ora, l'editor di Ambience e Data Explorer dovrebbero essere affiancati come segue.

Figura 36. Editor di ambiente

Nella sezione Illuminazione, regola il colore del lucernario per ottenere un tono giallo sbiadito, come mostrato di seguito.

Figura 37. Colore lucernario

Per ciascuno degli elementi skybox nella sezione Sky, seleziona il marmo.

Figura 38. Impostazioni Skybox

Porta l'editor di giochi e l'esploratore dei dati fianco a fianco. Seleziona Anatra -> Giochi in Data Explorer e fai doppio clic su Duck. Questo farà apparire il gioco nell'Editor di giochi. Seleziona Risorse -> Caratteri in Data Explorer. Nell'Editor dei giochi, premi la scheda Risorse. Trascina e rilascia il Carattere di Default da Data Explorer nella scheda Risorse (vedi sotto).

Figura 39. Carattere predefinito

Ora aggiungeremo un tag all'uovo. (Un oggetto può essere ricercato e localizzato in un gioco a livello di programmazione in base al suo tag.) Porta Explorer di scena ed Explorer di dati affiancati. In Esplora dati, seleziona Anatra -> Scene -> MyScene e fai doppio clic. A questo punto, potrebbe essere richiesto di salvare MyScene come segue. Fare clic su Sì e chiudere la finestra di dialogo.

Figura 40. Salva richiesta per MyScene

In Scene Explorer, evidenzia la sfera e dal menu di scelta rapida seleziona Modifica tag di selezione. Nella finestra di dialogo, digita "egg" per il tag. Questi passaggi sono mostrati nelle due immagini consecutive di seguito.

Figura 41. Modifica del tag di selezione Figura 42. Finestra di dialogo dei tag

AIModels e il codice

Ora creeremo gli AIModels e il codice associato per il nostro gioco. Ricordiamo dalla discussione precedente che gli AIModels rappresentano il comportamento degli oggetti in un gioco. The Duck and the Egg avranno rispettivamente i loro AIModels, DuckAI e EggAI. Inoltre, il gioco stesso avrà il suo AIModel, chiamato MainAI. Il MainAI sarà responsabile per l'inizializzazione della telecamera e della scena nonché per l'elaborazione e la distribuzione degli eventi utente.

Esaminiamo prima alcuni concetti relativi ad AIModels, prendendo in prestito informazioni dalla documentazione di aiuto di ShiVa Editor.

  • UN gestore contiene il codice per elaborare un particolare evento. Oltre a un insieme predefinito di gestori, è possibile definire anche gestori personalizzati. Implementeremo solo un sottoinsieme dei gestori predefiniti, come elencato di seguito.
    • onInit: questo gestore viene chiamato quando viene creato l'oggetto associato all'AIModel; in genere utilizzato per attività di inizializzazione.
    • onEnterFrame: un gioco è un loop di frame. Questo gestore viene chiamato su ogni frame. Utilizzerai principalmente questo gestore per definire il movimento di un oggetto.
    • onTouchSequenceBegin: questo gestore viene chiamato quando l'utente inizia a toccare lo schermo del dispositivo. Questo gestore di eventi è un modo per notificare al codice AIModel che sta iniziando una sequenza di eventi tattili.
    • onTouchSequenceChange: questo gestore viene chiamato per ogni evento di tocco nella sequenza di tocco, passando il numero di tocchi e le coordinate di ciascun tocco.
    • onTouchSequenceEnd: questo gestore viene chiamato quando l'utente smette di toccare lo schermo del dispositivo. Questo gestore di eventi è un modo per notificare al codice AIModel che la sequenza di eventi di tocco è terminata. Gli eventi di tocco che devono essere elaborati da onTouchSequenceBegin, onTouchSequenceChange e onTouchSequenceEnd sono disponibili solo per un dispositivo multitouch compatibile.
    • onSensorCollisionBegin: questo gestore di eventi viene chiamato quando un sensore associato all'oggetto si scontra con un altro sensore.
  • UN funzione contiene codice per l'elaborazione di attività specifiche. Le funzioni non sono predefinite, le definiresti e le implementerai a tuo piacimento. Una funzione può inviare o inviare eventi a un gestore. (La differenza fondamentale tra l'invio e la pubblicazione di un evento è che l'esecuzione di un sendEvent è istantanea, mentre l'esecuzione di un postEvent viene eseguita dopo un ritardo richiesto.) Una funzione può essere chiamata direttamente da un'altra funzione o gestore. Inoltre, una funzione può essere l'obiettivo di sendEvent o postEvent.
  • UN variabile può essere accessibile a livello globale dalle funzioni e dai gestori di un particolare AIModel.
  • AIModels supporta anche il concetto di stato che non è usato in questo tutorial.

Cominciamo ora a definire gli AIModels nel nostro gioco. Visualizzate parallelamente Scene Explorer e Data Explorer e fate doppio clic su MyScene in Data Explorer nella cartella Scene. (Se richiesto, salva MyScene e chiude la finestra di dialogo.) In Scene Explorer, seleziona la scheda Oggetti e seleziona anatra, quindi fai clic con il pulsante destro del mouse su Controller -> AI -> Crea AI. Questo è mostrato sotto.

Figura 43. Creare il DuckAI

Denominare l'IA come DuckAI nella finestra di dialogo come mostrato di seguito e premere OK.

Figura 44. Crea finestra di dialogo per DuckAI

Analogamente, nella scheda Oggetti di Scene Explorer, seleziona sfera, quindi fai clic con il pulsante destro del mouse su Controller -> AI -> Crea AI. Dai un nome all'IA come EggAI nella finestra di dialogo e fai clic su OK.

In Data Explorer, selezionare Crea -> Risorsa -> AIModel (vedi sotto). Denominalo MainAI.

Figura 45. Creare il MainAI

In Data Explorer, ora dovresti vedere tre AIModels nella cartella Risorse -> AIModels: DuckAI, EggAI, MainAI. Apri l'editor di giochi e l'Explorer Dati affiancati. In Game Editor, seleziona la scheda Principale. Da Risorse -> Cartella AIModels, trascina e rilascia MainAI nell'area di testo del MainAI dell'utente in Game Editor (vedi sotto).

Figura 46. Il MainAI

Ora apri l'editor AIModel e l'Explorer dati affiancati. Fare doppio clic su DuckAI, EggAI e MainAI. Dovresti vedere una scheda separata per ciascuno degli AIModels in AIModel Editor, come mostrato di seguito.

Figura 47. Editor AIModel

Inserisci variabili e codice per DuckAI

Nella scheda DuckAI, fai clic su Aggiungi variabile e aggiungi una variabile di tipo booleano. Nome è positivo con vero essere il valore iniziale (mostrato sotto). Fare clic su OK per chiudere la finestra di dialogo.

Figura 48. Definire una variabile

Allo stesso modo, aggiungi una variabile denominata 'punteggio' in cui il tipo è 'numero' e il valore iniziale è 0. Anche se lo digiti come 0, la variabile verrà inizializzata come float, ovvero 0,000.

Sempre nella scheda DuckAI, fai clic su Aggiungi gestore -> onEnterFrame, come mostrato di seguito.

Figura 49. Aggiungere un gestore

Allo stesso modo, fai clic su Aggiungi gestore -> onInit. Infine, fai clic su Aggiungi gestore -> Gestore oggetti -> onSensorCollisionBegin (vedi sotto).

Figura 50. Aggiunta di un gestore per il sensore di collisione

Ora, la scheda DuckAI sarà simile alla seguente.

Figura 51. DuckAI Tab

Porta l'editor AIModel e l'editor degli script fianco a fianco. Nella scheda DuckAI di AIModel Editor, fai doppio clic su Init (). Un codice di scheletro per questo verrà aperto nello Script Editor come mostrato di seguito.

Figura 52. onInit () Skeleton Code

Copia e incolla quanto segue nell'editor degli script, sostituendo completamente il codice esistente (una revisione del codice verrà fornita in una sezione successiva). Nello Script Editor fai clic su Control + S per salvare lo script.

 function DuckAI.onInit () -------------------------------------------- ------------------------------------ object.setTranslation (this.getObject (), 2, 3, 2, object.kGlobalSpace) lUser locale = application.getCurrentUser () locale lComp = hud.newComponent (lUser, hud.kComponentTypeLabel, "HUD.disp") if (lComp ~ = nil) quindi 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 ("Punteggio:% 2i", this.score ())) hud.setDefaultFont (lUser, "DefaultFont") hud.setLabelTextHeight (lComp, 100) hud.setLabelTextAlignment (lComp, hud.kAlignCenter, hud.kAlignCenter) end -------------------------------------- ------------------------------------------ fine --------------------------------------------------------------------------------

In modo simile, sostituire il codice per onEnterFrame come segue.

 function DuckAI.onEnterFrame () -------------------------------------------- ------------------------------------ local lObject = this.getObject () if (this.isPositive ( )) then 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) end local x, y, z = object.getRotation (lObject, object.kLocalSpace) object.setRotation (lObject, x + 0.3, y + 0.5, z + 1, object.kLocalSpace) ------- -------------------------------------------------- ----------------------- fine --------------------------------------------------------------------------------

Quindi, sostituire il codice per onSensorCollisionBegin con quanto segue:

 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 ("Punteggio:% 2i", this.score ()) ) end if (this.isPositive ()) then this.isPositive (false) else this.isPositive (true) end system.openURL ("http://www.stonetrip.com", "") ------ -------------------------------------------------- ------------------------ fine --------------------------------------------------------------------------------

Ora abbiamo finito con le variabili e il codice per DuckAI.


Osservazioni conclusive per la parte 3

Nella parte 3, abbiamo mostrato come modificare la scena della nostra applicazione. Abbiamo anche iniziato a inserire il codice per gli AIModels del gioco. Finora, abbiamo completato il codice per DuckAI. Nella parte 4, termineremo la codifica dei rimanenti AIModels, EggAI e MainAI, ed eseguiremo test unitari animando il gioco. Eseguiremo quindi il gioco dall'Editor ShiVa per l'importazione nello Strumento di authoring di Shiva. Infine, discuteremo due diverse opzioni di authoring nello Shiva Authoring Tool, uno per generare un eseguibile Android e un altro per generare un progetto Eclipse.