[Botta & Risposta] metodo di input configurabile
Inviato: 30/10/2011, 14:13
volevo scrivere "metodo universale", ma è eccessivo. comunque con pochi script potete davvero avere una gestione pressochè libera dell'input, e facilmente riconfigurabile. Sia per tastiera sia per il joystick (modalità digitale)
il vostro oggetto deve avere delle variabili key[] contenenti i codici dei tasti selezionati.
In variabili di nome input[] (elementi corrispondenti) avremo lo stato del bottone.
Consiglio anche la definizione di alcune costanti che semplifichino la lettura del codice (es: left == 0, down == 1 ecc... ecc...)
E' indispensabile per l'uso di questi scritp la costante max_key che corrisponde al numero totale di tasti utilizzati (sempre 4 per le direzioni, nell'esmpio sotto 1 per l'azione, per un totale di max_key == 5).
Questo significa anche che l'indice valido degli array key e input deve andare da 0 a max_key-1
Per l'intercambiabilità tastiera-joystik è importante che i pulsanti per le quattro direzioni siano definiti come i primi quattro key (e quindi i primi quattro input).
Poi è opportuno utilizzare una varibile che memorizzi la scelta "tastiera" (zero) oppure joystick (1 o 2, l'identificativo del joystick corrispondente.
Se si sta utilizzando il joystick i primi valori di key non sono considerati (non permette la rimappatura delle direzioni del joystick, mente i successivi pulsanti sono configurabili (e devono contenere il numero del pulsante del joystick).
Es:
Create event
In begin step ci andrà un codice del genere:
dove input_keyboard è il seguente script
I codici sono molto semplici e come vedete in funzione dei valori di input[] potete capire in che stato è il pulsante:
0 : tasto non premuto (e non rilasciato in questo step)
1 : tasto premuto in questo setp (keypressed)
>1 : numero di step per cui il tasto è stato premuto
-1 : tasto appena rilasciato (keyreleased)
Volendo si potrebbe conteggiare il numero di step da cui il tasto è stato rilasciato (basta cambiare un if dove si assegna il valore zero con il decremento di 1), ma non avendone mai avuto bisogno non l'ho fatto (magari per una combo dove è importante la tempistica di pressione... boh...)
Cambiando i valori delle variabili key e joystick potete cambiare la mappatura dei tasti senza nessuna difficoltà, pure runtime.
Ovviamente tutto il codice del vostro oggetto deve leggere il valore delle variabili input e non dovete utilizzare eventi tipo "keypressed" o cose del geenre, altrimenti perdete la vostra rimappabilità.
Naturalmente a completare l'esmpio del codice di create vi servirà pure un obj_controller con qualche cosa tipo:
e le costanti left, down, right, up (0, 1, 2, 3) e action (4). Non servono, ma il vostro codice diventa ben migliore:
if (input[3] == -1) //boh?
rispetto
if (input
il vostro oggetto deve avere delle variabili key[] contenenti i codici dei tasti selezionati.
In variabili di nome input[] (elementi corrispondenti) avremo lo stato del bottone.
Consiglio anche la definizione di alcune costanti che semplifichino la lettura del codice (es: left == 0, down == 1 ecc... ecc...)
E' indispensabile per l'uso di questi scritp la costante max_key che corrisponde al numero totale di tasti utilizzati (sempre 4 per le direzioni, nell'esmpio sotto 1 per l'azione, per un totale di max_key == 5).
Questo significa anche che l'indice valido degli array key e input deve andare da 0 a max_key-1
Per l'intercambiabilità tastiera-joystik è importante che i pulsanti per le quattro direzioni siano definiti come i primi quattro key (e quindi i primi quattro input).
Poi è opportuno utilizzare una varibile che memorizzi la scelta "tastiera" (zero) oppure joystick (1 o 2, l'identificativo del joystick corrispondente.
Se si sta utilizzando il joystick i primi valori di key non sono considerati (non permette la rimappatura delle direzioni del joystick, mente i successivi pulsanti sono configurabili (e devono contenere il numero del pulsante del joystick).
Es:
Create event
Codice: Seleziona tutto
//mapping keys
key[left]= global.key[left];
key[down]= global.key[down];
key[right]= global.key[right];
key[up]= global.key[up];
key[action]= global.key[action];
//input status (indipendent from keyboard or joystick)
input[left]= 0;
input[down]= 0;
input[right]= 0;
input[up]= 0;
input[action]= 0;
//joystick input (0 no joystick, >0 joystick index
joystick= global.input_selected;
Codice: Seleziona tutto
{
if (joystick == false)
{
scrpt_input_keyboard();
}
else
{
scrpt_input_joystick(joystick);
}
}
Spoiler
e input joystick è questo
Spoiler
notate che le diagonali le gestisco con lo stato di due pulsanti, perchè in genere per la tastiera è scomodo usare 8 pulsanti direzione.
I codici sono molto semplici e come vedete in funzione dei valori di input[] potete capire in che stato è il pulsante:
0 : tasto non premuto (e non rilasciato in questo step)
1 : tasto premuto in questo setp (keypressed)
>1 : numero di step per cui il tasto è stato premuto
-1 : tasto appena rilasciato (keyreleased)
Volendo si potrebbe conteggiare il numero di step da cui il tasto è stato rilasciato (basta cambiare un if dove si assegna il valore zero con il decremento di 1), ma non avendone mai avuto bisogno non l'ho fatto (magari per una combo dove è importante la tempistica di pressione... boh...)
Cambiando i valori delle variabili key e joystick potete cambiare la mappatura dei tasti senza nessuna difficoltà, pure runtime.
Ovviamente tutto il codice del vostro oggetto deve leggere il valore delle variabili input e non dovete utilizzare eventi tipo "keypressed" o cose del geenre, altrimenti perdete la vostra rimappabilità.
Naturalmente a completare l'esmpio del codice di create vi servirà pure un obj_controller con qualche cosa tipo:
Codice: Seleziona tutto
{
global.key[left]= vk_left;
global.key[down]= vk_down;
global.key[right]= vk_right;
global.key[up]= vk_up;
global.key[action]= vk_space;
global.input_selected= 0;
}
if (input[3] == -1) //boh?
rispetto
if (input
== -1) //se ho rilasciato il pulsante "destra"
Se non è chiaro chiedete pure.
Se non è chiaro chiedete pure.