Home E-Books Effetti speciali e sviluppo giochi in Java gestire il puntatore del mouse 

Effetti speciali e sviluppo giochi in Java(TM) -Recepire l'input del puntatore del mouse 

di Anibal Wainstein (traduzione di Hanami Solutions)

5.0 Recepire l'input del puntatore del mouse

Interazione è una bella parola che indica le possibilità dell'utente di influenzare e controllare un programma. Nelle applets, questo si fa spesso tramite il puntatore del mouse. Il sistema operativo funziona come segue: quand compite le vostre operazioni col puntatore del mouse, manda un segnale alla applet Java su quello che state facendo. Per esempio, quando spostate il puntatore, clickate, trascinate un oggetto, e via dicendo. Tutti questi messaggi sono inviati solo se la freccia del puntatore si trova all'interno dello schermo della applet. Ma come funziona all'atto pratico e come sono fatti questi messaggi? In Java 1.02 si usano le seguenti funzioni per intercettare i messaggi del mouse.


mouseEnter() Viene invocato quando l'utente entra nell'area dello schermo della applet
mouseExit() Viene invocato quando l'utente esce dall'area dello schermo della applet
mouseMove() Viene invocato quando l'utente sposta il mouse
mouseDrag() Viene invocato quando l'utente clicka e contemporaneamente muove il mouse
mouseDown() Viene invocato quando l'utente clicka e preme il tasto del mouse.
mouseUp() Viene invocato quando l'utente lascia andare il tasto del mouse

 

Le funzioni summenzionate sono scritte dallo sviluppatore nella sua applet Java. Quando succede qualcosa che coinvolge il puntatore del mouse, queste funzioni sono invocate automaticamente dalla Java Virtual Machine. In queste funzioni potete scrivere qualsiasi tipo di codice vogliate. Comunque, gli argomenti e i nomi delle funzioni devono essere esattamente gli stessi di quelli sopra se vogliamo che la Java Virtual Machine li riconosca. Un Message in Java 1.02 di fatto è un oggetto speciale creato dall'engine Java e inviato alla applet. L'oggetto si basa sulla classe Event che può essere compilata con informazioni su pressoché qualsiasi cosa accada nel sistema operativo. Un evento può per esempio accadere quando clickate sul tasto del mouse, premete un tasto o rimpicciolite una finestra. ad ogni modo, in questo capitolo esaminerò solo messaggi relativi al puntatore del mouse.

5.0.1 Come fa la vostra applet a sapere quando il puntatore del mouse entra ed esce dall'area dell' applet (mouseEnter() e mouseExit())

Esistono due metodi che rilevano il movimento del puntatore del mouse entro l'area o lo schermo della applet. Questi metodi preesistono nella classe Applet ma non contengono codice. Sovrascrivendoli potete aggiungere funzioni che sono eseguite da questi eventi:

public boolean mouseEnter(Event e, int x, int y)
{
    //Qui aggiungete codice che volete che l'applet
    //esegua quando il puntatore del mouse entra nell'area dell'applet
return true; } public boolean mouseExit(Event e, int x, int y) { //Qui aggiungete codice che volete che l'applet
//esegua quando il puntatore del mouse esce dall'area dell'applet
return true; }

Entrambe le funzioni restituiscono un valore booleano. Il valore sarà sempre true se gestite l'evento nel codice. Questo non ha molta importanza nelle applets Java, ma in altri oggetti Java potrebbe essere davvero importante che la Java Virtual Machine sappia se un metodo ha gestito l'evento o no. L'oggetto Event spedito contiene le informazioni riguardo a quando l'evento è avvenuto, tra le altre cose. Le variabili sulla posizione "x" e "y" vi dicono da dove il puntatore del mouse sia entrato. Facciamo un esempio. Iniziamo con una applet con una immagine che reagisce quando il puntatore le passa sopra. Partiamo dallo scrivere il metodo init() e dichiarando le variabili:


//La variabile "currentimage" fa riferimento all'immagine 
//mostrata in questo momento
. Image currentimage; //La variabile "normalimage" fa riferimento all'immagine //mostrata quando il puntatore del mouse è fuori dallo schermo della applet Image normalimage; //La variabile "mouseoverimage" fa riferimento all'immagine //mostrata quando il puntatore del mouse è dentro lo schermo della applet Image mouseoverimage; public void init() { //Ricordiamoci sempre di usare il tracker. //Migliora l'impatto visivo dell'applet. MediaTracker tracker=new MediaTracker(this); normalimage=getImage(getDocumentBase(),"normal.jpg"); //"normalimage" sarà la prima nella //lista di caricamento del tracker. tracker.addImage(normalimage,0); mouseoverimage=getImage(getDocumentBase(),"mouseover.jpg"); tracker.addImage(mouseoverimage,1); //All'inizio, "currentimage" è impostata a "normalimage" //Più avanti in paint() "currentimage" verrà usata per tracciare //l'immagine currentimage=normalimage; //Alla fine ci assicuriamo che il tracker //carichi le immagini. try {tracker.waitForAll();} catch(InterruptedException e) { System.out.println("Qualcosa ha interrotto il caricamento delle nostre immagini..."); } } public void paint(Graphics g) { //Traccia l'immagine "attuale". g.drawImage(currentimage,0,0,this); }

Le immagini vengono caricate nel metodo init(). Esistono tre variabili di riferimento, "currentimage", "normalimage" e "mouseoverimage". La prima si riferisce all'immagine che verrà tracciata nel metodo paint(). Le altre due vengono usate per caricare e immagazzinare le due immagini che verranno mostrate. La variabile "currentimage" all'inizio farà riferimento all'immagine normale image che appare così:

L'immagine "normal.jpg" viene mostrata quando il puntatore del mouse si trova fuori dallo schermo della applet.

Questo significa che ci aspettiamo che il puntatore del mouse si trovi fuori dell'area dell'applet quando l'applet si avvia. Notate che stavolta non abbiamo scritto la parola chiave "synchronized" nel metodo paint(). Non ce n'è bisogno dato che non stiamo usando i threads. Osservate i seguenti metodi:


public boolean mouseEnter(Event e, int x, int y)
{
    //Se il puntatore del mouse entra nel campo di azione dell'applet, impostiamo
    //"currentimage" a "mouseoverimage" di modo che
    //la prossima volta paint() sia invocato, e l'immagine mouseover
    //sia tracciata al posto dell'immagine normale.
    currentimage=mouseoverimage;

    //Lo schermo non si aggiornerà da solo soltanto perché 
    //il puntatore del mouse è entrato nell'area della applet.
    //Per cui dobbiamo essere sicuri che lo faccia usando il 
    //metodo update().
    update(getGraphics());
    return true;
}

public boolean mouseExit(Event e, int x, int y)
{
    //Quando il puntatore del mouse esce ancora dall'area,
    //ripristiniamo "currentimage" così che si riferisca di nuovo
    //alla "normalimage".
    currentimage=normalimage;
    update(getGraphics());
    return true;
}

Quando il puntatore del mouse entra nell'area della applet allora il metodo mouseEnter() viene invocato e la variabile "currentimage" viene impostata per riferirsi a "mouseoverimage". Lo schermo viene aggiornato col metodo update() e viene visualizzata la seguente immagine:

L'immagine "mouseover.jpg" che viene mostrata quando il puntatore del mouse si trova dentro lo schermo della applet.

Quando il puntatore del mouse esce dallo schermo dell' applet, allora il metodo mouseExit() viene invocato e la vecchia immagine riappare. Clickate qua per vedere l'esempio. Vi starete forse chiedendo perché non usiamo double buffering nell'applet? Bene, l' "Animazione" in questo caso non ha portato ad alcuno sfarfallio nell'animazione, perciò non ce n'era davvero bisogno.

 

Pagina seguente >>