26. Gestire la Tastiera

In questa lezione vedremo brevemente gli eventi che ActionScript 3 ci mette a disposizione per leggere i tasti premuti dall'utente nel Flash Player.

Innanzitutto è necessario sapere che il sistema operativo (Windows, Linux ...) e il browser (Firefox, Internet Explorer ...) catturano la pressione del tasto prima che questo possa essere letto dal Flash Player.
Questo significa che se premiamo la combinazione di tasti ALT+F4 sotto Windows, il browser verrà chiuso prima che la nostra applicazione possa gestire la pressione dei suddetti tasti.

Per costruire la nostra applicazione ci serviremo principalmente di due classi :

  • Keyboard - La funzione principale di questa classe è quella di contenere una lista dei tasti disponibili attraverso un elenco di costanti statiche. Mette a disposizione anche due proprietà statiche booleane che ci consentono di verificare se i tasti "caps lock" e "bloc num" sono attivati.
  • KeyboardEvent - Ci fornisce gli strumenti per definire gli eventi da gestire e la pressione di eventuali combinazioni di tasti.
    Non è necessaria ma ve ne consiglio l'uso, creando così un codice più leggibile e robusto.

Il codice che segue servirà per creare un'applicazione con un campo di testo. Quest ultimo avrà lo scopo di mostrare i vari codici dei campi premuti dall'utente, e potrà inoltre essere spostato in 4 direzioni attraverso le frecce della tastiera.

HelloWorld.as

package
{
	import flash.text.TextField;
	import flash.text.TextFormat;
	import flash.text.TextFormatAlign;

	import flash.display.MovieClip;

	import flash.ui.Keyboard;
	import flash.events.KeyboardEvent;

	public class HelloWorld extends MovieClip
	{
		private var tasto:TextField;
		private var format:TextFormat;

		public function HelloWorld():void
		{
			// - Inizio configurazione campo di testo -
			this.format = new TextFormat("Verdana", 10, 0x000000);
			this.format.align = TextFormatAlign.CENTER;

			this.tasto = new TextField();
			this.tasto.width = 150;
			this.tasto.height = 16;
			this.tasto.border = true;
			this.tasto.defaultTextFormat = this.format;
			// - Fine configurazione campo di testo -

			this.addChild(this.tasto);

			stage.addEventListener(KeyboardEvent.KEY_DOWN, this.vediTasto);
		}

		private function vediTasto(evt:KeyboardEvent):void
		{
			this.tasto.text = evt.charCode.toString();
			this.tasto.appendText(" - " + evt.keyCode.toString());
			this.tasto.appendText(" - " + evt.keyLocation.toString());

			switch (evt.keyCode)
			{
				case Keyboard.UP : this.tasto.y--; break;
				case Keyboard.RIGHT : this.tasto.x++; break;
				case Keyboard.LEFT : this.tasto.x--; break;
				case Keyboard.DOWN : this.tasto.y++; break;
			}
		}
	}
}

Nell'esempio soprastante ho volutamente usato allo stesso tempo le seguenti tre proprietà :

  • charCode - Contiene il codice del carattere del tasto premuto.
  • keyCode - Indica il codice del tasto premuto.
  • keyLocation - Contiene la posizione del tasto, utile per distinguere ad esempio il MAIUSC di sinistra da quello di destra.

Se avessi usato solo la proprietà charCode, non avrei potuto fare distinzione fra il tasto "1" in alto a sinistra e quello del tastierino numerico a destra, in quanto entrambi producono il codice di carattere 49.

Vi invito a fare delle prove per capire meglio il funzionamento, provando ad esempio a digitare il carattere "!" che nella tastiera italiana si trova nel tasto "1", poi il carattere "1" senza MAIUSC premuto e infine "1" del tastierino numerico.

  • 1 => 49 - 49 - 0
  • 1 (numpad) => 49 - 97 - 3
  • ! (1 + MAIUSC) => 33 - 49 - 0

Nota : Sia "1" che "!" hanno lo stesso keyCode (49) in quanto risiedono sullo stesso tasto, ma rilasciano un charCode differente producendo in effetti due caratteri diversi.