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ì :

  1. Imposto la Property
  2. Imposto il nome della Property a “sfera” (ricorda sempre i doppi o singoli apici perché è una stringa)
  3.  
  4. Se il Sensor è positivo (cioè invia l’impulso)
  5. Rileva gli oggetti che collidono
  6.  
  7. Se “sfera” è in obj – questa riga cerca la Property sfera negli oggetti che collidono
  8. 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.

Leave a Comment.