Warning: file_exists(): open_basedir restriction in effect. File(/tmp/rvpuuusc.txt) is not within the allowed path(s): (/membri/blendergameengineitalia/:/membri2/blendergameengineitalia/:/membri/.dummy/) in /membri/blendergameengineitalia/wp-includes/plugin.php(437) : runtime-created function on line 1

Warning: file_exists(): open_basedir restriction in effect. File(/tmp/rvpuuusc.txt) is not within the allowed path(s): (/membri/blendergameengineitalia/:/membri2/blendergameengineitalia/:/membri/.dummy/) in /membri/blendergameengineitalia/wp-includes/plugin.php(437) : runtime-created function on line 1

Creare un prototipo parte 5


Warning: file_exists(): open_basedir restriction in effect. File(/tmp/rvpuuusc.txt) is not within the allowed path(s): (/membri/blendergameengineitalia/:/membri2/blendergameengineitalia/:/membri/.dummy/) in /membri/blendergameengineitalia/wp-includes/plugin.php(437) : runtime-created function on line 1

Warning: file_exists(): open_basedir restriction in effect. File(/tmp/rvpuuusc.txt) is not within the allowed path(s): (/membri/blendergameengineitalia/:/membri2/blendergameengineitalia/:/membri/.dummy/) in /membri/blendergameengineitalia/wp-includes/plugin.php(437) : runtime-created function on line 1

Warning: file_exists(): open_basedir restriction in effect. File(/tmp/rvpuuusc.txt) is not within the allowed path(s): (/membri/blendergameengineitalia/:/membri2/blendergameengineitalia/:/membri/.dummy/) in /membri/blendergameengineitalia/wp-includes/plugin.php(437) : runtime-created function on line 1

Warning: file_exists(): open_basedir restriction in effect. File(/tmp/rvpuuusc.txt) is not within the allowed path(s): (/membri/blendergameengineitalia/:/membri2/blendergameengineitalia/:/membri/.dummy/) in /membri/blendergameengineitalia/wp-includes/plugin.php(437) : runtime-created function on line 1

Warning: file_exists(): open_basedir restriction in effect. File(/tmp/rvpuuusc.txt) is not within the allowed path(s): (/membri/blendergameengineitalia/:/membri2/blendergameengineitalia/:/membri/.dummy/) in /membri/blendergameengineitalia/wp-includes/plugin.php(437) : runtime-created function on line 1

Warning: file_exists(): open_basedir restriction in effect. File(/tmp/rvpuuusc.txt) is not within the allowed path(s): (/membri/blendergameengineitalia/:/membri2/blendergameengineitalia/:/membri/.dummy/) in /membri/blendergameengineitalia/wp-includes/plugin.php(437) : runtime-created function on line 1

Warning: file_exists(): open_basedir restriction in effect. File(/tmp/rvpuuusc.txt) is not within the allowed path(s): (/membri/blendergameengineitalia/:/membri2/blendergameengineitalia/:/membri/.dummy/) in /membri/blendergameengineitalia/wp-includes/plugin.php(437) : runtime-created function on line 1

Warning: file_exists(): open_basedir restriction in effect. File(/tmp/rvpuuusc.txt) is not within the allowed path(s): (/membri/blendergameengineitalia/:/membri2/blendergameengineitalia/:/membri/.dummy/) in /membri/blendergameengineitalia/wp-includes/plugin.php(437) : runtime-created function on line 1

Warning: file_exists(): open_basedir restriction in effect. File(/tmp/rvpuuusc.txt) is not within the allowed path(s): (/membri/blendergameengineitalia/:/membri2/blendergameengineitalia/:/membri/.dummy/) in /membri/blendergameengineitalia/wp-includes/plugin.php(437) : runtime-created function on line 1

Warning: file_exists(): open_basedir restriction in effect. File(/tmp/rvpuuusc.txt) is not within the allowed path(s): (/membri/blendergameengineitalia/:/membri2/blendergameengineitalia/:/membri/.dummy/) in /membri/blendergameengineitalia/wp-includes/plugin.php(437) : runtime-created function on line 1

Warning: file_exists(): open_basedir restriction in effect. File(/tmp/rvpuuusc.txt) is not within the allowed path(s): (/membri/blendergameengineitalia/:/membri2/blendergameengineitalia/:/membri/.dummy/) in /membri/blendergameengineitalia/wp-includes/plugin.php(437) : runtime-created function on line 1

Warning: file_exists(): open_basedir restriction in effect. File(/tmp/rvpuuusc.txt) is not within the allowed path(s): (/membri/blendergameengineitalia/:/membri2/blendergameengineitalia/:/membri/.dummy/) in /membri/blendergameengineitalia/wp-includes/plugin.php(437) : runtime-created function on line 1

Warning: file_exists(): open_basedir restriction in effect. File(/tmp/rvpuuusc.txt) is not within the allowed path(s): (/membri/blendergameengineitalia/:/membri2/blendergameengineitalia/:/membri/.dummy/) in /membri/blendergameengineitalia/wp-includes/plugin.php(437) : runtime-created function on line 1

Come prima cosa, e come hai già fatto negli articoli precedenti, salva il file con un’altro nome (o numero). Iniziamo subito.
Nel mio progetto ho imparentato, come ho già spiegato per i cubi che formano la scena, anche il pavimento e i muri esterni ad una Empty, in questo modo l’Outliner è ancora più leggibile, naturalmente ho rinominato la Empty adhoc.

Adesso per facilitarmi il lavoro faccio in modo che posso selezionare solo le monete, basta cliccare sull’icona del mouse nella finestra dell’Outliner, purtroppo per i figli (cioè gli oggetti imparentati con le Empty) bisogna deselezionarli uno ad uno. Una volta fatto questo si può iniziare a posizionare le monete come meglio crediamo, naturalmente bisogna clonarle in modo da ottenerne un buon numero che bisogna tenere ben a mente perchè sarà il numero che verrà scritto nella Property della porta che farà scattare la meccanica di apertura (nel mio questo caso la porta scomparirà). Nel mio prototipo inserirò 10 monete, il numero dipende da quanto è grande il livello e dal tuo design quindi è strettamente personale. Una volta clonate le monete e posizionate le imparento ad una Empty come fatto per gli altri oggetti, sempre per rendere l’Outliner più leggibile. Ecco come è la mia scena

Una cosa che sicuramente avrai notato, anche nel tuo prototipo, è che ci sono tante linee tratteggiate; se pensi che un livello di gioco completo è più complesso e ci sono più parentele la cosa può diventare fastidiosa quando si deve selezionare un’oggetto o addirittura per fare dei cambiamenti nel livello. Si può rimediare a questo problema levando la spunta sulla Relationship Lines (linee di relazione), col tasto N si apre la Properties Shelf sulla destra, scorri in basso e trova la tab Display, in questa tab c’è quella voce relativa alle linee di relazione, basta levare la spunta.

Adesso basta cambiare il numero di monete che il giocatore dovrà prendere per fare aprire la porta e questa meccanica congiunta (monete+porta) sarà finita. Seleziona la porta e sul Sensor Property cambia il numero del Valore (Value) con il numero di monete che hai nel tuo livello, adesso salva, vai alla vista Camera e prova il tuo livello.

Tutto molto bello, funzionante, ma poco divertente, cosa manca ? In ogni gioco che si rispetti c’è sempre il timore di perdere, questo tipo di paura è dato da un nemico che ti può colpire o da oggetti che ti fanno perdere energia o addirittura una vita preziosa; siccome nel mio prototipo non ho definito un nemico, mi limito a creare delle aree a rischio, dove se il giocatore vi casca il livello riparte da zero; lo so non è il massimo ma su un livello molto lungo può essere fastidioso.

Come prima cosa individuo le aree che potrebbero fare al caso mio, le ho segnate con una selezione veloce per farti capire un pò come verranno

Come oggetti per questo prototipo userò dei piani, semplici piani, ridimensionati in modo che combacino con la mia idea, una volta posizionati e se sono soddisfatto implemento la meccanica.

Ho dato ai due piani lo stesso materiale, un rosso, Shadeless (senza ombra) e con una trasparenza del 75%, in questo modo si capisce subito che non è cosa buona caderci. Nelle proprietà della fisica ho anche cliccato sulla proprietà Ghost, cioè che quando un oggetto entra in collisione lo attraversa, questo perchè non voglio che il player vi si fermi sopra e perchè voglio dare un piccolo delay dal momento della collisione al momento che riparte la scena.
Quindi con queste poca informazioni implemento la mia meccanica sulla morte del player.

Il primo passo è determinare la collisione tra il piano e il player, seleziona il piano inserisci un Sensor Collision e nella voce Property scrivi player, o la Property che identifica il tuo, siccome voglio dare quel leggero ritardo dal momento della collisione al momento in cui riparte il gioco aggiungo una Property e la chiamo count, come sempre puoi dare il nome che vuoi. Aggiungo un’Actuator Property e seleziono il Mode Add, seleziono la mia Property count e gli do una Value di 1, collego i due mattoni con un Controller And. In questo modo quando avviene la collisione tra i due oggetti la Property aumenta di 1, per fare in modo che la Property salga ogni frame bisogna cliccare sul True Level Trigger del Sensor Collision (il pulsantino con i tre puntini in alto). Adesso devo dire a Blender che quando la Property count arriva ad un dato numero il gioco riparte da zero, quindi aggiungo un Sensor Property, lascio il parametro Equal, seleziono la Property count e gli do una Value di 30 che significa mezzo secondo. Inserisco ora un’Actuator Game e dal menù a tendina Game seleziono Restart Game, unisco il tutto con un Controller And. Metto un’immagine dei mattoni completa (senza contare i Controller)

 

Adesso basta copiare questi mattoni sull’altro piano e questa meccanica è conclusa. Seleziona il piano senza i mattoni, tenendo premuto Shift seleziona il piano con i mattoni, premi lo Spazio e scrivi sulla ricerca copy logic bricks to selected ( puoi anche scrivere solo copy, Blender ti darà tutti i risultati e poi scegli quello che ho menzionato). 

Questo sistema si chiama a Trigger, un Trigger è un’oggetto visibile o invisibile che può innescare un’azione specifica una volta che il giocatore vi si trova a contatto, come in questo caso, vengono usati spesso e sono molto utili per eseguire svariate mansioni per esempio il cambio di musica, o l’accensione di una luce, o anche far partire un nemico. In questo caso fa ripartire il gioco da zero, sarebbe più opportuno implementare una meccanica per le vite, ogni volta che si cade si perde una vita e si riparte da capo, ma non è questo il caso, lo farò in un’altro tipo di tutorial.

Quando il giocatore prende tutte le monete e la porta sparisce voglio creare un’altro Trigger che determina la fine del livello e lo inserisco dopo la porta.

Inserisci un cubo e chiamalo fine o col nome che vuoi per capire che è il punto finale, io l’ho scalato di 2 unità e dalle proprietà della fisica dell’oggetto ho spuntato Ghost e reso Invisible, in questo modo non si vedrà nella scena quando sarà nell’inquadratura della Camera. Adesso aggiungi un Sensor Collision e inserisci sulla Property player (o il nome da te dato al player), un’Actuator Game e dal menù a tendina Game scegli Quit Game, collega i due mattoni tramite un Controller And.

Per provare questa meccanica sposta il player vicino al Trigger fine, naturalmente sposta anche la porta, se il motore esce dalla modalità play la meccanica è corretta. Quindi sposta il player nella sua posizione originale e salva.

Conclusioni

Ho creato questa serie di tutorial per farti capire un pò una base della creazione dei giochi, noi utilizziamo il motore di gioco di Blender ma quello che hai imparato vale per qualsiasi motore di gioco. L’idea è quella di dare una prima infarinatura in modo da poter passare a tutorial più complessi senza dover soffermarci su come si copiano i mattoni da un oggetto all’altro, o come si implementa un ritardo dopo un evento (che sia una collisione o un tasto premuto), come si imparentano gli oggetti per rendere l’Outliner più leggibile, la parentela tra la camera e il player e tutto quello che hai imparato in questi cinque articoli. Prossimamente andrò più a fondo nei vari argomenti. Ricorda di fare molta pratica e sperimentazione, fai buon uso dei Mattoni, semplifica il più possibile e salva spesso. Spero di esserti stato utile in questa mini serie. 

Puoi scaricare tutti i file da me usati in questi articoli al seguente Link, serviranno in futuro per i prossimi tutorial.

A presto G.Corvetti


Warning: file_exists(): open_basedir restriction in effect. File(/tmp/rvpuuusc.txt) is not within the allowed path(s): (/membri/blendergameengineitalia/:/membri2/blendergameengineitalia/:/membri/.dummy/) in /membri/blendergameengineitalia/wp-includes/plugin.php(437) : runtime-created function on line 1

Warning: file_exists(): open_basedir restriction in effect. File(/tmp/rvpuuusc.txt) is not within the allowed path(s): (/membri/blendergameengineitalia/:/membri2/blendergameengineitalia/:/membri/.dummy/) in /membri/blendergameengineitalia/wp-includes/plugin.php(437) : runtime-created function on line 1

Warning: file_exists(): open_basedir restriction in effect. File(/tmp/rvpuuusc.txt) is not within the allowed path(s): (/membri/blendergameengineitalia/:/membri2/blendergameengineitalia/:/membri/.dummy/) in /membri/blendergameengineitalia/wp-includes/plugin.php(437) : runtime-created function on line 1

Warning: file_exists(): open_basedir restriction in effect. File(/tmp/rvpuuusc.txt) is not within the allowed path(s): (/membri/blendergameengineitalia/:/membri2/blendergameengineitalia/:/membri/.dummy/) in /membri/blendergameengineitalia/wp-includes/plugin.php(437) : runtime-created function on line 1

Warning: file_exists(): open_basedir restriction in effect. File(/tmp/rvpuuusc.txt) is not within the allowed path(s): (/membri/blendergameengineitalia/:/membri2/blendergameengineitalia/:/membri/.dummy/) in /membri/blendergameengineitalia/wp-includes/plugin.php(437) : runtime-created function on line 1

Warning: file_exists(): open_basedir restriction in effect. File(/tmp/rvpuuusc.txt) is not within the allowed path(s): (/membri/blendergameengineitalia/:/membri2/blendergameengineitalia/:/membri/.dummy/) in /membri/blendergameengineitalia/wp-includes/plugin.php(437) : runtime-created function on line 1

Warning: file_exists(): open_basedir restriction in effect. File(/tmp/rvpuuusc.txt) is not within the allowed path(s): (/membri/blendergameengineitalia/:/membri2/blendergameengineitalia/:/membri/.dummy/) in /membri/blendergameengineitalia/wp-includes/plugin.php(437) : runtime-created function on line 1