Definizione
Il Sensor Collision invia un impulso positivo quando l’oggetto proprietario collide (tocca) un’altro oggetto. Il Sensor torna negativo quando la collisione con l’oggetto finisce, in questo modo si perde anche la variabile che ritorna l’oggetto.
Opzioni
- Il pulsante Pulse se abilitato rende l’oggetto sensibile ad altre collisioni anche se si trova a contatto con l’oggetto che ha attivato l’ultimo impulso positivo.
- Il pulsante M/P serve a determinare se la collisione deve avvenire con un Material o una Property.
- Il campo a seguire (nell’immagine sopra il Sensor è impostato su Property) serve a specificare il nome dell’opzione scelta, nel caso della Property si dovrà inserire il nome manualmente, invece per il Material cliccando sulla casella si potrà scegliere quale inserire.
Se il campo M/P è lasciato vuoto il Sensor invierà un impulso positivo ogni volta che avviene una collisione con un qualsiasi oggetto della scena.
La collisione con i soft body non è rilevata, questa è una limitazione della libreria Bullet usata dal BGE.
N.B. E’ buona pratica rinominare ogni singolo oggetto, property, materiale ecc ecc.
Ptyhon
import bge cont = bge.logic.getCurrentController() own = cont.owner sensor = cont.sensors['Collision'] # configurazione degli attributi in lettura pulse = sensor.usePulseCollision # boolena scelta = sensor.useMaterial # boolean mat_prop_name = sensor.propName # stringa # configurazione degli attributi in scrittura sensor.usePulseCollision = True # boolean sensor.useMaterial = False # boolean sensor.propName = "sfera" # stringa # informazioni degli oggetti hitObj = sensor.hitObject hitObjects = sensor.hitObjectList
Le opzioni in letturae in scrittura vengono eseguite solo quando l’oggetto proprietari collide con un’altro oggetto, quindi quando il Sensor invia l’impulso al Controller Python che esegue il codice, di fatto è per tutti i Sensors così.
Come già visto i pulsanti restituiscono sempre una variabile boolean, mentre i campi dove si inseriscono i dati, in questo caso un Materiale o una Property restituiscono una variabile stringa (in altri casi una variabile int).
Gli attributi in scrittura impostano le opzioni del Sensor, la funzione useMaterial serve a scambiare la modalità tra una Property (se è False) e un Materiale (se è True), facendo delle prove ho notato che se si imposta la Property (come si usa spesso) bisogna richiamarla dall’oggetto che collide col proprietario, prima di postare un’esempio è necessario che spieghi le ultime righe del codice.
Le informazioni degli oggetti restituiscono il nome dell’oggetto che collide in forma di variabile stringa, se il Pulse non è attivo (come di default, False) le due funzioni restituiscono soltanto il primo oggetto che collide, viceversa tutti gli oggetti che collidono col proprietario. Nel caso di hitObject restituisce la variabile semplice, mentre hitObjectList restituisce una lista (array) che contiene tutti gli oggetti che collidono.
Esempio pratico
Posto un’esempio per mostrarti come si richiama una Property una volta impostata via script
sens.useMaterial = False sens.propName = "sfera" if sens.positive: obj = sens.hitObject if "sfera" in obj: print(obj)
Questo codice fa riferimento ad un’esempio che puoi scaricare da QUA, ricorda di aprire la console. Come puoi vedere ci sono due oggetti che cadono e collidono con il cubo di default quando fai partire il motore di gioco, ma soltanto la sfera viene rilevata per via del codice, che è impostato così :
- Imposto la Property
- Imposto il nome della Property a “sfera” (ricorda sempre i doppi o singoli apici perché è una stringa)
- Se il Sensor è positivo (cioè invia l’impulso)
- Rileva gli oggetti che collidono
- Se “sfera” è in obj – questa riga cerca la Property sfera negli oggetti che collidono
- Stampa l’oggetto che ha la Property cercata.
La stessa procedura logica non si può usare se si usa un Materiale, questo perché il materiale è un’opzione fisica dell’oggetto, quindi basta solo la collisione. Cambia il codice sopra con il seguente per provare la collisione con il Materiale del cilindro, lo script stampa sulla console il nome dell’oggetto che ha quel materiale, prova ad aggiungere altri oggetti e solo ad alcuni dai lo stesso materiale.
sens.useMaterial = True sens.propName = "cilindro" if sens.positive: obj = sens.hitObject print(obj)
Quando sarà necessario inserirò esempi pratici per farti capire il funzionamento dello script, come in questo caso, quando il Mattone è importante.