Comprendere il python in bge – introduzione

Come avete potuto leggere negli articoli del sito, oppure constatare per vostra esperienza personale, Blender mette a disposizione dello sviluppatore un sistema a mattoni logici che è possibile interconnettere tra loro tramite un’apposita GUI (graphic user interface). Trascini il mouse dal pin di un sensor fino al pin dell’actuator desiderato ed è lì creato il flusso logico che il programma sarà pronto ad eseguire… tutto molto bello.

Proseguendo nello sviluppo però, le condizioni e le relazioni diventano troppo complesse, ingestibili ed impossibili da debuggare. Qui forse può tornarci utile saper gestire i controller python.

Perché dai mattoni logici, vi chiederete, andiamo sempre a finire a questo benedetto python ? La risposta è semplice. I mattoni logici sono limitati e non esprimono tutte le potenzialità del GE di Blender, inoltre uno script python, se scritto bene, è più facilmente digeribile dal motore di gioco, è più facilmente leggibile dall’utente quindi debuggabile più rapidamente e più facilmente mantenibile. Inoltre, comprendendo i moduli, possiamo renderli generici per diversi oggetti che prevedono logiche di gioco uguali ovvero creare vere e proprie sottoclassi degli oggetti di blender.

Lo scopo di questa serie di articoli è proprio quello di andare a comprendere la logica per generalizzare una classe oppure un modulo e renderlo fruibile ed adattabile per altri oggetti di scena oppure addirittura per altri progetti. Cercheremo di spiegare il python capendo passo per passo come, ed in quali circostanze, vanno utilizzati i vari comandi, funzioni e costrutti logici così da rendere meno ostico questo discorso anche a tutte quelle persone meno avvezze alla programmazione.   

Selezionando il layout game logic, vediamo che sulla destra è presente un editor di testo pronto ad ospitare il nostro codice ma al momento non serve. Come prima cosa andiamo ad aggiungere un Sensor Always ed aggiungiamo e colleghiamo anche un controller python. vediamo che questo ha due tipologie di utilizzo, Script e Module . 

Creare_un_prototipo_parte1_img1

E’ doveroso a questo punto capire la differenza tra Modulo e Script e come Blender si comporta a seconda della tipologia

Modalità script Modalità Modulo
  • Utilizza il codice Python da qualsiasi blocco di testo nell’editor di testo di Blender.
  • Utilizza il codice Python da un file esterno, o se non è presente dal blocco di testo nell’editor di testo di Blender.
  • Il blocco di testo può avere qualsiasi estensione.
  • Il file/blocco di testo deve necessariamente avere l’estensione “.py”
  • Il codice verrà interpretato ogni qual volta cambia il valore di trigger del controller.
  • Il codice verrà compilato al primo accesso. Questo migliora se pur di poco le prestazioni del motore.
  • Il codice viene ricreato ad ogni accesso, pertanto non è possibile memorizzare tutti i dati che possono servire dopo l’esecuzione del codice. Eventuali dati devono essere salvati all’interno di elementi interni allo script come ad esempio Oggetti di scena, moduli, file esterni.
  • Il codice viene creato solo una volta. il modulo può memorizzare i valori in attributi specifici. Questi ultimi  rimangono in memoria fino a quando il codice non viene rilasciato dal sistema (Di solito alla fine del gioco).
  • Il primo livello di indentazione viene eseguito ogni qual volta cambia il valore di trigger del controller.
  • Il primo livello di indentazione viene eseguito la prima volta che si accede al modulo. Il che rende questo codice un candidato perfetto per qualsiasi inizializzazione specifica del modulo.
  • Possibilità di accedere solo a se stesso
  • Possibilità di accedere a funzioni incapsulate definite all’interno del modulo stesso
 
  • Lo script dovrebbe prevedere tutte le possibili condizioni, questo porta facilmente a ridondanze e dipendenze da altri oggetti non necessarie.
  • Il codice principale ha bisogno di una prima ed unica inizializzazone ed ogni funzione può gestire una differente condizione. Questo porta ad una architettura ben definita e riutilizzabile all’occorrenza.
  • L’accesso al controller utilizzato deve essere gestito tramite chiamata ad una api esterna.
  • L’accesso al controller utilizzato è riportato implicitamente in ogni funzione richiamata appartenente al modulo
  • Eventuali funzioni definite all’interno dello script non sono richiamabili da altri Script o Moduli.
  • I Moduli sono importabili da altri Script o Moduli e gli attributi definiti nel modulo richiamato sono accessibili dal chiamante.
  • Eventuali integrazioni alle logiche di gioco richiedono nuovi script. Molti script sono difficili da manutenere.
  • Eventuali integrazioni alle logiche di gioco richiedono la definizione di una nuova funzione. Molte funzioni possono essere memorizzate in pochi moduli.
  • I blocchi di testo che fanno riferimento ad un controller python di tipo Script, vengono collegati all’oggetto di gioco all’interno dei gruppi qualora l’oggetto venga richiamato in una scena esterna tramite link.
  • Un controller python di tipo Module, fa riferimento al file esterno. Qundi, nel momento in cui l’oggetto di gioco viene richiamato in una scena esterna tramite link, basta che il percorso del file ‘.py’ rimanga invariato.
  • Il codice può essere cambiato “al volo”  tramite il cambio di assegnazione di un attributo “script”. Il codice deve essere completo e funzionante
  • la funzione richiamata dal modulo può essere cambiata “al volo” tramite il cambio di assegnazione di un attributo “script”.
  • Il modulo può essere aggiornato quando il controller è in modalità debug tramite la modifica del file esterno (Per motivi di performance è consigliabile limitare questa cosa al solo debug).

Fonte da cui ho tratto questa tabella.

 

Creiamo un nuovo blocco di testo che diventerà il nostro primo script

Creazione_di_un_player_controller_parte1_img2

digitiamo il seguente comando nel blocco di testo appena creato :

print('Hello World')

il comando print permette di stampare a video le informazioni richieste, nel nostro caso la classica stringa ‘Hello World’

quindi impostiamo il controller python come da immagine

a questo punto, dal menu “Window” di blender, clicchiamo su “Toggle System Console”. Questo farà apparire una finestra di command simile al dos che blender utilizzerà per visualizzare eventuali errori oppure, come nel nostro caso, messaggi di output. Dato che blender è sprovvisto di un debugger nativo,la cosa più semplice per verificare se il nostro codice funziona a dovere è quella di mandare a video messaggi con l’avanzamento del nostro script.

 se avete seguito questi passaggi correttamente, la command dovrebbe darvi il messaggio richiesto

Arrivederci al prossimo articolo 😉