Ujemimo dogodke z miško


Metode

Kaj vrača

Ime metode

Opis

boolean

getMouseEvent()

Vrne true, če je prišlo do mišjega dogodka (pritisk ali spust mišjega gumba, premik z miško, vlečenje z miško)

int

getMouseX()

Vrne položaj x lmiške  (potem, ko getMouseEvent() vrne true)

int

getMouseY()

Vrne položaj y lmiške  (potem, ko getMouseEvent() vrne true)

boolean

getMouseButton(int buttonNumber)

Vrne true, če je mišji gumb pritisnjen (potem, ko getMouseEvent() vrne true)

Premiki miške  

Premik miške ujamemo z metodo getMouseEvent( ) . Ta metoda vrne true, če se miška premika.
Nato ugotovimo položaj koordinate x z metodo  getMouseX( )
Končno ugotovimo položaj koordinate y z metodo getMouseY( )

Sestavimo algoritem za prvi del naloge...

 
        // iniciacija spremenljivk
        // zacnemo neskoncno zanko
        // preverimo, ali je prislo do misjega dogodka
        // ugotovimo lokacijo miske
        // izpisemo lokacijo miske
        // Ponovimo neskoncno zanko
 

Začinimo ta algoritem s koščkom kode


// iniciacija spremenljivk
        int mx = 0;
        int my = 0;
 
        while(true)
        {
           // preverimo, ali je prislo do misjega dogodka
           if(getMouseEvent())
           {
              // ugotovimo lokacijo miske
              mx = getMouseX();
              my = getMouseY();
              // izpisemo lokacijo miske
              printLine("x= "+ mx + "y = "+ my);
           }
           //Ponovimo neskoncno zanko
        }
  

Odlicno! Ali opaziš vsa ta števila, ki tečejo  na dnu tekstovnega polja?

To so izpisi položajev miške.

Sedaj bi radi narisali krog, ki bo sledil premikom miške.. Namesto izpisovanja lokacij  mouseX in mouseY bomo ta števila uporabljali za risanje kroga na mišjem položaju x,y...

Zato spremenimo vrstico "printline("x = ..... itd.)  v

        setColor(red);
        fillCircle(mx,my, 20);

Kaj se zgodi ?... Ali nismo želeli narisati le ene rdeče žoge ..?
Dobro, Okno moramo brisati in nastaviti zakasnitev njegovega osveževanja. Spomnimo se prejšnje lekcije, ko smo se učili prvih korakov animacije. Tu je ista zgodba..

Torej dodajmo..

        delay(0.10);
        clearDrawing();
        

Aha, deluje.. Vendar moramo še nekaj popraviti... Mišji kazalec kaže zgoraj levo od rdeče žoge. Želimo pa, da kaže na njeno središče.
Torej moramo nekaj odšteti, toda kaj?
Polmer rdeče krogle od njenih x in y koordinat.

Zato spremenimo kodo fillCircle( ) :


       fillCircle(mx-10, my-10, 20);
        

In tu je popoln program:

 
void main() {
        // iniciacija spremenljivk
        int mx = 0;
        int my = 0;
       // zacnemo neskoncno zanko
        while(true)
        {
           // preverimo, ali je prislo do misjega dogodka
           if(getMouseEvent())
        {
             // ugotovimo lokacijo miske
        mx = getMouseX();
        my = getMouseY();
        // narisemo krog na polozaju miske
        setColor(red);
        fillCircle(mx-10, my-10, 20);
        // animacijo zakasnimo in brisemo okno
        delay(0.10);
        clearDrawing();
        // Ponovimo neskoncno zanko
        }
}
  

No, kako je šlo? Še je nekaj problemov. Animacija je skokovita. In ko miške ne premikamo, se žoga ne izriše. Za vajo odpravi te proleme.

Klik z mišjim gumbom

Za lovljenje klikov z miško uporabljamo getMouseButton(int stevilkaGumba) . Metoda vrne true če smo kliknili na gumb z ustrezno številko.


Poskusimo!
 
void main() {
        int mx = 0 ;
        int my = 0 ;
        // zacetek neskoncne zanke
        while(true)
        {
           if(getMouseEvent())
           {
               // ugotovimo polozaj miske
               mx = getMouseX();
               my = getMouseY();
               // preverimo, ce je bil klik na levi gumb
               if(getMouseButton(1))
               {
                  printLine("Klik na levi gumb, mis na polozaju " + mx + " " + my);
               }
               // preverimo, ce je bil klik na levi gumb
               if(getMouseButton(3))
               {
                  printLine("Klik na desni gumb, mis na polozaju " + mx + " " + my);
               }
 
            }
        }
}
  

Pravilno! Sedaj poglejmo, če bi lahko naša rdeča žoga bila branilec v igri, ko nas napadajo vesoljčki. Žogo naj bi s pomočjo miške premikali naprej in nazaj vzdolž spodnjega roba okna, 

Najprej sestavimo algoritem..

 
        // inicijacija spremenljivk za polozaj miske
        // zacnemo zanko
        // preverimo, ali je prislo do premika miske ali klika
        // premik zoge v skladu z misko
        // konec zanke
  

Prepiši algoritem v urejevalnik JUDO in ga dopolni s kodo.. Preskusi program... Kaj si dobil ? Kaj temu podobnega..?

 
void main() {
        // inicijacija spremenljivk za polozaj miske
        int mx = 0 ;
        int my = 0 ;
        // zacnemo zanko
        while(true) {
        // preverimo, ali je prislo do premika miske ali klika
        if(getMouseEvent())
        {
           mx = getMouseX();
           my = getMouseY();
           // premik zoge v skladu z misko
           setColor(red);
           fillCircle(mx-10, getDrawingHeight()-20, 20);
           delay(0.025);
           clearDrawing();
        }
        // konec zanke
        }
}
  

Sedaj želimo, da bi branilec streljal krogle ali rakete.  In izstrelek naj bi poletel iz trenutnega položaja branilca, ko kliknemo na levi gumb.
Tako potrebujemo še dve spremenljivki in jih imenujmo clickX in clickY ....in potrebujemo še , za koliko se izdelek premakne, ko se zanka enkrat ponovi ..
Ne pozabi na zakasnitev v skladu s pričakovanim številom sličic na sekundo.

Pa napišimo nekaj kode za poizkus..

 
void main()
{
        int mx = 0;
        int my = 0;
        int clickx = 0 ;
        int clicky = getDrawingHeight() - 20;
        int speed = 5 ;   // 5 pixels per 0.025 seconds
        boolean clicked = false;
        // infinite loop
        while(true){
               if(getMouseEvent())    // check mouse event
               {
                       mx = getMouseX();
                       my = getMouseY();
                       setColor(red);
        fillCircle(mx-10, getDrawingHeight()-20, 20);
                       if(getMouseButton(1))  // left clik
                       {
                               clicked = true;
                               clickx = getMouseX();
 
                       }
               }
               if(clicked){                   // set when left click
                       setColor(green);
                       fillCircle(clickx, clicky,10);
               if(clicky > 0 )
               {clicky = clicky - speed;}
               else {clicked = false;
                               clicky=getDrawingHeight();}
                       delay(0.025);
                       clearDrawing();
               }
        }
}
  

No, nekaj že dobimo, vendar je še precej problemov.  Rdeča žoga se izbriše le, ko kliknemo na gumb. Vsakokrat imamo le en izstrelek. Položaj clickX se spreminja, če miško vlečemo od leve na desno. Poskusi te probleme rešiti. .

Kasneje bomo načrtovali pravo igrico z vesoljčki , še prej pa se bomo naučili uporabljati pravi  javanski prevajalnik.