L'engine è per lo più una versione semplificata di un engine fisico. Al che qualcuno potrebbe dire "scusa ma non sapevi usare il Box2D di studio?" e io risponderei a quel qualcuno di starsene zitto
. Anyway, seriamente parlando, semplicemente volevo qualcosa che permettesse di fare giochi stile Super Mario che però si potessero permettere cose tipo rampe ed altro in stile Sonic senza dover fare troppe puttanate con l'engine fisico predefinito di Studio.
Le variabili con cui funzionano gli oggetti del gioco sono le seguenti (il player ne ha altre che regolano il movimento eccetera, ma è una parte che devo rendere ancora modulabile ed è per ora hard coded). Queste variabili possono essere settate a mano oppure utilizzare lo script ph_init_standard() che le setta esattamente come riportate sotto, ed è quindi possibile poi settare a mano quelle necessarie, oppure farsi uno script personalizzato.
Disclaimer: non ho mai utilizzato il sistema fisico integrato in GM, pertanto ogni singola scelta fatta nel mio engine è stata dettata solo da ciò che sembrava più o meno giusto\da infinito testing, pertanto se ci sono cose che sarebbe sicuramente meglio fare utilizzando un approccio simile a quello di GM non esistate a farmelo notare. Ricordate comunque che una simulazione '''perfetta''' (virgolette sono d'obbligo) della fisica è comunque niente affatto il mio obiettivo.
Inoltre non tutto ciò che ho scritto potrebbe avere senso.
is_solid = true;
Indica se l'oggetto è solido o no. L'engine regola solo collisioni fra solido-solido, dato che la collisione fra oggetto solido - non solido o non solido - non solido la si può semplicemente lasciare al sistema predefinito di Game Maker.
weight_class = 0;
E' una variabile che serve per regolare i "pesi" degli oggetti. Piuttosto che fare un sistema di peso fisso ho deciso di farne uno relativo ( a torto? Chissà
), dove non è importante il valore della variabile in se (che può essere 10000 o 1) ma la differenza fra le weight_class degli oggetti che stanno collidendo. Nella demo è possibile premere SHIFT e vedere come la palla diventa più leggera.
collide_behavior = 0;
E' una variabile che contiene lo script da eseguire quando avviene una collisione, pertanto lo script è diviso in due parti: una che valuta il caso in cui l'istanza sia quella che urta, e un'altra che valuta quello in cui essa sia stata urtata. Almeno in teoria, questa parte non è ancora del tutto finita. Pensavo inoltre di fare in modo che le istanze possano utilizzare diversi behavior in diverse sitauzioni.
grav = 0;
Gravità.
grav_limit = 0;
Limite massimo a cui la gravità può portare
vsp = 0;
hsp = 0;
Velocità orizzonale e verticale.
vfrict = 0;
hfrict = 0;
Frizione verticale\orizzontale.
flexibility = 0;
Ogni forza applicata a un oggetto viene moltiplicata per questo valore. Pertanto, oggetti con flexibility di 0 sono impassibili agli urti, mentre quelli con il valore settato ad 1 "rimbalzano" perfettamente.
maxslope_horizontal=0;
maxslope_vertical=0;
Queste due variabili sono quelle di base utilizzate dal check di ph_slope(). Semplicemente, indicano l'altezza\larghezza massima (in pixel) del dislivello attraversabile dall'istanza.
slope_hfrict_value=0;
slope_vfrict_value=0;
Un valore aggiuntivo di frizione (oltre a quella normale) che viene usato solo quando si è sulle slope.
slope_roll_threshold = 0;
Valore minimo della velocità verticale per rotolare. Utilizzato principalmente per personaggi e\o nemici che ovviamente non dovrebbero rotolare giù per colline o altro.
slope_conv_hvalue = 1;
slope_conv_vvalue = 1;
Valori principali della "conversione". Praticamente, ogni qualvolta un oggetto sale su una rampa, perde un tot di velocità nella direzione originale e ne acquista nella direzione della rampa (per esempio in una rampa normale, l'istanza perde velocità orizzontale e ne guadagna di verticale, quindi se è sufficientemente veloce si fa un bel voletto). La quantità finale da convertire è uguale a valore*velocità, quindi con un conv value di 1 vuol dire che tutta la velocità viene convertita. Nella demo anche con 0.20 si fanno dei bei voletti.
slope_conv_hratio = 1;
slope_conv_vratio = 1;
Indica quanta della velocità originale viene persa. I valori normali (e logici) sono 1 ed 1, cioé la quantità guadagnata è uguale a quella persa.
Con l'esempio della rampa di prima, con un ratio di 1, l'istanza perde X velocità orizzontale e guadagna X velocità verticale, mentre se il valore fosse 2 acquisterebbe X velocità verticale ma perderebbe 2X velocità orizzontale.
slope_conv_hminimum=0;
slope_conv_vminimum=0;
Valori minimi della conversione. Ciò vuol dire che la conversione in sé non avverrà se la velocità da convertire non è maggiore di queste variabili. Nella demo, il valore minimo della conv_hminimum è per esempio 2, dato che la velocità massima di camminata è 10px/s. Dato che il valore da convertire è hsp*conv_hvalue, quindi 10*0.20, si impedisce che anche a velocità massima si abbia quell'effetto a "saltelli" che si avrebbe altrimenti.
slope_conv_maximum=0;
Massimo valore della conversione. A differenza delle conv minimum viste prima, se il valore della conversione è maggiore al massimo la conversione avverrà lo stesso, ma cappata.