Hola a todos!A ver si alguien me puede echar una mano con un pequeño ejercicio que he visto por internet y del que tengo una pequeña duda.Mi idea es tener una imagen, la cual al pulsar una flecha la imagen siga la direccion de la flecha, y al dejar de pulsar la flecha la imagen se pare. En principio esto es lo que hace este ejercicio, pero hay algo que debo estar haciendo mal ya que la imagen al dejar de pulsar la flecha sigue moviendose, además otro fallo es que si pulso por ejemplo la flechas del eje de la "x"(o sea las flechas derecha e izquierda) la imagen se mueve de manera horizontal PERO sin que se pare la imagen pulso la flecha de arriba/abajo entonces la imagen no sube de manera totalmente vertical.
Otra duda que tengo(esta quizás sea más básica), en la clase Nave, en el método "public void keyPressed(KeyEvent e)" en:
if(key==KeyEvent.VK_UP){
dy=-1;
if(key==KeyEvent.VK_DOWN){
dy=1;
}
La lógica me dice que UP debe ser dy=1 y DOWN dy=-1, o sea al reves de como está en el codigo, ya que al subir, se incrementa la y, o sea se supone que sube en el eje de la "y", pero si lo hago de la manera que es logica para mi, al presionar la flecha de arriba la imagen baja, y al presionar la flecha de abajo la imagen sube..o sea, que mi logica es erronea, pero no entiendo el por qué
Agradecería, si es posible, además de donde falla, la explicación de por qué falla, ya que ahora mismo estoy intentando analizar el funcionamiento de este ejercicio y hay un par de puntos en los que tengo dudas
package naveVoladora;
import java.awt.*;
import java.awt.event.*;
import javax.swing.ImageIcon;
public class Nave {
private String nave="nave.gif";
private int dx;
private int dy;
private int x;
private int y;
private Image imagen; //"Image" es una clase que debemos importar que está dentro de java.awt
public Nave(){
x=40; //inicializamos "x" e "y" en 40 y 60 respectivamente
y=60;
ImageIcon img=new ImageIcon(this.getClass().getResource(nave));//busca un recurso llamado "nave", o sea busca la imagen
//que queremos que se nos muestre en la pantalla
imagen=img.getImage();//Se llama al archivo nave...o sea "extraemos" nuestro archivo para que sea mostrado
}
public void mover(){
//"x" e "y" representan la posicion de la imagen
x+=dx;
y+=dy;
}
public int tenerX(){
return x;
}
public int tenerY(){
return y;
}
public Image tenerImagen(){
return imagen;
}
//eventos que responden al teclado...a continuacion hacemos los metodos de la clase keyAdapter (los metodos
//son keyPressed y keyReleased)
//O sea el "keyPressed" es cuando estamos presionando las teclas y el "keyReleased" es cuando dejamos de presionar las teclas
public void keyPressed(KeyEvent e){
int key=e.getKeyCode();//Creo que obtiene la tecla que estemos pulsando en el teclado(en el video dice "el numero"
//pero la logica me dice que obtiene simplemente la tecla, no solo numero
if(key==KeyEvent.VK_LEFT){//Si se presiona la flecha de la izquierda, dx tendrá un valor de "-1"..y la nave va a la izquierda
dx=-1;
}
if(key==KeyEvent.VK_RIGHT){
dx=1;//Si se presiona la flecha de la derecha, la nave va a la derecha
}
if(key==KeyEvent.VK_UP){
dy=-1; //Si se presiona la flecha de arriba, la nave va hacia arriba
}
if(key==KeyEvent.VK_DOWN){
dy=1; //Si se presiona la flecha de abajo, la nave hacia abajo
}
}
public void keyReleased(KeyEvent e){//Cuando se deja de presionar una tecla
int key=e.getKeyCode();
if(key==KeyEvent.VK_LEFT){
dx=0; //Se da un valor de 0 para que el objeto deje de moverse..asi con cada opcion..
//o sea cuando dejemos de pulsar una flecha la imagen se detendrá
}
if(key==KeyEvent.VK_RIGHT){
dx=0;
}
if(key==KeyEvent.VK_UP){
dy=0;
}
if(key==KeyEvent.VK_DOWN){
dy=0;
}
}
}
package naveVoladora;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Dibujar extends JPanel implements ActionListener{
private Nave nave;//para que todos los metodos la reconozcan(es de suponer que se refiere a la nave)
private Timer timer;
public Dibujar(){
setBackground(Color.white);//Color de fondo
setFocusable(true);//para que el teclado detecte el color de fondo
addKeyListener(new teclado());//se declara la clase teclado
nave=new Nave();
timer=new Timer(15,this);//maneja la velocidad a la que ira la nave(o sea 15 es la velocidad en la que queremos
//que se mueva nuestra imagen
timer.start();//empieza a contar cada 5 milisegundos se efectuara un cambio
}
public void paint(Graphics grafica){//dibujar la nave
super.paint(grafica);//pinta la grafica en la superclase paint
Graphics2D g2=(Graphics2D)grafica;
g2.drawImage(nave.tenerImagen(), nave.tenerX(), nave.tenerY(), null); //dibuja la imagen y
//se llama la funcion y las..
}
@Override
public void actionPerformed(ActionEvent e) {
nave.mover();
repaint();//para que se vuelva a dibujar la imagen en el tablero
}
private class teclado extends KeyAdapter{//Se llama a los 2 eventos que hay
public void keyReleasesd(KeyEvent e){
nave.keyReleased(e);
}
public void keyPressed(KeyEvent e){
nave.keyPressed(e);
}
}
}
package naveVoladora;
import javax.swing.*;
public class Ventana extends JFrame{
public Ventana(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(new Dibujar());//se incluye la clase Dibujar
setTitle("Crear animacion Imagen en Movimiento");
setSize(800,600);
setVisible(true);
setLocationRelativeTo(null);//Para que nuestra ventana se centre
setResizable(false);
}
public static void main(String[]args){
new Ventana();
}
}
Muchisimas gracias por todo y gracias por la ayuda!
Saludos!