Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - DarkSorcerer

#61
ACTUALIZACION: Ya encontre la solucion, implemente ActionListener

De todas maneras, dejo el codigo de mi error anterior, si alguien me dice si es posible tambien hacerlo por mouse, se los agradeceria.

Mi problema (que ya fue solucinado :D)


Estoy creando un programa que se trata de imitar al Paint, el programa es simple, consta de un Lienzo heredado de JPanel y una Ventana que contiene las herramientas, quize ponerle JMenu dentro de un JMenuBar que los contiene, y cada menu tiene diferentes tipos de JMenuItem, pero el problema es que no me escucha el llamado de mouseClicked, pero curiosamente, si me obedece otros, por ejemplo, le puse una barra inferior que muestra las coordenadas del puntero en el panel y si me hace caso .

Les dejo el codigo de la clase Ventana, ojala puedan ayudarme.

Código (java) [Seleccionar]
package programa1;

import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseEvent;
import java.awt.BorderLayout;

public class Ventana extends JFrame {
   
   private JMenuBar barraSuperior;
   private JPanel panelInferior;
   private JLabel barraInferior;
   
   private JMenu archivo;
   private JMenu editar;
   private JMenu colores;
   private JMenu formas;
   private JMenu achurado;
   private JMenu ayuda;
   
   private JMenuItem nuevo;
   private JMenuItem salir;
   
   private JMenuItem deshacer;
   private JMenuItem rehacer;
   
   private Lienzo pizarron;
   
   public Ventana(){
       
       super("Paint v2.0");

       //Creando el pizarron y las barras
       
       pizarron = new Lienzo();
       barraSuperior = new JMenuBar();
       panelInferior = new JPanel();
       panelInferior.setLayout(new BorderLayout());
       barraInferior = new JLabel("Dibuje en el panel blanco");
       panelInferior.add(barraInferior);
       
       //Creacion de los menus
       
       archivo = new JMenu("Archivo");
       editar = new JMenu("Editar");
       colores = new JMenu("Colores");
       formas = new JMenu("Formas");
       achurado = new JMenu("Achurado");
       ayuda = new JMenu("Ayuda");
       
       //Creacion de los items de cada menu
       
       nuevo = new JMenuItem("Nuevo");
       salir = new JMenuItem("Salir");
       deshacer = new JMenuItem("Deshacer");
       rehacer = new JMenuItem("Rehacer");
       
       //Agregando items a los menus respectivos
       
       archivo.add(nuevo);
       archivo.add(salir);
       
       editar.add(deshacer);
       editar.add(rehacer);
       
       //Construyendo la barra de menus

       barraSuperior.add(archivo);
       barraSuperior.add(editar);
       barraSuperior.add(colores);
       barraSuperior.add(formas);
       barraSuperior.add(achurado);
       barraSuperior.add(ayuda);
       
       //Agregando las barras y lienzo.
       
       setJMenuBar(barraSuperior);
       add(pizarron,BorderLayout.CENTER);
       add(panelInferior,BorderLayout.SOUTH);
       
       EventoMouse evento1 = new EventoMouse();
       salir.addMouseListener(evento1);
       pizarron.addMouseListener(evento1);
       pizarron.addMouseMotionListener(evento1);
       
       setSize(500,500);
       setResizable(false);
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       setVisible(true);
       
   }
   
   private class EventoMouse extends MouseAdapter implements MouseMotionListener {
       
       public void mouseClicked(MouseEvent e){
           
           if(salir.isSelected()){
               
               System.exit(0);

           }
           
       }
       
       public void mouseEntered(MouseEvent e){
           
           if(e.getSource().equals(pizarron)){
               
               barraInferior.setText(String.format("%d , %d",e.getX(),e.getY()));
               
           }
           
       }

       public void mouseMoved(MouseEvent e){
           
           if(e.getSource().equals(pizarron)){
               
               barraInferior.setText(String.format("%d , %d",e.getX(),e.getY()));
               
           }
       }
       
       public void mouseDragged(MouseEvent e){
           
           if(e.equals(pizarron)){
               
               barraInferior.setText(String.format("%d , %d",e.getX(),e.getY()));
               
           }
       }

   }
   

}
#62
¿ Realmente que buscas ?

¿ Dividir el String msg en cadenas mas pequeñas ?

Te voy a dar una pista, un String es una cadena de caracteres, es decir, un conjunto de chars, el String es una clase y tiene metodos, una de ellas es length o largo de la cadena (cantidad de char), tambien hay un metodo llamado toCharArray() que convierte tu guardas los caracteres en un arreglo y de ahi podrias crear otros arreglos acotados.

Podrias leer la documentacion de String, hay metodos bien interesantes.

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html

Saludos
#63
Java / Re: Empiezo en Java.
8 Mayo 2013, 11:05 AM
Hola, mi primer lenguaje que aprendí a programar fue en Java, y aun sigo aprendiendo muchas cosas, te puedo recomendar el libro "Como programar en Java" de Deitel, en vez de programar con el bloc de notas, usa algun compilador, podrias empezar con Dr Java ideal para novatos.
#64
Java / Re: [Problema] Java 3D
8 Mayo 2013, 10:59 AM
Podrias investigar acerca de la API Java 3D
#65
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 (java) [Seleccionar]
package videojuego3;

public class Videojuego3 {

   public static void main(String[] args) {
       
       //Crea la ventana contenedora de Niveles
       Ventana ventana = new Ventana();

       //Ciclo infinito
       while(true){
           
           ventana.setVisible(true);
           
           //Instruccion que pasa al siguiente nivel si se completo el nivel anterior
           if(ventana.getNivel().estaCompleto()){
               
               ventana.setNivel(new Nivel1());
                     
           }
             
       }
       
   }
}


Clase Ventana

Código (java) [Seleccionar]
package videojuego3;

import javax.swing.JFrame;

/**
* Clase que representa la Ventana contenedora de los niveles
* @author RPZ
*/

public class Ventana extends JFrame {
   
   //El primer nivel es el menu de inicio
   private Nivel nivel = new Portada();
   
   public Ventana(){
       
       super("Space Troubles");
       setSize(500,500);
       setResizable(false);
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       add(nivel);
       
   }
   
   /**
    * Metodo que permite remplazar el nivel que esta en la ventana por otro, una
    * vez completado.
    * @param nivel El nuevo nivel.  
    */
   
   public void setNivel(Nivel nivel){
       
       this.nivel = nivel;
       //Tuve que poner este metodo, mira lo que suce si no lo pongo, para que
       //no se "mezclara" con el nivel anterior.
       getContentPane().removeAll();
       add(nivel);
 
   }
   
   /**
    * Devuelve el nivel actual del juego
    * @return Retorna el nivel actual en juego
    */
   
   public Nivel getNivel(){
       
       return nivel;
       
   }
 
}


Clase Nivel

Código (java) [Seleccionar]
package videojuego3;

import javax.swing.JPanel;
import java.awt.Image;
import java.awt.Graphics;

/**
* Clase que representa al un Nivel del juego, incluye la portada
* @author RPZ
*/

public class Nivel extends JPanel {
   
   protected Image fondo;
   protected boolean estaCompleto;
   
   public Nivel(Image fondo){
       
       this.fondo = fondo;
       this.estaCompleto = false;
       setFocusable(true);
       
   }
   
   /**
    * Metodo que permite marcar el nivel cuando esta completo.
    * @param estaCompleto El marcador booleano que representa el nivel completo.
    */
   
   public void setCompleto(boolean estaCompleto){
       
       this.estaCompleto = estaCompleto;
       
   }
   
   /**
    * 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.
    */
   
   public boolean estaCompleto(){
       
       return estaCompleto;
       
   }
   
   /**
    * Metodo que permite dibujar en el panel, lo cual tiene diferente implementa
    * cion en las clases hijas.
    * @param g Paremtro Graphics.
    */
   
   public void paintComponent(Graphics g){
       
   }
   
}


Clase Enemigo

Código (java) [Seleccionar]
package videojuego3;

import java.awt.Graphics;
import java.awt.Image;

/**
* Clase que representa al enemigo extraterrestre.
* @author RPZ
*/

public class Enemigo {
   
   /**
    * Coordenada X.
    */
   protected int x;
   
   /**
    * Coordenada Y.
    */
   protected int y;
   
   /**
    * La direccion que se mueve el enemigo, positivo a la derecha, negativo a
    * la izquierda.
    */
   protected int dirHor;
   
   /**
    * La anchura del enemigo en pixeles.
    */
   protected int ancho;
   
   /**
    * La altura del enemigo en pixeles.
    */
   protected int alto;
   
   /**
    * Los puntos de vida del enemigo.
    */
   protected int hP;
   
   /**
    * Los puntos de ataque del enemigo.
    */
   protected int aP;
   
   /**
    * El Sprite que muestra la apariencia del enemigo.
    */
   protected Image sprite;
   
   public Enemigo(int x, int y, int dirHor, int ancho, int alto, int hP, int aP, Image sprite){
       
       this.x = x;
       this.y = y;
       this.dirHor = dirHor;
       this.ancho = ancho;
       this.alto = alto;
       this.hP = hP;
       this.aP = aP;
       this.sprite = sprite;
       
   }
   
   /**
    * Establece la posicion horizontal.
    * @param x La coordenada X.
    */
   
   public void setX(int x){
       
       this.x = x;
       
   }
   
   /**
    * Establece la posicion vertical.
    * @param y La coordenada Y.
    */
   
   public void setY(int y){
       
       this.y = y;
       
   }
   
   /**
    * Establece la salud del enemigo.
    * @param hP Puntos de salud.
    */
   
   public void setHP(int hP){
       
       this.hP = hP;
       
   }
   
   /**
    * Establece el ataque del enemigo.
    * @param aP
    */
   
   public void setAP(int aP){
       
       this.aP = aP;
       
   }
   
   /**
    * Devuelve la posicion horizontal.
    * @return La coordenada X.
    */
   
   public int getX(){
       
       return x;
       
   }
   
   /**
    * Devuelve la posicion vertical.
    * @return La coordenada Y.
    */
   
   public int getY(){
       
       return y;
       
   }
   
   /**
    * Devuelve la salud.
    * @return La salud del extraterrestre.
    */
   
   public int getHP(){
       
       return hP;
       
   }
   
   /**
    * Devuelve el ataque.
    * @return Los puntos de ataque del extraterrestre.
    */
   
   public int getAP(){
       
       return aP;
       
   }
   
   /**
    * Mueve "dirHor" unidades horizontalmente.
    */
   
   public void moverHor(){
       
       verificarChoque();
       x += dirHor;
       
   }
   
   /**
    * Verifica que el enemigo no salga de la vista de la pantalla y rebota en
    * las paredes del escenario.
    */
   
   private void verificarChoque(){
       
       if(x > 465 || x < 0){
           
           dirHor *= -1;
           
       }
   }
   
   /**
    * Dibuja el enemigo en el Nivel.
    * @param g Graphics.
    */
   
   public void dibujar(Graphics g){
       
       g.drawImage(sprite,x,y,ancho,alto,null);
               
   }
   
}


Clase Assault

Código (java) [Seleccionar]
package videojuego3;

import javax.swing.ImageIcon;

/**
* Clase hija que representa al tipo de enemigo "Assault", unidad de asalto,
* el enemigo mas comun y simple.
* @author RPZ.
*/

public class Assault extends Enemigo {
   
   public Assault(int x, int y, int dirHor){
       
       super(x,y,dirHor,32,32,25,5,new ImageIcon("assault.png").getImage());
       
   }
   
}


Clase Heroe

Código (java) [Seleccionar]
package videojuego3;

import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;

/**
* Clase que representa al protagonista del juego.
* @author RPZ.
*/

public class Heroe {
   
   /**
    * Coordenada X.
    */
   private int x;
   
   /**
    * Coordenada Y.
    */
   private int y;
   
   /**
    * Puntos de vida.
    */
   private int hP;
   
   /**
    * Puntos de ataque.
    */
   private int aP;
   
   /**
    * Puntos de armadura.
    */
   private int armor;
   
   /**
    * El Sprite que representa su apariencia.
    */
   private Image sprite;
   
   public Heroe(int x, int y){
       
       this.x = x;
       this.y = y;
       this.hP = 100;
       this.aP = 5;
       this.armor = 0;
       this.sprite = new ImageIcon("naveHeroe.png").getImage();
       
   }
   
   /**
    * Permite mover la nave horizontalmente.
    * @param mov La "mov" posiciones que se mueve la nave, puede ser izquierda o
    * derecha.
    */
   
   public void moverNave(int mov){
       
       this.x += mov;
   
   }
   
   /**
    * Metodo que dibuja la nave Heroe en el nivel.
    * @param g Graphics.
    */
   
   public void dibujar(Graphics g){
       
       g.drawImage(sprite,x,y,32,32,null);
       
   }
   
}


Clase Portada

Código (java) [Seleccionar]
package videojuego3;

import java.awt.Color;
import javax.swing.ImageIcon;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseEvent;
import java.awt.Font;

/**
* Clase que representa a un nivel especial, la Portada del juego.
* @author RPZ.
*/

public class Portada extends Nivel {
   
   /**
    * Color del subtitulo "Jugar".
    */
   
   private Color color1;
   
   /**
    * Color del subtitulo "Instrucciones".
    */
   
   private Color color2;
   
   /**
    * Color del subtitulo "Creditos".
    */
   
   private Color color3;
   
   /**
    * Fuente de letra del titulo.
    */
   
   private Font fuenteTitulo;
   
   /**
    * Fuente de letra de los subtitulos.
    */
   
   private Font fuenteSubtitulo;
   
   /**
    * Fuente de letra de la informacion del autor.
    */
   
   private Font fuenteAutor;

   
   public Portada(){
       
       super(new ImageIcon("portada.jpg").getImage());
       
       this.color1 = Color.YELLOW;
       this.color2 = Color.YELLOW;
       this.color3 = Color.YELLOW;
       
       this.fuenteTitulo = new Font("Serif",Font.BOLD,40);
       this.fuenteSubtitulo = new Font("Serif",Font.PLAIN,20);
       this.fuenteAutor = new Font("Serif",Font.PLAIN,12);
       
       EventoMouse evento = new EventoMouse();
       addMouseListener(evento);
       addMouseMotionListener(evento);
       setFocusable(true);
       
   }
   
   /**
    * Metodo sobreescrito que permite dibujar el menu principal o la portada
    * en el nivel.
    * @param g Graphics.
    */
   
   public void paintComponent(Graphics g){
       
       super.paintComponent(g);
       
       g.drawImage(fondo,0,0,500,500,this);
       
       g.setFont(fuenteTitulo);
       g.setColor(Color.YELLOW);
       g.drawString("SPACE TROUBLES",75,65);
       
       g.setFont(fuenteSubtitulo);
       g.setColor(color1);
       g.drawString("Jugar",220,340);
       
       g.setFont(fuenteSubtitulo);
       g.setColor(color2);
       g.drawString("Instrucciones",190,370);
       
       g.setFont(fuenteSubtitulo);
       g.setColor(color3);
       g.drawString("Créditos",210,400);
       
       g.setFont(fuenteAutor);
       g.setColor(Color.RED);
       g.drawString("© 2013 RPZoft",205,440);

   }
   
   /**
    * Clase interna que representa al administrador de eventos del Mouse.
    */
   
   private class EventoMouse extends MouseAdapter implements MouseMotionListener {
       
       /**
        * Metodo que permite cambiar de color los subtitulos al pasar el puntero
        * sobre ellos.
        * @param evento
        */
       
       public void mouseMoved(MouseEvent evento){
           
           if(evento.getX() >=220 && evento.getX() <=270 && evento.getY() >= 330 &&
                   evento.getY() <= 350){
               
               color1 = Color.RED;
               color2 = Color.YELLOW;
               color3 = Color.YELLOW;
               repaint();
               
           }else{
               
               if(evento.getX() >=200 && evento.getX() <=290 && evento.getY() >= 360 &&
                       evento.getY() <=380){
                   
                   color2 = Color.RED;
                   color1 = Color.YELLOW;
                   color3 = Color.YELLOW;
                   repaint();
                   
               }else{
                   
                   if(evento.getX() >=200 && evento.getX() <=270 && evento.getY() >= 390 &&
                       evento.getY() <=410){
                       
                       color3 = Color.RED;
                       color1 = Color.YELLOW;
                       color2 = Color.YELLOW;
                       repaint();
                       
                   }else{
                       
                       color1 = Color.YELLOW;
                       color2 = Color.YELLOW;
                       color3 = Color.YELLOW;
                       repaint();
                       
                   }
               }
               
           }
           
       }
       
       public void mouseDragged(MouseEvent evento){
           
           
       }
       
       /**
        * Metodo que permite pasar al siguiente nivel, un nivel jugable.
        * @param evento
        */
       
       public void mousePressed(MouseEvent evento){
           
           if(evento.getX() >=220 && evento.getX() <=270 && evento.getY() >= 330 &&
                   evento.getY() <= 350){
               
               setCompleto(true);
               
           }
           
       }
       
   }

}


Clase Nivel1

Código (java) [Seleccionar]
package videojuego3;

import javax.swing.ImageIcon;
import java.awt.Graphics;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import javax.swing.Timer;

public class Nivel1 extends Nivel implements ActionListener {
   
   /**
    * Arreglo que contiene a los enemigos.
    */
   private Enemigo enemigos[];
   
   /**
    * El heroe dentro del nivel.
    */
   private Heroe heroe;
   
   public Nivel1(){
       
       super(new ImageIcon("fondo1.jpg").getImage());
       
       enemigos = new Enemigo[3];
       
       enemigos[0] = new Assault(20,20,1);
       enemigos[1] = new Assault(330,60,-1);
       enemigos[2] = new Assault(190,100,1);
       
       heroe = new Heroe(200,400);
       
       //Temporalizador, permite que haya tiempo en el juego.
       Timer temporizador = new Timer(1,this);
       temporizador.start();

       Teclado evento1 = new Teclado();
       addKeyListener(evento1);
       setFocusable(true);
       
   }
   
   /**
    * Metodo que se llama atraves del tiempo. Permite que las naves enemigas
    * se este moviendo con respecto al tiempo.
    * @param evento
    */
   
   public void actionPerformed(ActionEvent evento){
       
       for(int i=0; i<3; i++){
           
           enemigos[i].moverHor();
           
       }
       
       repaint();
       
   }
   
   /**
    * Metodo sobreescrito que permite dibujar los enemigos y el heroe en el nivel.
    * @param g Graphics.
    */
   
   public void paintComponent(Graphics g){
       
       super.paintComponent(g);
       
       g.drawImage(fondo,0,0,500,500,this);
       
       for(int i=0; i<3; i++){
           
           enemigos[i].dibujar(g);
           
       }
       
       heroe.dibujar(g);
       
   }
   
   public Heroe getHeroe(){
       
       return heroe;
       
   }
   
   private class Teclado implements KeyListener {
       
       public void keyTyped(KeyEvent e){
           
       }
       
       public void keyPressed(KeyEvent e){

           if(e.getKeyCode() == KeyEvent.VK_RIGHT){
               
               heroe.moverNave(3);
               requestFocusInWindow();
               repaint();
               
           }
           
           if(e.getKeyCode() == KeyEvent.VK_LEFT){
               
               heroe.moverNave(-3);
               requestFocusInWindow();
               repaint();
               
           }
           
       }
       
       public void keyReleased(KeyEvent e){

       }
   }
 
}



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

#66
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.

#67
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

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

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);
       
   }
   
}




#68
Para poner en practica mis conocimientos, me anime en crear un pequeño videojuego, que consiste en un Space Invaders, donde las naves alienigenas se mueven horizontalmente (por ahora, despues pienso si moverlo verticalmente, solo es un prototipo), se mueven de tal manera que no se salga de la vista del jugador, cuando toca los bordes de la ventana, cambia de direccion, por ahora solo tiene naves enemigas, pronto le agregare la Nave Heroe (el que el jugador lo controla por teclado) y un contador de puntaje y barras de estado.

Mi juego constate por ahora de 3 clases, la clase principal obviamente con su respectivo main, una clase Panel que consiste en el escenario espacial, donde se mueven las naves enemigas y la nave heroe, y por ultimo la clase Nave, que representan a las naves enemigas.

Bueno, AQUI VA MI GRAN PROBLEMA, quise implementar ActionListener en la clase JPanel y utilizar la clase Timer de (javax.swing.Timer) que llama a actionPerformed para actualizar en un tiempo determinado, para que las naves se muevan con respecto al tiempo, lo cree en el constructor (por si acaso, esto lo aprendi en el libro "Como programar en Java" por Deitel), Y AQUI VIENE LO QUE QUIERO SOLUCIONAR, pues si bien, las naves se mueven a la velocidad que quiero, solamente lo hace en unos instantes, por que hay momentos que las naves "aceleran" mas de lo normal por unas milesimas o centesimas de segundo pero despues vuelve a su velocidad normal, despues vuelve a acelerar y despues vuelve a su velocidad normal y asi sucesivamente, y lo que yo quiero es que ande siempre a la misma velocidad, no se si sera problema de la velocidad de mi computadora o quizas sea algun error que cometi en la codificacion, por eso les pido ayuda, les dejo mi codigo, una captura del juego, el sprite de la nave y el fondo espacial.

Solamente llevo 1 año y 3 meses programando en Java, pero si me ayudan, podre surgir mas rapido :D

NOTA 1: El compilador que use es el Netbeans 7.2

NOTA 2: Si el programa les lanza una excepcion, es por que las imagenes que les acabo de mandar no tiene el mismo nombre a como sale especificado en el programa, o por que quizas no lo guardaron en donde se almacenan las clases (Ya que esta programado para que las imagenes las obtengan en la carpeta donde se guardan las clases)

LA CLASE PRINCIPAL

package ejercicio267;

import javax.swing.JFrame;

public class Ejercicio267 {

   public static void main(String[] args) {
       
       JFrame ventana = new JFrame("Naves espaciales");
       Panel panel = new Panel();
       
       ventana.add(panel);
       ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       ventana.setSize(panel.getWidth(),panel.getHeight());
       ventana.setResizable(false);
       ventana.setVisible(true);
       
   }
}


LA CLASE PANEL

package ejercicio267;

import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.ImageIcon;
import java.awt.Image;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Panel extends JPanel implements ActionListener {
   
   private Image fondoEspacial;
   private Nave naves[] = new Nave[5];
   private int contadorNaves = 0;
   
   /* Constructor del Panel, inicializa su dimension, su fondo espacial y crea
    * las naves
    */
   
   public Panel(){
       
       setSize(500,500);
       fondoEspacial = (new ImageIcon(getClass().getResource("espacio.gif"))).getImage();
       
       naves[0] = new Nave(210,20);
       naves[1] = new Nave(80,75);
       naves[2] = new Nave(420,130);
       contadorNaves += 3;
       
       Timer temporizador = new Timer(1,this);
       temporizador.start();
       
   }
   
   // Metodo llamado por Timer para actualizar y mover las naves
   
   public void actionPerformed(ActionEvent evento){
       
       for(int i=0; i<contadorNaves;i++){
           
           if(naves[i].getCoordenadaX() == getWidth() - 45){
               
               naves[i].setDireccion(-1);
               
           }else{
               
               if(naves[i].getCoordenadaX() == 0){
                   
                   naves[i].setDireccion(-1);
                   
               }
           }
           
           if(naves[i].getDireccion() == 1){
               
               naves[i].setCoordenadaX(1);
               naves[i].setCoordenadaY(0);
               repaint();
               
           }else{
               
               if(naves[i].getDireccion() == -1){
                   
                   naves[i].setCoordenadaX(-1);
                   naves[i].setCoordenadaY(0);
                   repaint();
                   
               }
           }

       }
       
       
   }
   
   // Metodo que actualiza y dibuja en el Panel
   
   public void paintComponent(Graphics g){
       
       super.paintComponent(g);
       
       g.drawImage(fondoEspacial,0,0,getWidth(),getHeight(),this);
       
       for(int i=0; i<contadorNaves; i++){
           
           naves[i].moverNave(g,this);
           
       }
       
   }
   
}


LA CLASE NAVE

package ejercicio267;

import javax.swing.ImageIcon;
import java.awt.Image;
import java.awt.Graphics;

public class Nave {
   
   //Posicion X de la nave en el espacio
   private int coordenadaX;
   
   //Posicion Y de la nave en el espacio
   private int coordenadaY;
   
   //Puntos de salud de la nave    
   private int hpNave;
   
   //Puntos de ataque de la nave
   private int apNave;
   
   //La direccion que se mueve la nave, 1 a la derecha y -1 a la izquierda
   private int direccionNave;
   
   //El respectivo sprite de la nave
   private Image naveSprite;
   
   /* Constructor de la clase, inicializa sus coordenadas de partida, su respec
    * tivo sprite, ademas de su direccion de movimiento
    */  
   public Nave(int coordenadaX, int coordenadaY){
       
       this.coordenadaX = coordenadaX;
       this.coordenadaY = coordenadaY;
       naveSprite = (new ImageIcon(getClass().getResource("nave.png"))).getImage();
       direccionNave = 1;
       
   }
   
   // Metodo que establece una nueva coordenada X
   public void setCoordenadaX(int coordenadaX){
       
       this.coordenadaX += coordenadaX;
       
   }
   
   // Metodo que establece una nueva coordenada Y  
   public void setCoordenadaY(int coordenadaY){
       
       this.coordenadaY += coordenadaY;
       
   }
   
   // Metodo que obtiene la coordenada X
   public int getCoordenadaX(){
       
       return coordenadaX;
       
   }
   
   // Metodo que obtiene la coordenada Y
   public int getCoordenadaY(){
       
       return coordenadaY;
       
   }
   
   // Metodo que establece una nueva direccion de movimiento de la nave
   public void setDireccion(int dir){
       
       direccionNave = direccionNave * dir;
       
   }
   
   // Metodo que obtiene la direccion de la nave
   public int getDireccion(){
       
       return direccionNave;
       
   }
   
   // Metodo que dibuja la nave con su nueva posicion en el panel
   public void moverNave(Graphics g, Panel panel){
       
       g.drawImage(naveSprite,coordenadaX,coordenadaY,45,45,panel);
       
   }
   
}








#69
Mi programa es sencillo, es aprovechar de usar las librerias Swing y AWT para crear un pizarrón que dibuje solamente lineas, se me ocurrio crear una clase que extienda a JPanel con color blanco, le puse una barra de estado en la parte inferior del panel para que vaya indicando la posición del puntero, ademas, a JPanel le agregue eventos del mouse, de tal manera que se implementara mouseMoved para que indique la coordenada del puntero al moverse, tambien el mouseDragged con la intencion de que la linea se alargara mientras la estiro con el mouse, es ahi el gran problema, yo quiero que mi programa se vea como la linea se estira cuando se este moviendo el Mouse con el boton presionado y al momento de soltar el boton que quede dibujado en la pizarra, pero no me funciona, lo unico que hace es que la linea se muestra una vez que se solto el boton y yo quiero que en todo momento se vea como se alarga, pondre unas capturas y el codigo, ojala me puedan ayudar, he investigado en muchas partes pero no encuentro la solucion.

LA CLASE PRINCIPAL

package ejercicio210;

import javax.swing.JFrame;

public class Ejercicio210 {

    public static void main(String[] args) {
       
        JFrame ventana = new JFrame("Panel de dibujo");
        Panel panel = new Panel();
       
        ventana.add(panel);
        ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ventana.setSize(300,300);
        ventana.setResizable(false);
        ventana.setVisible(true);
       
    }
}



LA CLASE PANEL(LA PIZARRA)

package ejercicio210;

import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.Graphics;

public class Panel extends JPanel {
   
    private JLabel etiquetaInferior;
    private JPanel panelInferior;
    private Linea linea;
    private Linea lineasDibujadas[] = new Linea[100];
    private int contadorLineas = 0;
   
    public Panel(){
       
        setLayout(new BorderLayout());
        setBackground(Color.WHITE);
       
        panelInferior = new JPanel();
        etiquetaInferior = new JLabel("Puntero fuera del panel");
        panelInferior.setLayout(new BorderLayout());
        panelInferior.add(etiquetaInferior,BorderLayout.WEST);
        add(panelInferior,BorderLayout.SOUTH);
        addMouseListener(new EventoMouse());
        addMouseMotionListener(new EventoMouse());
       
    }
   
    private class EventoMouse extends MouseAdapter implements MouseMotionListener {
       
        public void mousePressed(MouseEvent evento){
           
            linea = new Linea(evento.getX(),evento.getY(),evento.getX(),evento.getY());
            repaint();
           
        }
       
        public void mouseDragged(MouseEvent evento){
           
            linea.setFinalX(evento.getX());
            linea.setFinalY(evento.getY());
            etiquetaInferior.setText(String.format("%d,%d",evento.getX(),evento.getY()));
            repaint();
           
        }
       
        public void mouseReleased(MouseEvent evento){
           
            lineasDibujadas[contadorLineas] = linea;
            contadorLineas++;
            repaint();
           
        }
       
        public void mouseMoved(MouseEvent evento){
           
            etiquetaInferior.setText(String.format("%d,%d",evento.getX(),evento.getY()));

        }
       
    }
   
    public void paintComponent(Graphics g){
       
        super.paintComponent(g);
       
        for(int i=0; i<contadorLineas; i++){
           
            lineasDibujadas[i].dibujar(g);
           
        }
       
 

       
    }
   
   
}


LA CLASE LINEA

package ejercicio210;

import java.awt.Graphics;

public class Linea {
   
    private int origenX;
    private int origenY;
    private int finalX;
    private int finalY;
   
    public Linea(int origenX, int origenY, int finalX, int finalY){
       
        this.origenX = origenX;
        this.origenY = origenY;
        this.finalX = finalX;
        this.finalY = finalY;
       
    }
   
    public void setFinalX(int finalX){
       
        this.finalX = finalX;
       
    }
   
    public void setFinalY(int finalY){
       
        this.finalY = finalY;
       
    }
   
    public void dibujar(Graphics g){
       
        g.drawLine(origenX,origenY,finalX,finalY);
       
    }
   
}






#70
Java / Re: Ayuda con Eventos y libreria Swing
5 Febrero 2013, 20:52 PM
Gracias por sus ayudas, me sirvió, ahora el programa funciona sin problemas, y acerca del manejo de las excepciones, lo tendré en cuenta para que mis programas sean mas robustos.