[Botta & Risposta] metodo di input configurabile

Tutorial, videotutorials ed esempi creati da noi
Rispondi
Avatar utente
BaronVsCorsar
GMI VIP
Messaggi: 4699
Iscritto il: 14/02/2004, 12:05
Specialità: Saccenza
Uso: GameMaker 8.1
Località: Ferrara
Contatta:

[Botta & Risposta] metodo di input configurabile

Messaggio 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:
ImmagineSchiva questo - http:\\baronvscorsar.altervista.org
by Lego: Vado in un bar e faccio "votiamo che quel tizio la in fondo venga buttato fuori", ma perché?

Avatar utente
BaronVsCorsar
GMI VIP
Messaggi: 4699
Iscritto il: 14/02/2004, 12:05
Specialità: Saccenza
Uso: GameMaker 8.1
Località: Ferrara
Contatta:

Re: [Botta & Risposta] metodo di input configurabile

Messaggio 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.
ImmagineSchiva questo - http:\\baronvscorsar.altervista.org
by Lego: Vado in un bar e faccio "votiamo che quel tizio la in fondo venga buttato fuori", ma perché?

Avatar utente
guidox
GMI Honor
Messaggi: 5765
Iscritto il: 26/07/2009, 17:23
Specialità: programmazione
Uso: GM:Studio 1.4 Android
Località: Marche
Contatta:

Re: [Botta & Risposta] metodo di input configurabile

Messaggio da guidox »

L' idea è buona, velocizza molto, soprattutto quando devi gestire la pressione di più tasti in contemporanea...
Potrebbe tornarmi utile. :P
Immagine

Immagine

rasteryx
Membro
Messaggi: 56
Iscritto il: 27/04/2012, 10:24
Specialità: grafico
Uso: GM:Studio 1.4 Standard

Re: [Botta & Risposta] metodo di input configurabile

Messaggio da rasteryx »

scusate
Ultima modifica di rasteryx il 27/10/2015, 22:40, modificato 1 volta in totale.

Solid Snake
GMI Advanced
Messaggi: 2093
Iscritto il: 19/12/2010, 16:17
Specialità: Programmazione
Uso: GM:Studio 1.4 Standard
Contatta:

Re: [Botta & Risposta] metodo di input configurabile

Messaggio 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...)
♥♥♥♥♥♥
Immagine
♥♥♥♥♥♥
Spoiler
Immagine

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti