Autor Tema: Duda sobre movimiento imagen (Java).No se mueve como deseo  (Leído 6917 veces)

caludo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 33
    • Ver Perfil
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


Código: [Seleccionar]
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;
}

}









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

}

}
}
Código: [Seleccionar]
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!

javi in the sky

  • Avanzado
  • ****
  • Mensajes: 393
    • Ver Perfil
Re:Duda sobre movimiento imagen (Java).No se mueve como deseo
« Respuesta #1 en: 21 de Julio 2015, 23:21 »
Hola!

Lo del valor -1 ó +1 depende del sistema de referencia que utilicemos, es decir, yo puedo decir que estoy yendo hacia arriba pero si lo miro boca abajo diría que estoy yendo hacia abajo. Es decir, un sistema de referencia siempre puede cambiarse y hacerlo al contrario de lo que podría parecernos más lógico.

He intentado ejecutar el código y me sale un error java.lang.NullPointerException null in javax.swing.ImageIcon

Puede ser que falte la imagen de la nave?


caludo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 33
    • Ver Perfil
Re:Duda sobre movimiento imagen (Java).No se mueve como deseo
« Respuesta #2 en: 23 de Julio 2015, 00:24 »
Hola Javi!
Muchas gracias por la respuesta!

A mi en principio no me da ningún error porque si tengo la imagen de la nave, no sé si también debí cargar la imagen en el mensaje anterior,de hecho no se como hacerlo en el foro, pero es una imagen .gif corriente sacada de google.

El programa se me ejecuta sin darme error, pero no de la manera que quiero(en el mensaje anterior lo explico con un poco más de detalle)

Muchas gracias Javi!Saludos
PS. Lo del "1" y "-1" me lo has aclarado!;)

javi in the sky

  • Avanzado
  • ****
  • Mensajes: 393
    • Ver Perfil
Re:Duda sobre movimiento imagen (Java).No se mueve como deseo
« Respuesta #3 en: 24 de Julio 2015, 23:42 »
Hola  :D Puedes insertar imágenes tanto como imagen como adjuntando el archivo según la explicación que se puede leer en https://www.aprenderaprogramar.com/foros/index.php?topic=1460.0

Saludos!

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".