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
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
Código:
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
Código:
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
Código:
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);
}
}