Foro de elhacker.net

Programación => Java => Mensaje iniciado por: bash en 13 Febrero 2015, 13:45 pm



Título: carga de imagenes y imagenes en moviemientos
Publicado por: bash en 13 Febrero 2015, 13:45 pm
Buenas a todos !!


Estoy  viendo uno videos sobre graficos 2d en youtube  y no estoy copiando pero estoy probando lo que ellos hacen que es mas o menos lo que van a ver (lo tipe yo mismo :)por lo menos  ),

Código
  1. import java.awt.*;
  2. import java.io.*;
  3. import javax.swing.JFrame;
  4. import javax.swing.JPanel;
  5. import java.awt.image.*;
  6.  
  7.  
  8. public class Main  extends JPanel{
  9.  
  10.     int x;
  11.     int vx;
  12.     int y;
  13.     int vy;
  14.  
  15.  
  16.     public void move(){
  17.  
  18.         vy =1;
  19.         vx =1;
  20.  
  21.  
  22.         x = x+vx;
  23.         y = y+vy;
  24.  
  25.     }
  26.  
  27.  
  28.    public void paint(Graphics g){
  29.        super.paint(g);
  30.        Graphics2D g2d = (Graphics2D)g;
  31.        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
  32.             RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
  33.  
  34.     Image im = ImageIO.read(new File("nave.png"));      
  35.        g2d.drawImage(im, x,y,null);
  36.     /////g2d.dispose();///
  37.    }
  38.  
  39.  
  40.    public static void main(String []args){
  41.        Main m = new Main();
  42.          JFrame f = new JFrame("ddd");
  43.          f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  44.          f.setSize(800,800);
  45.         f.getContentPane().add(m);
  46.          f.setVisible(true);
  47.  
  48.          while(true){
  49.            m.repaint();
  50.            m.move();
  51.            try{
  52.  
  53.             Thread.sleep(25);
  54.            }catch(Exception e){}
  55.  
  56.          }
  57.    }
  58.  
  59. }
  60.  



no me reconce ImageIO , quizas puedo usar
Código
  1. .getImage()
pero por que dice que no reconoce el simbolo en la consola y si uso
Código
  1. ToolKit.getDefaultToolkit.getImage(..) , getClass().getResource("").getImage()
si no me equivoco es asi pero quisiera saber por que cuando lo hago la imagen se queda en un punto (inicialize y=0 ,x =0, no lo puse por hacerlo rapido) ,me gustaria saber que puedo hacer para que se muevan o me recomiendan algo, en los tutoriales lo hacen asi ,claro con sus cambios y no quiero copiar.



Título: Re: carga de imagenes y imagenes en moviemientos
Publicado por: Usuario Invitado en 13 Febrero 2015, 15:12 pm
Si las imágenes están en tu proyecto, prueba obteniéndola como recurso.

Código
  1. ImageIO.read(getClass().getResource("/ruta/a/imagen"));

Nótese el slash al principio, ésto indica que se empezará a buscar desde el root: src/.

Respecto a porqué no te pinta la imagen, prueba cambiando paint por paintComponent. Para más simplicidad, puedes llamar el método move() en el método paintComponent.

Código
  1. public void paintComponent(Graphics g){
  2.        super.paintComponent(g);
  3.        Graphics2D g2d = (Graphics2D)g;
  4.        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
  5.             RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
  6.        Image im = ImageIO.read(new File("nave.png"));      
  7.        g2d.drawImage(im, x,y,null);
  8.        move();
  9. }

Salu2.


Título: Re: carga de imagenes y imagenes en moviemientos
Publicado por: 3n31ch en 13 Febrero 2015, 15:23 pm
Añadiendo al aporte de mi compañero, hay diferencias entre paint y paintComponent, lo puedes ver en la API.

Si mal no me equivoco paint abarca todo lo del panel (pinta el panel y sus componentes) sin embargo paintComponent solo pinta el panel.

Recomiendo el uso de paintComponent frente a paint.

El porque no te reconoce ImageIO, pues muy facil, no lo importaste.

Código
  1. import javax.imageio.ImageIO;

En segundo, (no vi tu codigo entero, ya que ya tienes una respuesta de Gus) pero por lo que vi me gustaria agregar que no hagas un add en el JFrame, mas bien haz lo siguiente:

Código
  1. f.setContentPane(m);

De esta manera remplazaras el contenedor por defecto del JFrame por tu JPanel. (Actualmente lo que hacías era añadir un contenedor sobre el contenedor, mejor remplazarlo no?)

Tambien ten en cuenta que al hacer un JFrame.setSize(800,800) estas diciendo que tu JFrame mida 800,800 (incluyendo los bordes del mismo), si quieres que el panel mida 800, 800

debes hacer lo siguiente:

Código
  1. JPanel panel = new JPanel();
  2.  
  3. panel.setPreferredSize(new Dimension(800,800));
  4.  
  5. JFrame frame = new JFrame();
  6. frame.setContentPane(panel);
  7. frame.pack(); // Pack ajusta el tamaño del Frame al de sus componentes
  8.  
  9. // Recuerda que si haces un setResizable(false); esto lo tienes que hacer antes del pack() ya que setRezisable(false); modifica el tamaño tambien

Por otro lado, me gustaría saber algo que ya me esta matando (ultima mente muchos están con lo mismo)

Porque haces todo en un mismo archivo?

Por convención no  debe haber mas de una clase en un mismo archivo, amenos que la segunda clase (o tercera...) sea privada.

También tienes que evitar utilizar la encapsulacion Friendly (Encapsulacion por default, se define al no poner private, public o protected).

No crees clases sin un modificador de acceso. Las clases deben ser o Public o Private.

(Solo puede haber una clase publica por archivo)

Suerte ^^.