tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von Der Wolf
  • 1 Beitrag von Matt297
ERLEDIGT
NEIN
ANTWORTEN
3
ZUGRIFFE
561
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    MrCastle MrCastle ist offline Mitglied Bronze
    Registriert seit
    Aug 2009
    Beiträge
    32
    Hi Community,

    mal wieder eine Frage zu Java, dieses Mal zwecks Mausereignisbehandlung. Ich versuche mich gerade an einem Spiel mit JOGL und möchte nun Mausereignisse abfangen. Funktioniert auch bis zu einem gewissen Punkt ganz gut, leider bemerkt der Listener nur nicht, dass ein Mausbutton "released" wurde. Ich bin mir gerade nicht sicher wo sich ein Fehler eingeschlichen haben könnte, hier der notwendige Quelltext:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    
    public class SgameApplication implements KeyListener, MouseListener{
     
        private Logger logger = null;
        private Game defaultGame = null;
        private int keyState = 0;  // Welcher Buchstabe ist gedrückt
        
        public MouseEvent mouse;
        private GLCanvas canvas;
        
        private static Animator animator;
        // Fenster
    //  private JOGLFrame frame = new JOGLFrame("Shipgame");
        private Frame frame = new Frame("Shipgame");
        
        /**
         * Standardkonstruktor
         */
        public SgameApplication(){
            
            // Logging
            logger = Logger.getLogger("game logger");
            String pattern = "%d{ISO8601} [%p] %m %n"; 
            PatternLayout layout = new PatternLayout(pattern);
            
            try{
                FileAppender consoleAppender = new FileAppender(layout, "sgame.log");
                logger.addAppender( consoleAppender );
                logger.setLevel(Level.ALL);
            } catch(Exception e){
                e.printStackTrace();
            }
            
            // Fensterelemente entfernen
            frame.setUndecorated(true);
            
            // Hier Auflösung auslesen
            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
            GraphicsDevice gd = ge.getDefaultScreenDevice();
            DisplayMode dm = gd.getDisplayMode();
            
            int w = dm.getWidth();
            int h = dm.getHeight();
            
            defaultGame = new Game(this, w, h);
            
            // JOGL Code
            canvas = new GLCanvas();
            canvas.addGLEventListener(defaultGame);
            canvas.addMouseListener(this);
            frame.add(canvas);
            animator = new Animator(canvas);
            // Jogl Code Ende
            
            frame.setBounds(0, 0, w, h);
            frame.addWindowListener(new WindowAdapter()
            {
                public void windowClosing(WindowEvent e)
                {
                    animator.stop();
                    System.exit(0);
                }
            });
            frame.setVisible(true);
            animator.start();
        }
        
        /**
         * Main Methode.
         * @param args
         */
        public static void main(String[] args) {
            SgameApplication app = new SgameApplication();
        }
     
        @Override
        public void keyPressed(KeyEvent e) {
            // TODO Auto-generated method stub
            this.keyState = e.getKeyCode();
        }
     
        @Override
        public void keyReleased(KeyEvent e) {
            // TODO Auto-generated method stub
            this.keyState = 0;
        }
     
        @Override
        public void keyTyped(KeyEvent e) {
            // TODO Auto-generated method stub
            
        }
        
        public int getKeyState(){
            return keyState;
        }
     
        @Override
        public void mouseClicked(MouseEvent e) {
            // TODO Auto-generated method stub      
            mouse = e;
        }
     
        @Override
        public void mouseEntered(MouseEvent e) {
            // TODO Auto-generated method stub
            mouse = e;
        }
     
        @Override
        public void mouseExited(MouseEvent e) {
            // TODO Auto-generated method stub
            mouse = e;
        }
     
        @Override
        public void mousePressed(MouseEvent e) {
            // TODO Auto-generated method stub
            mouse = e;
        }
     
        @Override
        public void mouseReleased(MouseEvent e) {
            // TODO Auto-generated method stub
            mouse = e;
        }
        
    }

    In der aufgerufenen "Game"-Klasse frage ich den Status dann folgendermaßen ab:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    switch (gameApp.mouse.getButton()) {
                case MouseEvent.BUTTON1:
                    break;
                case MouseEvent.BUTTON2:
                    break;
                case MouseEvent.BUTTON3:
                    break;
                case MouseEvent.NOBUTTON:
                    break;
                default:
                    break;
              }
    Sobald jedoch einmal ein Status erreicht wurde, wird er erst wieder bei einem Mausklick geändert und passt sich nicht an den wirklichen Status an. Der Status "NOBUTTON" wird also nur erreicht, bevor eine Maustaste gedrückt wurde.

    Die Einrückung hats etwas zerrissen, nicht benötigter Code wurde entfernt.

    Vielen Dank für Vorschläge im Voraus

    MrCastle
     

  2. #2
    Der Wolf Der Wolf ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    158
    Was genau erwartest du denn? Ich meine bei einem mouse released gibt er dir auch immer den Button mit zurück, der vorher gedrückt war und nicht NO BUTTON. Bei mir gerade wurde der NOBUTTON Status nur gesetzt, wenn ich zum Beispiel in die Titelleiste geklickt hatte, ansonsten hatte ich immer einen Button zurück geliefert bekommen.

    Gruß
    Der Wolf
    MrCastle bedankt sich. 

  3. #3
    Matt297 Matt297 ist gerade online Mitglied Gold
    Registriert seit
    Oct 2008
    Beiträge
    181
    Ich denke das Problem hat nichts mit released etc. zu tun, sondern eher damit dass du in den Event-Funktionen mouseExited und mouseEntered auch "mouse=e" geschrieben hast. Diese werden nämlich ausgelöst, wenn die Maus ein Element betritt oder verlässt, und bei diesen Events ist es ja nicht zwingend notwendig, dass eine Maustaste gedrückt ist.
    Lösch einfach mal das "mouse=e;" in den beiden Funktionen und du wirst kein NOBUTTON mehr haben.
    MrCastle bedankt sich. 

  4. #4
    MrCastle MrCastle ist offline Mitglied Bronze
    Registriert seit
    Aug 2009
    Beiträge
    32
    Zitat Zitat von Der Wolf Beitrag anzeigen
    Was genau erwartest du denn? Ich meine bei einem mouse released gibt er dir auch immer den Button mit zurück, der vorher gedrückt war und nicht NO BUTTON. Bei mir gerade wurde der NOBUTTON Status nur gesetzt, wenn ich zum Beispiel in die Titelleiste geklickt hatte, ansonsten hatte ich immer einen Button zurück geliefert bekommen.

    Gruß
    Der Wolf
    Hi und danke für die Antworten. Ich erwarte, dass bei der Betätigung eines Mausbuttons nicht der gleiche Status erhalten bleibt, auch wenn der Button nicht mehr gedrückt wurde. Ich will ja nur einen Klick wahrnehmen und nicht mehr. Vielleicht ist das aber der falsche Ansatz.

    Zitat Zitat von Matt297 Beitrag anzeigen
    Ich denke das Problem hat nichts mit released etc. zu tun, sondern eher damit dass du in den Event-Funktionen mouseExited und mouseEntered auch "mouse=e" geschrieben hast. Diese werden nämlich ausgelöst, wenn die Maus ein Element betritt oder verlässt, und bei diesen Events ist es ja nicht zwingend notwendig, dass eine Maustaste gedrückt ist.
    Lösch einfach mal das "mouse=e;" in den beiden Funktionen und du wirst kein NOBUTTON mehr haben.
    Das war nur eine temporäre Spielerei, vorher hatte ich es nur in den anderen Methoden und diversen Kombinationen ohne "Entered" und "Exited", hat leider keine Auswirkung. Außerdem möchte ich ja den "NOBUTTON" Status erreichen, da ich im Grunde bei einem Klick eine entsprechende Anreihung von Aktionen ausführen möchte.


    e: OK ich glaube ich habe meinen Denkfehler gefunden :-S
    Die entsprechenden Methoden "mouseClicked" etc. werden ja bei einem Klick nur einmal ausgeführt... Da muss ich ansetzen, getButton gibt mir ja offensichtlich nur den letzten gedrückten Button zurück.
    OK ich denke damit hat sichs erledigt Werde es gleich mal testen.
    Geändert von MrCastle (15.08.10 um 14:06 Uhr)
     

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 04.12.07, 10:36
  2. MouseEvent in mouseDragged liefert keine Mouse-Taste (Linux)
    Von Prophet05 im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 15.11.07, 19:54
  3. Antworten: 2
    Letzter Beitrag: 05.02.07, 18:29
  4. Antworten: 9
    Letzter Beitrag: 01.01.07, 20:02
  5. link auf "enter" oder "esc" taste setzen?
    Von Atti im Forum Javascript & Ajax
    Antworten: 3
    Letzter Beitrag: 24.08.05, 01:41

Stichworte