Dezvoltare 3D a jocului cu ShiVa3D Suite Editarea scenelor

Curios despre dezvoltarea jocurilor 3D? Acum este momentul să înveți! Această serie de tutori din cinci părți va demonstra cum să construiți un joc simplu cu ShiVa3D Suite, un motor de joc 3D și un instrument de creație. Aceasta este cea de-a treia tranșă a seriei, unde veți învăța cum să editați scenele unui joc și să începeți să codificați modelele AI.


Dezvoltarea jocului în editorul ShiVa - Continuare

În partea a doua, am început prin descrierea modului de a dezvolta jocul folosind ShiVa Editor. Am introdus modulele editorului ShiVa folosite în dezvoltarea aplicației tutorial și am vorbit despre fișierele modelului Collada reprezentând caracterele principale din aplicație. Am discutat apoi câțiva pași inițiale necesare pentru crearea aplicației, cum ar fi crearea jocului și scena și importul modelelor Collada. În partea a 3-a, vom arăta cum să editați scena aplicației noastre. De asemenea, vom începe să introduceți codul pentru modelele AIM ale jocului. În special, vom introduce codul pentru DuckAI.


Editați Scena

Acum vom seta diferite proprietăți ale scenei.

Presupunem că fișierul imagine marble.jpg a fost copiat sub folderul numit D: \ temp \ skybox. În mediul dvs., dacă copiați fișierul într-o altă locație, asigurați-vă că modificați instrucțiunile de mai jos.

În DataExplorer, mergeți la Import -> Textură. În dialog, selectați fișierul după cum se arată mai jos și faceți clic pe Import.

Figura 33. Importarea texturii

Acum, în dosarul Texturi din DataExplorer, ar trebui să vedeți o textură numită marmură.

Figura 34. Dosarul de texturi

Să editați diferite atribute ale scenei utilizând editorul de ambianță. Aduceți Editorul de Ambient și Data Explorer una lângă alta și faceți dublu clic pe MyScene din dosarul Scene. În acest moment, vi se poate solicita salvarea scenei, după cum se arată mai jos. Faceți clic pe da și închideți dialogul.

Figura 35. Salvați Prompt

Editorul Ambient și Data Explorer ar trebui să pară alături, după cum urmează.

Figura 36. Editor de ambianță

În secțiunea Iluminare, reglați culoarea Skylight pentru a obține un ton galben decolorat, după cum se arată mai jos.

Figura 37. Culoarea luminii

Pentru fiecare dintre elementele Skybox din secțiunea Sky, selectați marmura.

Figura 38. Setările Skybox

Aduceți Editorul de jocuri și Data Explorer una lângă alta. Selectați Duck -> Games în Data Explorer și faceți dublu clic pe Duck. Acest lucru va aduce jocul în Editorul de jocuri. Selectați Resurse -> Fonturi în Data Explorer. În Editorul de jocuri, apăsați fila Resurse. Trageți și lăsați Fontul implicit din Data Explorer în fila Resurse (vedeți mai jos).

Figura 39. Implicit font

Vom adăuga acum o etichetă în ou. (Un obiect poate fi căutat și localizat într-un joc programat bazat pe eticheta acestuia.) Aduceți Scene Explorer și Data Explorer una lângă alta. În Data Explorer, selectați Duck -> Scenes -> MyScene și faceți dublu clic. În acest moment, vi se poate solicita să salvați MyScene după cum urmează. Faceți clic pe da și închideți dialogul.

Figura 40. Salvați Prompt pentru MyScene

În Exploratorul de scene, evidențiați sfera și din meniul cu butonul din dreapta selectați opțiunea Editare etichetă de selecție. În dialog, tastați "ou" pentru etichetă. Acești pași sunt afișați în cele două imagini consecutive de mai jos.

Figura 41. Editarea etichetei de selecție Figura 42. Dialogul de etichete

AIModele și codul

Vom crea acum AIModelele și codul asociat pentru jocul nostru. Reamintim din discuția anterioară că AIModelele reprezintă comportamentul obiectelor dintr-un joc. Duckul și oul vor avea fiecare propriile lor modele AIModels, DuckAI și EggAI. În plus, jocul în sine va avea propriul AIModel, numit MainAI. MainAI va fi responsabil pentru inițializarea camerei și scena, precum și pentru procesarea și expedierea evenimentelor utilizatorilor.

Să analizăm mai întâi câteva dintre conceptele referitoare la AIModeluri, împrumutând informații din documentația Ajutor pentru Editorul ShiVa.

  • A manipulant conține cod pentru a procesa un anumit eveniment. În plus față de un set predefinit de handlers, se pot defini, de asemenea, manipulatori personalizați. Vom implementa doar un subset de agenți de lucru predefiniți, așa cum sunt enumerați mai jos.
    • onInit: Acest handler este apelat atunci când obiectul asociat cu AIModel este creat; utilizat în mod obișnuit pentru sarcini de inițializare.
    • onEnterFrame: Un joc este o buclă de cadre. Acest handler este apelat pe fiecare cadru. Utilizați în principal acest manipulator pentru a defini mișcarea unui obiect.
    • onTouchSequenceBegin: Acest handler este apelat când utilizatorul începe să atingă ecranul dispozitivului. Acest manipulator de evenimente este o modalitate de a notifica codul AIModel că începe o secvență de evenimente touch.
    • onTouchSequenceChange: Acest handler este apelat pentru fiecare eveniment tactil în secvența de atingere, trecând numărul de atingeri și coordonatele fiecărei atingeri.
    • onTouchSequenceEnd: Acest handler este apelat când utilizatorul nu mai atinge ecranul dispozitivului. Acest handler de evenimente este o modalitate de a notifica codul AIModel că secvența evenimentelor atingete sa încheiat. Evenimentele touch care vor fi procesate de onTouchSequenceBegin, onTouchSequenceChange și onTouchSequenceEnd sunt disponibile numai pentru un dispozitiv compatibil multitouch.
    • onSensorCollisionBegin: Acest manipulator de evenimente este apelat când un senzor asociat cu obiectul se ciocnește cu un alt senzor.
  • A funcţie conține cod pentru procesarea sarcinilor specifice. Funcțiile nu sunt predefinite, le definiți și le implementați după cum doriți. O funcție poate trimite sau posta evenimente unui manipulant. (Diferența de bază între trimiterea și postarea unui eveniment este că execuția unui sendEvent este instantanee, în timp ce execuția unui postEvent este executată după o întârziere solicitată.) O funcție poate fi apelată direct de la o altă funcție sau de la un handler. În plus, o funcție poate fi ținta unui sendEvent sau a unui postEvent.
  • A variabil pot fi accesate la nivel global din funcțiile și manipulatorii dintr-un anumit AIModel.
  • AIModels sprijină, de asemenea, conceptul de stat care nu este folosit în acest tutorial.

Să începem acum să definim AIModelele în jocul nostru. Aduceți Explorer Explorer și Data Explorer una lângă alta și faceți dublu clic pe MyScene în Data Explorer din dosarul Scenele. (Dacă vi se solicită, salvați MyScene și închideți dialogul.) În Explorer Explorer, selectați fila Obiecte și selectați rață, apoi faceți clic dreapta pe meniul Controllers -> AI -> Create AI. Acest lucru este prezentat mai jos.

Figura 43. Crearea DuckAI

Denumiți AI drept DuckAI în caseta de dialog, după cum se arată mai jos, și apăsați OK.

Figura 44. Creați un dialog pentru programul DuckAI

În mod similar, în fila Obiecte de explorare a Scenei, selectați sfera, apoi faceți clic dreapta pe meniul Controlere -> AI -> Creare AI. Denumiți AI ca EggAI în dialog și faceți clic pe OK.

În Data Explorer, selectați Creare -> Resurse -> AIModel (a se vedea mai jos). Denumiți-l MainAI.

Figura 45. Crearea MainAI

În Data Explorer, ar trebui să vedeți acum trei AIModeluri în directorul Resources -> AIModels: DuckAI, EggAI, MainAI. Deschideți Editorul de jocuri și cel de date de tip Explorer unul lângă celălalt. În Editorul de jocuri, selectați fila Principal. Din dosarul Resurse -> AIModeluri, trageți și fixați MainAI în zona de text a utilizatorului MainAI din Editorul de jocuri (vedeți mai jos).

Figura 46. MainAI

Acum, deschideți Editorul AIModel și Data Explorer una lângă alta. Faceți dublu clic pe butoanele DuckAI, EggAI și MainAI. Ar trebui să vedeți o filă separată pentru fiecare dintre modelele AIModel în AIModel Editor așa cum se arată mai jos.

Figura 47. Editorul AIModel

Introduceți variabile și cod pentru DuckAI

În fila DuckAI, faceți clic pe Adăugare variabilă și adăugați o variabilă de tip boolean. Denumirea este pozitivă cu valoarea adevărată fiind valoarea inițială (prezentată mai jos). Faceți clic pe OK pentru a renunța la dialog.

Figura 48. Definirea unei variabile

În mod similar, adăugați o variabilă numită "scor" în cazul în care tipul este "număr", iar valoarea inițială este 0. Chiar dacă tastați-o ca 0, variabila va fi inițializată ca float, adică 0.000.

Încă în fila DuckAI, faceți clic pe Add Handler -> onEnterFrame, după cum se arată mai jos.

Figura 49. Adăugarea unui manipulant

În mod similar, faceți clic pe Add Handler -> onInit. În cele din urmă, faceți clic pe Add Handler -> Object Handler -> onSensorCollisionBegin (vedeți mai jos).

Figura 50. Adăugarea unui handler pentru senzorul de coliziune

Acum, fila DuckAI va arata astfel:.

Figura 51. DuckAI Tab

Aduceți editorul AIModel și editorul de scripturi alăturate. În fila DuckAI a editorului AIModel, faceți dublu clic peInit (). Un cod de schelet pentru acest lucru va fi deschis în Editorul scriptului, după cum se arată mai jos.

Figura 52. onInit () Cod schelet

Copiați și lipiți următoarele în editorul de script, înlocuind complet codul existent (o revizuire a codului va fi dată într-o secțiune ulterioară). În editorul Script faceți clic pe Control + S pentru a salva scriptul.

 funcția DuckAI.onInit () -------------------------------------------- ------------------------------------ object.setTranslation (this.getObject (), 2, 3, 2, obiect.kGlobalSpace) local lUser = application.getCurrentUser () local lComp = hud.newComponent (lUser, hud.kComponentTypeLabel, "HUD.disp") dacă (lComp ~ = nil) ) lk.setComponentSize (lComp, 30, 10) hud.setComponentBackgroundColor (lComp, 0, 0, 0, 0) hud.setComponentBorderColor (lComp, 0, 0, 0, 0) hud.setComponentVisible (lComp, 255) hud.setLabelText (lComp, string.format ("Scor:% 2i", this.score ())) hud.setDefaultFont (lUser, "DefaultFont") hud.setLabelTextHeight (lComp, 100) hud.setLabelTextAlignment (lComp, hud.kAlignCenter, hud.kAlignCenter) sfârșitul -------------------------------------- ------------------------------------------ Sfârșit --------------------------------------------------------------------------------

În mod similar, înlocuiți codul pentruEnterFrame după cum urmează.

 funcția DuckAI.onEnterFrame () -------------------------------------------- ------------------------------------ local lObject = this.getObject () dacă (this.isPositive ( )) apoi object.rotateAroundTo (lObject, 0,0,0,0,0,75,0, object.kGlobalSpace, 0,5) altceva object.rotateAroundTo (lObject, 0,0,0,0, -0,75,0, object.kGlobalSpace , 0.5) se termină local x, y, z = object.getRotation (lObject, object.kLocalSpace) object.setRotation (lObject, x + 0.3, y + 0.5, z + 1, object.kLocalSpace) -------------------------------------------------- ----------------------- Sfârșit --------------------------------------------------------------------------------

Apoi, înlocuiți codul pentruSensorCollisionBegin cu următoarele:

 funcția DuckAI.onSensorCollisionBegin (nSensorID, hTargetObject, nTargetSensorID) --------------------------------------- ----------------------------------------- this.score (this.score () +1) locale lComp = hud.getComponent (application.getCurrentUser (), "HUD.disp") dacă (lComp) atunci hud.setLabelText (lComp, string.format ("Score:% 2i", this.score ) end if (this.isPositive ()) atunci this.isPositive (false) altceva this.isPositive (true) end system.openURL ("http://www.stonetrip.com", ") ------ -------------------------------------------------- ------------------------ Sfârșit --------------------------------------------------------------------------------

Acum am terminat cu variabilele și codul pentru DuckAI.


Observații finale pentru partea 3

În partea a treia, am arătat cum să editați scena aplicației noastre. De asemenea, am început să introducem codul pentru AIModelele jocului. Până acum, am terminat codul pentru DuckAI. În partea a 4-a, vom termina codarea pentru restul AIModelurilor, EggAI și MainAI și vom efectua testarea unităților prin animarea jocului. Apoi vom exporta jocul din ShiVa Editor pentru a fi importat în Shiva Authoring Tool. În cele din urmă, vom discuta două opțiuni de autorizare diferite în Instrumentul de editare Shiva, unul pentru generarea unui executabil Android și altul pentru generarea unui proiect Eclipse.

Cod