Pagina 1 di 1

[Botta & Risposta] metodo di input configurabile

Inviato: 30/10/2011, 14:13
da BaronVsCorsar
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

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;
In begin step ci andrà un codice del genere:

Codice: Seleziona tutto

{
 if (joystick == false)
  {
   scrpt_input_keyboard();   
  }
 else
  {
   scrpt_input_joystick(joystick);   
  } 
}
dove input_keyboard è il seguente script
Spoiler

Codice: Seleziona tutto

{
//game input flag variable (indipendent for keyboard & joystick)
 //0 no pressed no released
 //>0 pressing time
 //<=0 released
 //1 just pressed
 //-1 just released
 

 var i;
 
 //reading of all keyboard status
 for (i=0; i<max_key; i+=1)
  {
    //if key is pressed
    if (keyboard_check(key[i]) )
     {
      //just pressed
      if (keyboard_check_pressed(key[i]))
       {input[i]= 1;}
      else //pressed for more than a step
       {input[i]+= 1;}
     }
    else //key not pressed
     {
      //just released
      if (keyboard_check_released(key[i]))
       {input[i]= -1;}
      else //
       {input[i]= 0;}
     }   
  } //end for


}
e input joystick è questo
Spoiler

Codice: Seleziona tutto

{
//argument[0] joystuck input
//game input flag variable (indipendent for keyboard & joystick)
 //0 no pressed no released
 //>0 pressing
 //<=0 released
 //1 just pressed
 //-1 just released
 
 var joy_id,i; 
 
 joy_id= argument[0];
 
 //key press 
 if ( (joystick_direction(joy_id)==vk_numpad1 ) || 
      (joystick_direction(joy_id)==vk_numpad4 ) ||
      (joystick_direction(joy_id)==vk_numpad7 ) )
  {
   if (input[left]>=1)
    {input[left]+= 1;}
   else
    {input[left]= 1;}
  }
 else //key not pressed
  {
   if (input[left] > 0)
    {input[left]= -1;}
   else
    {input[left]= 0;}
  } 
  
 //key press 
 if ( (joystick_direction(joy_id)==vk_numpad3 ) || 
      (joystick_direction(joy_id)==vk_numpad6 ) ||
      (joystick_direction(joy_id)==vk_numpad9 ) )
  {
   if (input[right]>=1)
    {input[right]+= 1;}
   else
    {input[right]= 1;}
  }
 else //key not pressed
  {
   if (input[right] > 0)
    {input[right]= -1;}
   else
    {input[right]= 0;}
  } 
 
 //key press 
 if ( (joystick_direction(joy_id)==vk_numpad7 ) || 
      (joystick_direction(joy_id)==vk_numpad8 ) ||
      (joystick_direction(joy_id)==vk_numpad9 ) )
  {
   if (input[up]>=1)
    {input[up]+= 1;}
   else
    {input[up]= 1;}
  }
 else //key not pressed
  {
   if (input[up] > 0)
    {input[up]= -1;}
   else
    {input[up]= 0;}
  } 

 //key press 
 if ( (joystick_direction(joy_id)==vk_numpad1 ) || 
      (joystick_direction(joy_id)==vk_numpad2 ) ||
      (joystick_direction(joy_id)==vk_numpad3 ) )
  {
   if (input[down]>=1)
    {input[down]+= 1;}
   else
    {input[down]= 1;}
  }
 else //key not pressed
  {
   if (input[down] > 0)
    {input[down]= -1;}
   else
    {input[down]= 0;}
  }     


 
 //reading of all joystick button status
 for (i=4; i<max_key; i+=1)
  {
   if (joystick_check_button(joy_id,i) )
    {
     if (input[i] >=1)
      {input[i]+= 1;}
     else
      {input[i]= 1;}
    }
   else //key not pressed
    {
     if (input[i]> 0)
      {input[i]= -1;}
     else
      {input[i]= 0;}
    }
  } //end for


}
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;
}
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
== -1) //se ho rilasciato il pulsante "destra"

Se non è chiaro chiedete pure. :salut:

Re: [Botta & Risposta] metodo di input configurabile

Inviato: 31/10/2011, 11:05
da BaronVsCorsar
non mi sembra c'entri molto...
:| i file punto ini li utilizzerai per inizializzare le variabili global.key[].

Questi script permettono l'uso indiscriminato di qualsiasi configurazione di tasti (compreso il joystick che non ha l'equivalente di keypressed e released) senza modificare il codice di gestione dell'input. Sono script di raccolta di input.

Re: [Botta & Risposta] metodo di input configurabile

Inviato: 31/10/2011, 12:19
da guidox
L' idea è buona, velocizza molto, soprattutto quando devi gestire la pressione di più tasti in contemporanea...
Potrebbe tornarmi utile. :P

Re: [Botta & Risposta] metodo di input configurabile

Inviato: 26/10/2015, 19:28
da rasteryx
scusate

Re: [Botta & Risposta] metodo di input configurabile

Inviato: 26/10/2015, 21:38
da Solid Snake
rasteryx ha scritto:ora però mi da errore che non riconosce le variabili globali,sconsciuta variabile left
BaronVsCorsar ha scritto: Consiglio anche la definizione di alcune costanti che semplifichino la lettura del codice (es: left == 0, down == 1 ecc... ecc...)