Le Properties

 Introduzione

Prima di addentrarci nella pura logica di gioco a Mattoni dobbiamo fare un paio di fermate su argomenti lasciati in sospeso dalle pagine del manuale. Infatti inizio con le Properties, poi passerò agli State. Se si conoscono gli argomenti si può proseguire, ma consiglio di dare una lettura ai link sopracitati, perchè partirò da li.

A cosa servono le Properties ? Fanno parte della programmazione dei Mattoni, sono come già detto alla pari delle variabili nei linguaggi di programmazione e hanno vari scopi, da mantenere un dato (che può variare durante il gioco), a calcolare il tempo, a fare da guida per le azioni degli oggetti, ecc ecc. L’uso che se ne fa è strettamente personale, posso aggiungere un doppio controllo alle mie logiche (anche se andrebbe a discapito del calcolo) e avere più controllo dell’azione, ma è sconsigliato.

Primo esempio – Calcoli

Aggiungi una Property, mettila in debug mode in questo modo possiamo vederne l’andamento in realtime (se non sai come fare torna ai link che ho messo nell’introduzione).
Adesso aggiungi un Sensor Keyboard e un’Actuator Property, associa un tasto a tua scelta nel Sensor e nell’Actuator cambia da Assign Add, seleziona la property prop, e inserisci il numero uno, dovresti avere una configurazione come nella foto sotto, io ho usato lo Spazio come tasto. Collega i due Mattoni mediante un Controller And e fai partire il motore di gioco con la lettera P.

Ogni volta che premi il tasto viene aggiunto 1 alla Property, in questo caso è l’input da tastiera che permette alla Property di cambiare stato, ma si può e si devono usare le Properties anche per calcoli automatici. Possiamo eseguire sottrazione e addizione, per gli altri calcoli bisogna usare il Python. Questa è una limitazione ma possiamo portarla a nostro vantaggio. Naturalmente per sottrarre basta aggiungere il – davanti al numero nel campo Value.

Secondo Esempio – Timer

Premi CTRL+N e inizia con un nuovo file. Aggiungi una Property e scegli il tipo Timer, se fai partire il motore di gioco vedrai la Property in debug iniziare a contare numeri positivi con parecchi decimali, quello che può saltare subito all’occhio è che non ci sono Mattoni settati, quindi la Property Timer ha bisogno di una rettifica, purtroppo per ridurre i decimali bisogna usare il Python e non è l’argomento di questa serie di tutorial dove si parla solo di Logica a Mattoni. Quindi cancella la Property.
Aggiungi ora una Property di tipo Integer, quello che voglio ottenere è un’aumento costante della Property, a tale proposito devo scegliere il Sensor giusto, un Sensor Always eseguito ogni frame fa aumentare di 1 la Property per ogni frame il che vuol dire che ci troveremo un Timer velocissimo. A noi serve che la Property cambi una volta al secondo, quindi l’impulso positivo che cambia lo stato del timer deve essere inviato costantemente ogni secondo. Quindi aggiungi un Delay Sensor settalo con il Delay a 60 e mettendo la spunta su Repeat. Aggiungi poi un’Actuator Property e settalo esattamente come prima, l’ultimo ritocco è di cambiare la Value iniziale a 1. In questo modo abbiamo automatizzato il sistema per un Timer, possiamo contare il tempo che scorre (più avanti vedremo anche come mostrare a video le Properties), oppure calcolare il tempo fino ad un certo punto (per esempio per 15sec.) e poi fare accadere qualcosa nel gioco, ci sono altre applicazioni ma le vedremo durante la serie dedicata ai Mattoni. Ecco la configurazione finale

Terzo Esempio – Property ed Action

In questo esempio abbiamo bisogno di un’azione, cioè dei fotogrammi registrati del movimento di un’oggetto, questo per poter accoppiare i fotogrammi di essa con una Property usandola come guida per fare proseguire l’animazione. Vuol dire che se l’animazione ha 100 frame la Property avrà 100 numeri su cui giocare per fare muovere l’oggetto e questo dipende da come vogliamo si muova. Siccome le possibilità sono infinite farò un esempio generico, se non sai come creare un’animazione (argomento che sarà inserito), scarica il file con l’animazione per seguire questo esempio. Apri il file, puoi notare nella finestra delle Proprietà dell’oggetto i numeri relativi agl’assi di rotazione sono gialli, questo perchè l’animazione tocca quel settore, il cubo gira un pò, premi ALT+A per vedere l’animazione di 100 frame. Quando fai partire l’animazione puoi notare che in alto a sinistra appare l’FPS dell’animazione, cioè il frame rate di esecuzione dell’animazione, di default è 24fps, per cambiarlo vai sulla finestra delle Proprietà del Render e sulla tab Display cambia il valore del campo Animation Frame rate a 60 (immagine sotto), in questo modo l’animazione sarà eseguita in 1 sec.

Aggiungi una Property Integer. Adesso dobbiamo pensare ad una sequenza di Mattoni per poter eseguire l’animazione in relazione al cambiamento della Property. Abbiamo visto che per incrementare una Property abbiamo a disposizione diversi input (manuali o automatici), in questo caso uso un Sensor Keyboard e gli assegno lo spazio, lo collego tramite un Controller And ad un’Actuator Property e lo setto sempre allo stesso modo, aggiungo 1 a prop. Adesso abbiamo l’incremento della Property, possiamo collegarla all’azione, per farlo dobbiamo valutare la Property con un’opzione del Sensor Property, possiamo usare Less Then e gli diamo un valore superiore a 100 (numero dei frames dell’azione), oppure Not Equal, stessa cosa; ma per questo esempio ho trovato più utile usare il Change, che indica semplicemente che quando la Property cambia invia un’impulso.
Adesso la parte più importante il collegamento vero e proprio tra le due entità, aggiungi un’Actuator Action e imposta il campo del menù a tendina su Property, l’action è CubeAction e la Property è prop, come nell’immagine seguente (a sinistra i Sensors a destra gli Actuators)

Ho aumentato a 5 l’incremento della Property, in questo modo l’animazione salta di 5 frame per volta. Fai partire il motore di gioco e premi il tasto, puoi vedere che la Property in debug sale e il cubo ruota in relazione ad essa. Questo sistema da la possibilità di fare eseguire un’azione a seconda del fotogramma che scegliamo noi, quindi possiamo definire una posizione o una parte dell’animazione. Avrai anche notato che l’incremento della Property sale sempre anche se l’animazione è finita, a questo proposito si può semplicemente cambiare Controller con un Expression e usare una riga di Python semplicissima

prop < 100

Questo limita il passaggio del segnale all’Actuator che incrementa la Property, il codice dice che fino a quando la prop (che è il nome della property) è minore di 100 l’impulso può passare, in caso contrario (cioè quando la prop è a 100) il segnale viene bloccato. In questo caso però verranno conteggiati tutti i segnali positivi e negativi, quindi l’incremento avverrà sia quando premi che quando rilasci il tasto. Si può ovviare a questo inconveniente usando un’altra riga di SCA, oppure usando gli State per bloccare l’andamento del loop, ma questo lo vedremo nel prossimo articolo. Per ora penso che sia tutto, un consiglio che ti do sopratutto se sei alle prime armi con il motore di gioco, o con Blender in generale, è quello di provare e riprovare e se vuoi anche sperimentare, usare altri Sensors per inviare l’input e fare cambiare la Property. Come detto molti altre applicazioni delle Properties a livello pratico saranno inserite in seguito.