Avatar billede brian8 Nybegynder
04. december 2003 - 23:01 Der er 10 kommentarer og
3 løsninger

Min KeysListener klasse skal lytte på en Frame?

Jeg har lavet følgende klasse:

import java.awt.*;

public class KeysListener {

    private boolean playerMoveLeft = true;
    private boolean playerMoveRight = false;
    private boolean playerMoveUp = false;
    private boolean playerMoveDown = true;


//************************************************************************
// Metoder der aktiveres når man aktivere keyboardet
//************************************************************************

    public boolean keyUp(Event e, int key){
        if(key == Event.LEFT){
                playerMoveLeft = false;
        }
            else if(key == Event.RIGHT){
                playerMoveRight = false;
        }

            else if(key == Event.UP){
                playerMoveUp = false;
        }

            else if(key == Event.DOWN){
                playerMoveDown = false;
        }
            return true;
    }

    public boolean keyDown(Event e, int key){
        if(key == Event.LEFT){
            playerMoveLeft = true;
        }
        else if(key == Event.RIGHT){
            playerMoveRight = true;
        }
        else if(key == Event.UP){
            playerMoveUp = true;
        }

        else if(key == Event.DOWN){
            playerMoveDown = true;
        }

        else if(key == 32){
            for(int i=0; i<Lane.shotsArray.length; i++){
                if(Lane.shotsArray[i] == null){
                    //play sound                    Lane.shotsArray[i] = Lane.spaceship.generateShot();

                    break;
                }
            }
        }

        return true;
    }
}

Hvordan kan jeg få den til at lytte på min klasse GuiSpil. Det skal være sådan at når jeg aktivere tasterne skal metoderne keyUp() og keyDown() aktiveres. Men set skal ske når jeg spiller spillet, altså når GuiSpil er aktiveret (fremme på skærmen)
Avatar billede mikkelbm Nybegynder
05. december 2003 - 00:41 #1
jeg ved ikke om jeg er 100% med på problemstillingen, men hvis du vil ha' en klasse til at lytte til dine keyEvents skal du implementere interfacet KeyListener.
Og i din konstruktor skal du add'e den til din klasse

..

public class DinFrame implements KeyListener
{
  public KeysListener()
  {
      addKeyListener(this);
  }
  // og så metoderne
  public void keyTyped(KeyEvent e){}
  public void keyPressed(KeyEvent e){}
  public void keyReleased(KeyEvent e){}
}

Eller hvad er det du leder efter?
Avatar billede mikkelbm Nybegynder
05. december 2003 - 00:44 #2
og sådan her kunne din keyPressed se ud:

public void keyPressed(KeyEvent e)
{
  if(e.getKeyCode() == KeyEvent.VK_LEFT)
  {
  }
  else if(e.getKeyCode() == KeyEvent.VK_RIGHT)
  {
  }
  else if(e.getKeyCode() == KeyEvent.VK_UP)
  {
  }
  else if(e.getKeyCode() == KeyEvent.VK_DOWN)
  {
  }
}
Avatar billede trolle Nybegynder
05. december 2003 - 00:48 #3
Du kan faa din KeysListener klasse til at lytte til din frame ved at implementere java.awt.event.KeyListener;

import java.awt.event.KeyListener;
public class KeysListener implements KeyListener{

    private boolean playerMoveLeft = true;
    private boolean playerMoveRight = false;
    private boolean playerMoveUp = false;
    private boolean playerMoveDown = true;

  public void keyTyped(KeyEvent e){}
  public void keyPressed(KeyEvent e){
    if(e.getKeyCode()==KeyEvent.VK_UP){
      playerMoveUp = true;
    }else if(e.getKeyCode()==KeyEvent.VK_DOWN){
      playerMoveDown = true;
    }else if(e.getKeyCode()==KeyEvent.VK_LEFT){
      playerMoveLeft = true;
    }else if(e.getKeyCode()==KeyEvent.VK_RIGHT){
      playerMoveRight = true;
    }
  }
 
  public void keyReleased(KeyEvent e){
    if(e.getKeyCode()==KeyEvent.VK_UP){
      playerMoveUp = false;
    }else if(e.getKeyCode()==KeyEvent.VK_DOWN){
      playerMoveDown = false;
    }else if(e.getKeyCode()==KeyEvent.VK_LEFT){
      playerMoveLeft = false;
    }else if(e.getKeyCode()==KeyEvent.VK_RIGHT){
      playerMoveRight = false;
    }
  }
}


og saette den til at lytte til din frame ved noget lign. foelgende kode:  (jeg gaar ud fra at GuiSpil extends JFrame eller noget i den stil...)

KeysListener k = new KeysListener();
GuiSpil gui = new GuiSpil();
gui.addKeyListener(k);

og din keysLitener faar nu sine metoder kaldt ved brug af taste tryk i dit vindue...
Avatar billede trolle Nybegynder
05. december 2003 - 00:49 #4
heh... jeg elsker at sidde at skrive kode og saa vaere 4 min. for sent ;)
Avatar billede mikkelbm Nybegynder
05. december 2003 - 00:55 #5
ja, det er altid sjovt :)

der er forresten sneget sig en lille fejl i mit indlæg tidligere

public KeysListener()
{
    addKeyListener(this);
}

skal være

public DinFrame()
{
  addKeyListener(this);
}

eller også skal klassenavnet laves om til KeysListner :)
Avatar billede repsak Nybegynder
05. december 2003 - 09:54 #6
Måske lidt inpirration:
(bruges med: frame.addKeyListener(new Listener());


import java.awt.event.*;

public class Listener extends KeyAdapter{
    private final int LEFT = 0;
    private final int RIGHT = 1;
    private final int UP = 2;
    private final int DOWN = 3;
    private final int SPACE = 4;

    private boolean keysdown[];

    public Listener(){
        keysdown = new boolean[]{false, false, false, false, false};
    }

    public void keyPressed(KeyEvent evt){
        int key = evt.getKeyCode();
        switch(key)
        {
            case 37: keysdown[LEFT] = true;
                    break;
            case 39: keysdown[RIGHT] = true;
                    break;
            case 38: keysdown[UP] = true;
                    break;
            case 40: keysdown[DOWN] = true;
                    break;
            case 32: keysdown[SPACE] = true;
                    break;
        }

        if((keysdown[LEFT] && keysdown[RIGHT]) || (keysdown[UP] && keysdown[DOWN]))
            return;

        if(keysdown[LEFT])
            left();
        if(keysdown[RIGHT])
            right();
        if(keysdown[UP])
            up();
        if(keysdown[DOWN])
            down();
        if(keysdown[SPACE])
            space();
    }

    public void keyReleased(KeyEvent evt){
        int key = evt.getKeyCode();
        switch(key)
        {
            case 37: keysdown[LEFT] = false;
                    break;
            case 39: keysdown[RIGHT] = false;
                    break;
            case 38: keysdown[UP] = false;
                    break;
            case 40: keysdown[DOWN] = false;
                    break;
            case 32: keysdown[SPACE] = false;
                    break;
        }
    }

    void left(){
    }

    void right(){
    }

    void up(){
    }

    void down(){
    }

    void space(){
    }
}
Avatar billede repsak Nybegynder
05. december 2003 - 09:57 #7
Ok, man kan godt skifte de der tal (32,37,38,39,40) ved med konstanter som jeg kan se nogle har gjort :-) Det er jo nok lidt mere læsevenligt
Avatar billede brian8 Nybegynder
05. december 2003 - 11:34 #8
trolle: du var bestemt ikke 4 min. for sent på den for du ramte lige det som jeg skulle bruge og det var
KeysListener k = new KeysListener();
GuiSpil gui = new GuiSpil();
gui.addKeyListener(k);
Men jeg har modtaget nogle gode fra fra jeg alle så i får da alle point. Dog skal trolle have de 50 og de resterende 25, håber at det er ok :)
Men mikkelbm du skal lige svare i stedet for kommentar for ellers kan jeg ikke give dig point :)
Avatar billede mikkelbm Nybegynder
05. december 2003 - 11:36 #9
jeg lagde en kommentar fordi jeg ikke vidste om det var det du søgte.
Men da det var det, så
Svar!
:)
Avatar billede repsak Nybegynder
08. december 2003 - 22:47 #10
? :-)
Avatar billede mikkelbm Nybegynder
13. december 2003 - 10:36 #11
Er det ved at være lukketid ???? :)
Avatar billede mikkelbm Nybegynder
12. januar 2004 - 01:40 #12
???
Avatar billede mikkelbm Nybegynder
24. februar 2004 - 15:57 #13
?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester