elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Ayuda, eventos de Teclado no es escuchado en JPANEL
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda, eventos de Teclado no es escuchado en JPANEL  (Leído 8,079 veces)
DarkSorcerer

Desconectado Desconectado

Mensajes: 69



Ver Perfil
Ayuda, eventos de Teclado no es escuchado en JPANEL
« en: 5 Mayo 2013, 01:18 am »

Voy a crear un videojuego similar al Space Invaders, para eso, quiero que el jugador controle la nave por medio del teclado, la cosa es que el juego consiste en una Ventana (JFrame) y varios niveles que tengo pensado en hacerlo dentro de un JPanel donde es el lugar que se dibuja los enemigos, la nave del heroe, y otros obstaculos como meteoritos, agujeros negros, tormentas solares, etc, intente implementar la interfaz KeyListener en JPanel pero no los escucha, hice lo correcto y registre el evento, pero lo mas curioso es que si me escucha los eventos del Mouse, pero no del Teclado.

Una solucion que encontre fue implementarlo en JFrame y de ahi usar los metodos para mover la nave accediendo a Jpanel y me funciono, pero no es lo que quiero, yo quiero mover la nave implementando KeyListener en JPanel, en otros foros me decian que intente usando el metodo "setFocusable(true)", pero igual no me funciono.

Por ahora, no les mostrare el codigo del juego, pero si de un programa que hice especialmente para mostrar mi duda, es similar a mi problema. Use el compilador Netbeans 7.3

Clase Principal

Código:
package ejercicio47;

import javax.swing.JFrame;

public class Ejercicio47 {

    public static void main(String[] args) {
        
        JFrame ventana = new JFrame();
        Panel panel = new Panel();
        
        ventana.add(panel);
        ventana.setDefaultCloseOperation(Ventana.EXIT_ON_CLOSE);
        ventana.setSize(500,500);
        ventana.setTitle("Testeo de eventos");
        ventana.setFocusable(true);
        ventana.setResizable(false);
        ventana.setVisible(true);

    }
}



Clase Panel

Código:
package ejercicio47;

import javax.swing.JPanel;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.Graphics;
import java.awt.Color;

public class Panel extends JPanel implements KeyListener, MouseListener {
    
    public Panel(){
        
        setBackground(Color.WHITE);
        addMouseListener(this);
        addKeyListener(this);
        
    }
    
    public void mouseClicked(MouseEvent e){
        
        System.out.println("Hola mundo");
        
    }
    
    public void mouseEntered(MouseEvent e){
        
        System.out.println("Hola mundo");
        
    }
    
    public void mousePressed(MouseEvent e){
        
        System.out.println("Hola mundo");
        
    }
    
    public void mouseExited(MouseEvent e){
        
        System.out.println("Adios mundo");
        
    }
    
    public void mouseReleased(MouseEvent e){
        
        System.out.println("Adios mundo");
        
    }
    
    public void keyTyped(KeyEvent e){
        
        System.out.println("Hola mundo");
        
    }
    
    public void keyPressed(KeyEvent e){
        
        System.out.println("Hola mundo");
        
    }
    
    public void keyReleased(KeyEvent e){
        
        System.out.println("Adios mundo");
        
    }
    
    public void paintComponent(Graphics g){
        
        super.paintComponent(g);
        
    }
    
}





En línea

RyogiShiki


Desconectado Desconectado

Mensajes: 745


げんしけん - Hikkikomori FTW!!!


Ver Perfil WWW
Re: Ayuda, eventos de Teclado no es escuchado en JPANEL
« Respuesta #1 en: 6 Mayo 2013, 03:59 am »

Hola que tal.

Antes que nada revisando la documentación sobre KeyListeners encuentras la información que necestas. Sin embargo paso a explicar lo que sucede.

Cuando escuchas un evento de teclado sobre un componente, es necesario saber sobre que componente el evento va ser escuchado, por ejemplo, si tengo dos JPanel, y cada uno tiene su propio KeyListener, al abrir la aplicación y oprimir una tecla, el programa no sabrá a cual de los dos Listeners estoy haciendo referencia, por esta razón es necesario tener un mecanismo que permita identificar que componente debe procesar el evento, para esto se hace uso del Foco, si el primer panelpanel tiene el Foco, entences este responderá al evento, si el segundo lo tiene, el segundo lo hará. Lo que falta en tu código es un mecanismo efetivo para asignar el foco al componente determinado.

En primer lugar, el método: setFocusable(boolean b) no debería estar en el JFrame, sino más bien en el JPanel:
Código
  1. public Panel(){
  2.  
  3.        setBackground(Color.WHITE);
  4.        addMouseListener(this);
  5.        addKeyListener(this);
  6.        setFocusable(true);
  7. }

Ahora que nuestro Panel tiene la habilidad de obtener foco, debemos definir como debe hacerlo, en este caso lo haremos al hacer click sobre este, para esto simplemente agregamos una linea de código más al método sobreescrito mouseClicked(Event e):

Código
  1. public void mouseClicked(MouseEvent e){
  2.  
  3.        System.out.println("Hola mundo");
  4.        requestFocusInWindow();        
  5. }

En este momento al hacer click sobre el Panel este obtendrá el foco dentro de la ventana, ahora si oprimes alguna tecla, verás como los eventos son correctamente procesados.

PD: Usar requestFocusInWindow() envés de requestFocus(). El primero otorgará el foco al componente dentro de la ventana que se encuentre, el segundo robará el foco de otras ventanas que estén abiertas (como las de otros programas)

Espero sea de ayuda.

Saludos


En línea

DarkSorcerer

Desconectado Desconectado

Mensajes: 69



Ver Perfil
Re: Ayuda, eventos de Teclado no es escuchado en JPANEL
« Respuesta #2 en: 6 Mayo 2013, 09:39 am »

Hola, primero que nada, muchas gracias por la ayuda y por tomarte tu tiempo en ayudarme, en parte me sirvio (para el caso del codigo que puse), pero no me pudo solucionar el problema de mi juego, y creo que descubri la causa pero no encuentro la solucion. Estoy ocupando Herencia, de todas maneras, ¿Alguien de aca estaria dispuesto a revisar mi codigo y ayudarme a encontrar el error? Mi codigo esta documentado para que no tengan problemas de lo que quiero comunicar.

« Última modificación: 6 Mayo 2013, 09:42 am por DarkSorcerer » En línea

DarkSorcerer

Desconectado Desconectado

Mensajes: 69



Ver Perfil
Re: Ayuda, eventos de Teclado no es escuchado en JPANEL
« Respuesta #3 en: 6 Mayo 2013, 11:15 am »

Bueno, les dejo mi codigo, soy novato en esto y quizas hayan partes que se ven newbies, acepto criticas constructivas si hay que mejorar algo, las destructivas no las tomo en cuenta. Al final del codigo hay enlaces a las imagenes que use.

Descubri el origen del problema, y sucede cuando paso al siguiente nivel, el primer nivel es la Portada que se inicializa en el constructor de Ventana, pero si en vez de inicializar Portada e inicializo Nivel1, logro que los eventos de teclado sean escuchados, pero busco que el primer nivel sea la portada.

Clase principal (Main)

Código
  1. package videojuego3;
  2.  
  3. public class Videojuego3 {
  4.  
  5.    public static void main(String[] args) {
  6.  
  7.        //Crea la ventana contenedora de Niveles
  8.        Ventana ventana = new Ventana();
  9.  
  10.        //Ciclo infinito
  11.        while(true){
  12.  
  13.            ventana.setVisible(true);
  14.  
  15.            //Instruccion que pasa al siguiente nivel si se completo el nivel anterior
  16.            if(ventana.getNivel().estaCompleto()){
  17.  
  18.                ventana.setNivel(new Nivel1());
  19.  
  20.            }
  21.  
  22.        }
  23.  
  24.    }
  25. }
  26.  

Clase Ventana

Código
  1. package videojuego3;
  2.  
  3. import javax.swing.JFrame;
  4.  
  5. /**
  6.  * Clase que representa la Ventana contenedora de los niveles
  7.  * @author RPZ
  8.  */
  9.  
  10. public class Ventana extends JFrame {
  11.  
  12.    //El primer nivel es el menu de inicio
  13.    private Nivel nivel = new Portada();
  14.  
  15.    public Ventana(){
  16.  
  17.        super("Space Troubles");
  18.        setSize(500,500);
  19.        setResizable(false);
  20.        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  21.        add(nivel);
  22.  
  23.    }
  24.  
  25.    /**
  26.      * Metodo que permite remplazar el nivel que esta en la ventana por otro, una
  27.      * vez completado.
  28.      * @param nivel El nuevo nivel.  
  29.      */
  30.  
  31.    public void setNivel(Nivel nivel){
  32.  
  33.        this.nivel = nivel;
  34.        //Tuve que poner este metodo, mira lo que suce si no lo pongo, para que
  35.        //no se "mezclara" con el nivel anterior.
  36.        getContentPane().removeAll();
  37.        add(nivel);
  38.  
  39.    }
  40.  
  41.    /**
  42.      * Devuelve el nivel actual del juego
  43.      * @return Retorna el nivel actual en juego
  44.      */
  45.  
  46.    public Nivel getNivel(){
  47.  
  48.        return nivel;
  49.  
  50.    }
  51.  
  52. }
  53.  

Clase Nivel

Código
  1. package videojuego3;
  2.  
  3. import javax.swing.JPanel;
  4. import java.awt.Image;
  5. import java.awt.Graphics;
  6.  
  7. /**
  8.  * Clase que representa al un Nivel del juego, incluye la portada
  9.  * @author RPZ
  10.  */
  11.  
  12. public class Nivel extends JPanel {
  13.  
  14.    protected Image fondo;
  15.    protected boolean estaCompleto;
  16.  
  17.    public Nivel(Image fondo){
  18.  
  19.        this.fondo = fondo;
  20.        this.estaCompleto = false;
  21.        setFocusable(true);
  22.  
  23.    }
  24.  
  25.    /**
  26.      * Metodo que permite marcar el nivel cuando esta completo.
  27.      * @param estaCompleto El marcador booleano que representa el nivel completo.
  28.      */
  29.  
  30.    public void setCompleto(boolean estaCompleto){
  31.  
  32.        this.estaCompleto = estaCompleto;
  33.  
  34.    }
  35.  
  36.    /**
  37.      * Metodo que devuelve el estado del nivel, True si esta completo y False si
  38.      * esta incompleto
  39.      * @return True si esta completo, False si esta incompleto.
  40.      */
  41.  
  42.    public boolean estaCompleto(){
  43.  
  44.        return estaCompleto;
  45.  
  46.    }
  47.  
  48.    /**
  49.      * Metodo que permite dibujar en el panel, lo cual tiene diferente implementa
  50.      * cion en las clases hijas.
  51.      * @param g Paremtro Graphics.
  52.      */
  53.  
  54.    public void paintComponent(Graphics g){
  55.  
  56.    }
  57.  
  58. }
  59.  

Clase Enemigo

Código
  1. package videojuego3;
  2.  
  3. import java.awt.Graphics;
  4. import java.awt.Image;
  5.  
  6. /**
  7.  * Clase que representa al enemigo extraterrestre.
  8.  * @author RPZ
  9.  */
  10.  
  11. public class Enemigo {
  12.  
  13.    /**
  14.      * Coordenada X.
  15.      */
  16.    protected int x;
  17.  
  18.    /**
  19.      * Coordenada Y.
  20.      */
  21.    protected int y;
  22.  
  23.    /**
  24.      * La direccion que se mueve el enemigo, positivo a la derecha, negativo a
  25.      * la izquierda.
  26.      */
  27.    protected int dirHor;
  28.  
  29.    /**
  30.      * La anchura del enemigo en pixeles.
  31.      */
  32.    protected int ancho;
  33.  
  34.    /**
  35.      * La altura del enemigo en pixeles.
  36.      */
  37.    protected int alto;
  38.  
  39.    /**
  40.      * Los puntos de vida del enemigo.
  41.      */
  42.    protected int hP;
  43.  
  44.    /**
  45.      * Los puntos de ataque del enemigo.
  46.      */
  47.    protected int aP;
  48.  
  49.    /**
  50.      * El Sprite que muestra la apariencia del enemigo.
  51.      */
  52.    protected Image sprite;
  53.  
  54.    public Enemigo(int x, int y, int dirHor, int ancho, int alto, int hP, int aP, Image sprite){
  55.  
  56.        this.x = x;
  57.        this.y = y;
  58.        this.dirHor = dirHor;
  59.        this.ancho = ancho;
  60.        this.alto = alto;
  61.        this.hP = hP;
  62.        this.aP = aP;
  63.        this.sprite = sprite;
  64.  
  65.    }
  66.  
  67.    /**
  68.      * Establece la posicion horizontal.
  69.      * @param x La coordenada X.
  70.      */
  71.  
  72.    public void setX(int x){
  73.  
  74.        this.x = x;
  75.  
  76.    }
  77.  
  78.    /**
  79.      * Establece la posicion vertical.
  80.      * @param y La coordenada Y.
  81.      */
  82.  
  83.    public void setY(int y){
  84.  
  85.        this.y = y;
  86.  
  87.    }
  88.  
  89.    /**
  90.      * Establece la salud del enemigo.
  91.      * @param hP Puntos de salud.
  92.      */
  93.  
  94.    public void setHP(int hP){
  95.  
  96.        this.hP = hP;
  97.  
  98.    }
  99.  
  100.    /**
  101.      * Establece el ataque del enemigo.
  102.      * @param aP
  103.      */
  104.  
  105.    public void setAP(int aP){
  106.  
  107.        this.aP = aP;
  108.  
  109.    }
  110.  
  111.    /**
  112.      * Devuelve la posicion horizontal.
  113.      * @return La coordenada X.
  114.      */
  115.  
  116.    public int getX(){
  117.  
  118.        return x;
  119.  
  120.    }
  121.  
  122.    /**
  123.      * Devuelve la posicion vertical.
  124.      * @return La coordenada Y.
  125.      */
  126.  
  127.    public int getY(){
  128.  
  129.        return y;
  130.  
  131.    }
  132.  
  133.    /**
  134.      * Devuelve la salud.
  135.      * @return La salud del extraterrestre.
  136.      */
  137.  
  138.    public int getHP(){
  139.  
  140.        return hP;
  141.  
  142.    }
  143.  
  144.    /**
  145.      * Devuelve el ataque.
  146.      * @return Los puntos de ataque del extraterrestre.
  147.      */
  148.  
  149.    public int getAP(){
  150.  
  151.        return aP;
  152.  
  153.    }
  154.  
  155.    /**
  156.      * Mueve "dirHor" unidades horizontalmente.
  157.      */
  158.  
  159.    public void moverHor(){
  160.  
  161.        verificarChoque();
  162.        x += dirHor;
  163.  
  164.    }
  165.  
  166.    /**
  167.      * Verifica que el enemigo no salga de la vista de la pantalla y rebota en
  168.      * las paredes del escenario.
  169.      */
  170.  
  171.    private void verificarChoque(){
  172.  
  173.        if(x > 465 || x < 0){
  174.  
  175.            dirHor *= -1;
  176.  
  177.        }
  178.    }
  179.  
  180.    /**
  181.      * Dibuja el enemigo en el Nivel.
  182.      * @param g Graphics.
  183.      */
  184.  
  185.    public void dibujar(Graphics g){
  186.  
  187.        g.drawImage(sprite,x,y,ancho,alto,null);
  188.  
  189.    }
  190.  
  191. }
  192.  

Clase Assault

Código
  1. package videojuego3;
  2.  
  3. import javax.swing.ImageIcon;
  4.  
  5. /**
  6.  * Clase hija que representa al tipo de enemigo "Assault", unidad de asalto,
  7.  * el enemigo mas comun y simple.
  8.  * @author RPZ.
  9.  */
  10.  
  11. public class Assault extends Enemigo {
  12.  
  13.    public Assault(int x, int y, int dirHor){
  14.  
  15.        super(x,y,dirHor,32,32,25,5,new ImageIcon("assault.png").getImage());
  16.  
  17.    }
  18.  
  19. }
  20.  

Clase Heroe

Código
  1. package videojuego3;
  2.  
  3. import java.awt.Graphics;
  4. import java.awt.Image;
  5. import javax.swing.ImageIcon;
  6.  
  7. /**
  8.  * Clase que representa al protagonista del juego.
  9.  * @author RPZ.
  10.  */
  11.  
  12. public class Heroe {
  13.  
  14.    /**
  15.      * Coordenada X.
  16.      */
  17.    private int x;
  18.  
  19.    /**
  20.      * Coordenada Y.
  21.      */
  22.    private int y;
  23.  
  24.    /**
  25.      * Puntos de vida.
  26.      */
  27.    private int hP;
  28.  
  29.    /**
  30.      * Puntos de ataque.
  31.      */
  32.    private int aP;
  33.  
  34.    /**
  35.      * Puntos de armadura.
  36.      */
  37.    private int armor;
  38.  
  39.    /**
  40.      * El Sprite que representa su apariencia.
  41.      */
  42.    private Image sprite;
  43.  
  44.    public Heroe(int x, int y){
  45.  
  46.        this.x = x;
  47.        this.y = y;
  48.        this.hP = 100;
  49.        this.aP = 5;
  50.        this.armor = 0;
  51.        this.sprite = new ImageIcon("naveHeroe.png").getImage();
  52.  
  53.    }
  54.  
  55.    /**
  56.      * Permite mover la nave horizontalmente.
  57.      * @param mov La "mov" posiciones que se mueve la nave, puede ser izquierda o
  58.      * derecha.
  59.      */
  60.  
  61.    public void moverNave(int mov){
  62.  
  63.        this.x += mov;
  64.  
  65.    }
  66.  
  67.    /**
  68.      * Metodo que dibuja la nave Heroe en el nivel.
  69.      * @param g Graphics.
  70.      */
  71.  
  72.    public void dibujar(Graphics g){
  73.  
  74.        g.drawImage(sprite,x,y,32,32,null);
  75.  
  76.    }
  77.  
  78. }
  79.  

Clase Portada

Código
  1. package videojuego3;
  2.  
  3. import java.awt.Color;
  4. import javax.swing.ImageIcon;
  5. import java.awt.Graphics;
  6. import java.awt.event.MouseAdapter;
  7. import java.awt.event.MouseMotionListener;
  8. import java.awt.event.MouseEvent;
  9. import java.awt.Font;
  10.  
  11. /**
  12.  * Clase que representa a un nivel especial, la Portada del juego.
  13.  * @author RPZ.
  14.  */
  15.  
  16. public class Portada extends Nivel {
  17.  
  18.    /**
  19.      * Color del subtitulo "Jugar".
  20.      */
  21.  
  22.    private Color color1;
  23.  
  24.    /**
  25.      * Color del subtitulo "Instrucciones".
  26.      */
  27.  
  28.    private Color color2;
  29.  
  30.    /**
  31.      * Color del subtitulo "Creditos".
  32.      */
  33.  
  34.    private Color color3;
  35.  
  36.    /**
  37.      * Fuente de letra del titulo.
  38.      */
  39.  
  40.    private Font fuenteTitulo;
  41.  
  42.    /**
  43.      * Fuente de letra de los subtitulos.
  44.      */
  45.  
  46.    private Font fuenteSubtitulo;
  47.  
  48.    /**
  49.      * Fuente de letra de la informacion del autor.
  50.      */
  51.  
  52.    private Font fuenteAutor;
  53.  
  54.  
  55.    public Portada(){
  56.  
  57.        super(new ImageIcon("portada.jpg").getImage());
  58.  
  59.        this.color1 = Color.YELLOW;
  60.        this.color2 = Color.YELLOW;
  61.        this.color3 = Color.YELLOW;
  62.  
  63.        this.fuenteTitulo = new Font("Serif",Font.BOLD,40);
  64.        this.fuenteSubtitulo = new Font("Serif",Font.PLAIN,20);
  65.        this.fuenteAutor = new Font("Serif",Font.PLAIN,12);
  66.  
  67.        EventoMouse evento = new EventoMouse();
  68.        addMouseListener(evento);
  69.        addMouseMotionListener(evento);
  70.        setFocusable(true);
  71.  
  72.    }
  73.  
  74.    /**
  75.      * Metodo sobreescrito que permite dibujar el menu principal o la portada
  76.      * en el nivel.
  77.      * @param g Graphics.
  78.      */
  79.  
  80.    public void paintComponent(Graphics g){
  81.  
  82.        super.paintComponent(g);
  83.  
  84.        g.drawImage(fondo,0,0,500,500,this);
  85.  
  86.        g.setFont(fuenteTitulo);
  87.        g.setColor(Color.YELLOW);
  88.        g.drawString("SPACE TROUBLES",75,65);
  89.  
  90.        g.setFont(fuenteSubtitulo);
  91.        g.setColor(color1);
  92.        g.drawString("Jugar",220,340);
  93.  
  94.        g.setFont(fuenteSubtitulo);
  95.        g.setColor(color2);
  96.        g.drawString("Instrucciones",190,370);
  97.  
  98.        g.setFont(fuenteSubtitulo);
  99.        g.setColor(color3);
  100.        g.drawString("Créditos",210,400);
  101.  
  102.        g.setFont(fuenteAutor);
  103.        g.setColor(Color.RED);
  104.        g.drawString("© 2013 RPZoft",205,440);
  105.  
  106.    }
  107.  
  108.    /**
  109.      * Clase interna que representa al administrador de eventos del Mouse.
  110.      */
  111.  
  112.    private class EventoMouse extends MouseAdapter implements MouseMotionListener {
  113.  
  114.        /**
  115.          * Metodo que permite cambiar de color los subtitulos al pasar el puntero
  116.          * sobre ellos.
  117.          * @param evento
  118.          */
  119.  
  120.        public void mouseMoved(MouseEvent evento){
  121.  
  122.            if(evento.getX() >=220 && evento.getX() <=270 && evento.getY() >= 330 &&
  123.                    evento.getY() <= 350){
  124.  
  125.                color1 = Color.RED;
  126.                color2 = Color.YELLOW;
  127.                color3 = Color.YELLOW;
  128.                repaint();
  129.  
  130.            }else{
  131.  
  132.                if(evento.getX() >=200 && evento.getX() <=290 && evento.getY() >= 360 &&
  133.                        evento.getY() <=380){
  134.  
  135.                    color2 = Color.RED;
  136.                    color1 = Color.YELLOW;
  137.                    color3 = Color.YELLOW;
  138.                    repaint();
  139.  
  140.                }else{
  141.  
  142.                    if(evento.getX() >=200 && evento.getX() <=270 && evento.getY() >= 390 &&
  143.                        evento.getY() <=410){
  144.  
  145.                        color3 = Color.RED;
  146.                        color1 = Color.YELLOW;
  147.                        color2 = Color.YELLOW;
  148.                        repaint();
  149.  
  150.                    }else{
  151.  
  152.                        color1 = Color.YELLOW;
  153.                        color2 = Color.YELLOW;
  154.                        color3 = Color.YELLOW;
  155.                        repaint();
  156.  
  157.                    }
  158.                }
  159.  
  160.            }
  161.  
  162.        }
  163.  
  164.        public void mouseDragged(MouseEvent evento){
  165.  
  166.  
  167.        }
  168.  
  169.        /**
  170.          * Metodo que permite pasar al siguiente nivel, un nivel jugable.
  171.          * @param evento
  172.          */
  173.  
  174.        public void mousePressed(MouseEvent evento){
  175.  
  176.            if(evento.getX() >=220 && evento.getX() <=270 && evento.getY() >= 330 &&
  177.                    evento.getY() <= 350){
  178.  
  179.                setCompleto(true);
  180.  
  181.            }
  182.  
  183.        }
  184.  
  185.    }
  186.  
  187. }
  188.  

Clase Nivel1

Código
  1. package videojuego3;
  2.  
  3. import javax.swing.ImageIcon;
  4. import java.awt.Graphics;
  5. import java.awt.event.ActionListener;
  6. import java.awt.event.ActionEvent;
  7. import java.awt.event.KeyListener;
  8. import java.awt.event.KeyEvent;
  9. import javax.swing.Timer;
  10.  
  11. public class Nivel1 extends Nivel implements ActionListener {
  12.  
  13.    /**
  14.      * Arreglo que contiene a los enemigos.
  15.      */
  16.    private Enemigo enemigos[];
  17.  
  18.    /**
  19.      * El heroe dentro del nivel.
  20.      */
  21.    private Heroe heroe;
  22.  
  23.    public Nivel1(){
  24.  
  25.        super(new ImageIcon("fondo1.jpg").getImage());
  26.  
  27.        enemigos = new Enemigo[3];
  28.  
  29.        enemigos[0] = new Assault(20,20,1);
  30.        enemigos[1] = new Assault(330,60,-1);
  31.        enemigos[2] = new Assault(190,100,1);
  32.  
  33.        heroe = new Heroe(200,400);
  34.  
  35.        //Temporalizador, permite que haya tiempo en el juego.
  36.        Timer temporizador = new Timer(1,this);
  37.        temporizador.start();
  38.  
  39.        Teclado evento1 = new Teclado();
  40.        addKeyListener(evento1);
  41.        setFocusable(true);
  42.  
  43.    }
  44.  
  45.    /**
  46.      * Metodo que se llama atraves del tiempo. Permite que las naves enemigas
  47.      * se este moviendo con respecto al tiempo.
  48.      * @param evento
  49.      */
  50.  
  51.    public void actionPerformed(ActionEvent evento){
  52.  
  53.        for(int i=0; i<3; i++){
  54.  
  55.            enemigos[i].moverHor();
  56.  
  57.        }
  58.  
  59.        repaint();
  60.  
  61.    }
  62.  
  63.    /**
  64.      * Metodo sobreescrito que permite dibujar los enemigos y el heroe en el nivel.
  65.      * @param g Graphics.
  66.      */
  67.  
  68.    public void paintComponent(Graphics g){
  69.  
  70.        super.paintComponent(g);
  71.  
  72.        g.drawImage(fondo,0,0,500,500,this);
  73.  
  74.        for(int i=0; i<3; i++){
  75.  
  76.            enemigos[i].dibujar(g);
  77.  
  78.        }
  79.  
  80.        heroe.dibujar(g);
  81.  
  82.    }
  83.  
  84.    public Heroe getHeroe(){
  85.  
  86.        return heroe;
  87.  
  88.    }
  89.  
  90.    private class Teclado implements KeyListener {
  91.  
  92.        public void keyTyped(KeyEvent e){
  93.  
  94.        }
  95.  
  96.        public void keyPressed(KeyEvent e){
  97.  
  98.            if(e.getKeyCode() == KeyEvent.VK_RIGHT){
  99.  
  100.                heroe.moverNave(3);
  101.                requestFocusInWindow();
  102.                repaint();
  103.  
  104.            }
  105.  
  106.            if(e.getKeyCode() == KeyEvent.VK_LEFT){
  107.  
  108.                heroe.moverNave(-3);
  109.                requestFocusInWindow();
  110.                repaint();
  111.  
  112.            }
  113.  
  114.        }
  115.  
  116.        public void keyReleased(KeyEvent e){
  117.  
  118.        }
  119.    }
  120.  
  121. }
  122.  
  123.  

Fondo de la portada: http://www.subirimagenes.com/imagen-portada-8421349.html

Fondo nivel 1: http://www.subirimagenes.com/fondosycapturas-fondo1-8421353.html

Sprite nave heroe: http://www.subirimagenes.com/imagen-naveheroe-8421354.html

Sprite nave assault: http://www.subirimagenes.com/imagen-assault-8421356.html

« Última modificación: 6 Mayo 2013, 11:24 am por DarkSorcerer » En línea

RyogiShiki


Desconectado Desconectado

Mensajes: 745


げんしけん - Hikkikomori FTW!!!


Ver Perfil WWW
Re: Ayuda, eventos de Teclado no es escuchado en JPANEL
« Respuesta #4 en: 6 Mayo 2013, 16:03 pm »

Revisando el código por encima, noto que cuando haces que el panel tome foco (en la clase Nivel1) es precisamente cuando estás procesando un evento del teclado, Pero para procesar este evento debes tener el foco del panel antes. Basicamente el problema está en la linea 109 de la clase anidada Teclado dentro de Nivel1. El foco no debería pedirse al procesar un evento de teclado, debes usar otra manera para asignar el foco al panel. Por ejemplo implementando un MouseListener y llamando al método requestFocusInWindow() dentro de la implementación del método mouseEntered() es una forma de hacerlo.
En línea

sapito169


Desconectado Desconectado

Mensajes: 628



Ver Perfil
Re: Ayuda, eventos de Teclado no es escuchado en JPANEL
« Respuesta #5 en: 6 Mayo 2013, 17:02 pm »

Muchas felicitaciones y gracias por el aporte lo estoy revisando

Lo que está mal es que pongas comentarios tontos y obvios

Código
  1. /**     * Metodo que permite remplazar el nivel que esta en la ventana por otro, una     * vez completado.     * @param nivel El nuevo nivel.       */
  2.  public void setNivel(Nivel nivel){
  3. this.nivel=nivel
  4. }
  5. /**     * Devuelve el nivel actual del juego  
  6.    * @return Retorna el nivel actual en juego  
  7.   */    
  8.    public Nivel getNivel(){  
  9.      return nivel;    
  10. }
  11.  

no entiendo por que comentar getters y setters

Código
  1. /**     * Metodo que devuelve el estado del nivel, True si esta completo y False si     * esta incompleto     * @return True si esta completo, False si esta incompleto.     */    
  2. public boolean estaCompleto(){  
  3.      return estaCompleto;    
  4. }

ho de verdad creo que si veo un método se llama estaCompleto talves se me ocurra que sirva para saber si está completo
« Última modificación: 6 Mayo 2013, 17:10 pm por sapito169 » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Diferenciar eventos según teclado C#
.NET (C#, VB.NET, ASP)
kondrag_X1 3 3,227 Último mensaje 22 Abril 2015, 15:50 pm
por kondrag_X1
ayuda a ajustar vídeo a jpanel
Java
SoyBolita 0 2,292 Último mensaje 22 Febrero 2016, 05:23 am
por SoyBolita
Ayuda con eventos del teclado
Java
sebast345 3 2,364 Último mensaje 18 Noviembre 2016, 13:22 pm
por Orubatosu
Duda manejando eventos de teclado en Java
Java
niano 2 2,126 Último mensaje 11 Julio 2019, 19:04 pm
por niano
Comparar eventos de teclado con strings (C#)
.NET (C#, VB.NET, ASP)
Alejovsq 3 2,613 Último mensaje 9 Agosto 2019, 01:34 am
por Alejovsq
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines