2012-08-25 3 views
1

J'avais posté cela à un mauvais endroit (GameDev) et je n'ai reçu aucune réponse. Donc je le publie à nouveau ici.Java Applet Game Design: Mise au point du clavier

Je fais un jeu d'applet et c'est le rendu, la boucle de jeu est en cours, les animations sont en train de se mettre à jour, mais l'entrée au clavier ne fonctionne pas. Voici un SSCCE.

public class Game extends JApplet implements Runnable { 

    public void init(){ 
     // Initialize the game when called by browser 
     setFocusable(true); 
     requestFocus(); 
     requestFocusInWindow(); // Always returning false 
     GInput.install(this); // Install the input manager for this class 
     new Thread(this).start(); 
    } 

    public void run(){ 
     startGameLoop(); 
    } 

} 

Et voici la classe GInput.

public class GInput implements KeyListener { 

    public static void install(Component c){ 
     new GInput(c); 
    } 

    public GInput(Component c){ 
     c.addKeyListener(this); 
    } 

    public void keyPressed(KeyEvent e){ 
     System.out.println("A key has been pressed"); 
    } 

    ...... 

} 

Ceci est ma classe GInput. Lorsqu'il est exécuté en tant qu'applet, cela ne fonctionne pas et lorsque j'ajoute la classe Game à un cadre, cela fonctionne correctement.

Merci

Résolu maintenant. Voir ma solution

+0

La page de GameDev est http://gamedev.stackexchange.com/questions/34555/java-applet-game-design-no-keyboard-focus –

+0

Comme il fonctionne comme un cadre, la meilleure approche est de lancer le frame à partir d'un lien en utilisant [Java Web Start] (http://stackoverflow.com/tags/java-web-start/info). –

+2

Je ne fais pas d'applets, donc je ne peux pas dire avec certitude quel est le problème, mais vous pouvez contourner les problèmes de mise au point en utilisant les liaisons de touches au lieu d'un KeyListener. De plus, votre SSCCE n'est pas conforme à la spécification SSCCE. Nous ne pouvons pas l'exécuter ni le tester. –

Répondre

0

Maintenant que j'ai deux options,

  • Utilisez JWS
  • Ne faites pas un Mode applet

Maintenant, j'avais essayé de créer une nouvelle classe appelée GApplet. Il charge un jeu dans un nouveau JFrame qui a fonctionné à partir de l'applet. Maintenant, je peux accéder au mode plein écran à partir du Web aussi. Voici un lien vers la classe.

The GApplet class

Et maintenant, il travaille comme webstart et est en fait une applet.

1

Si vous utilisez un navigateur, vous devez probablement cliquer sur l'applet pour le mettre au point. Pour des raisons de sécurité, la plupart des navigateurs ne permettent pas à une applet de saisir le focus du clavier sans que l'utilisateur ne clique dessus.

Alors, je voudrais ajouter un écouteur de souris au lieu de faire la mise au point saisissant directement dans init():

addMouseListener(new MouseAdapter() { 
    public void onMousePress(MouseEvent e) { 
     requestFocus(); 
    } 
}); 
+0

Si l'applet n'a pas de focus, ce n'est pas pour des raisons de sécurité. –

+0

J'ai inclus seulement le modèle de base des classes. La classe GInput complète peut être trouvée ici. https://code.google.com/p/game-engine-for-java/source/browse/src/com/gej/input/GInput.java –

+0

également essayé d'utiliser un écouteur de mise au point aussi, mais pas de solution :(encore –

4

Une solution possible est d'utiliser contentPane du JApplet, de mettre l'accent sur plutôt que sur le JApplet lui-même. Mais ma préférence est d'utiliser les liaisons de touches à la place. Vous devrez peut-être utiliser une minuterie Swing pour que cela fonctionne:

Mon SSCCE:

import java.awt.Container; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.lang.reflect.InvocationTargetException; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class AppletKeyListen extends JApplet { 
    @Override 
    public void init() { 
     try { 
     SwingUtilities.invokeAndWait(new Runnable() { 
      public void run() { 
       setFocusable(true); 

       int timerDelay = 100; 
       Timer myTimer = new Timer(timerDelay , new ActionListener() { 

        @Override 
        public void actionPerformed(ActionEvent arg0) { 
        boolean focusObtained = requestFocusInWindow(); 
        System.out.println("focusObtained for JApplet: " + focusObtained); 

        Container contentPane = getContentPane(); 
        contentPane.setFocusable(true); 

        focusObtained = contentPane.requestFocusInWindow(); 
        System.out.println("focusObtained for contentPane: " + focusObtained); 


        } 
       }); 
       myTimer.setRepeats(false); 
       myTimer.start(); 
//    boolean focusObtained = requestFocusInWindow(); 
//    System.out.println("focusObtained: " + focusObtained); 
//    
//    Container contentPane = getContentPane(); 
//    contentPane.setFocusable(true); 
//    
//    focusObtained = contentPane.requestFocusInWindow(); 
//    System.out.println("focusObtained: " + focusObtained); 

      } 
     }); 
     } catch (InvocationTargetException | InterruptedException e) { 
     e.printStackTrace(); 
     } 
    } 
} 
+0

Mais le jeu lui-même est programmé dans le JApplet Comment puis-je utiliser le volet de contenu Pourriez-vous s'il vous plaît expliquer un peu .. et –

+0

serait KeyBindings travailler même si pas au point –

+0

@SriHarshaChilakapati: voir modifier et code, et *** oui ***, c'est où le travail ** meilleur raccourcis clavier ** –

Questions connexes