En este tutorial se muestran los pasos para crear una animación sencilla utilizando Java2d y el IDE Netbeans. La animación consistira en una pelota de futbol que se movera de un lado a otro de un contenedor JPanel.
¿Que necesitamos?
Proyecto.
1. Crea un nuevo proyecto en netbeans, yo lo llame proyecto «jcbola» 🙂 , continuemos. Añade una clase JFrame, llamala «interfaz.java», añade tambien dos clases las cuales debes llamar «pelota.java» y «panel.java».
La estructura de la interfaz comprende un objeto jmenu y dos submeus, jmenuitem1 y jmenuitem2, ademas se coloca en el jframe un JPanel, puedes ver como queda en la imagen siguiente:
Es todo por el monento en la clase interfaz, el codigo restante lo escribiremos mas adelante, ahora debemos añadir codigo al resto de las clases que creamos.
2.Continuamos con la clase pelota.java, esta clase, como su nombre lo indica, es la pelota de futbol en si, utiliza una imagen PNG de una pelota de futbol de dimensiones 50×50 pixeles, esta imagen se encuentra en el mismo paquete que las demas clases. El resto del código tanto los metodos y variables, esta en un espanglish que creo que esta perfectamente entendible
Clase pelota.java
package jcbola; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import javax.swing.ImageIcon; /** * @web http://jc-mouse.blogspot.com/ * @author Mouse */ public class pelota { private Image balon; //Coordenadas de la pelota private int X; private int Y; private int velocidad_X; private int velocidad_Y; private int limite_izquierda=0; private int limite_derecha; private int limite_superior=0; private int limite_inferior; public pelota(int x, int y) { //coordenadas iniciales this.X = x; this.Y = y; //imagen de la pelota balon = new ImageIcon(getClass().getResource("pelota.png")).getImage(); } //dado las dimensiones del contendor JPanel public void LimitesXY(int width, int height) { limite_derecha = width - balon.getWidth(null); limite_inferior = height - balon.getHeight(null); } //recalcula variables para dar la sensacion de movimiento public void move() { //nueva posicion X += velocidad_X; Y += velocidad_Y; //controla que la pelota no salga de los limites del contenedor if (X < this.limite_izquierda) { X = 0; velocidad_X = -velocidad_X; } else if (X > limite_derecha) { X = limite_derecha; velocidad_X = -velocidad_X; } if (Y < this.limite_superior) { Y = 0; velocidad_Y = -velocidad_Y; } else if (Y > limite_inferior) { Y = limite_inferior; velocidad_Y = -velocidad_Y; } } public void setVelocidadXY(){ velocidad_X = getNumberRandom(4); velocidad_Y = getNumberRandom(8); } public void dibujar(Graphics g) { Graphics2D g2 = (Graphics2D)g; g2.drawImage(balon, X, Y, null); } //devuelve un número aleatorio entre 1 y MAX private int getNumberRandom(int Max){ return (int) (Math.random()*Max+1); } }
3. Nos toca ahora añadir el código necesario a nuestra clase panel.java, esta clase se extiende de un JPanel y es aqui donde se realiza la animación, para lo cual hacemos uso de un TIMER, este timer nos permite pintar el movimiento de la pelota cada cierto tiempo ( 16 milisegundos). Esta clase, hace uso de la clase anterior, pelota.java.
package jcbola; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.Timer; /** * @web http://jc-mouse.blogspot.com/ * @author Mouse */ public class panel extends JPanel{ //instancia a la pelota en posicion (X,Y) => (0,0) private pelota mipelota = new pelota(0, 0); private Timer timer; //Constructor public panel(Dimension d) { this.setSize(d); this.setPreferredSize(d); this.setBorder(BorderFactory.createLineBorder(Color.BLACK)); this.setBackground(new Color(0,255,0)); mipelota.LimitesXY(getWidth(), getHeight()); //para la animación timer = new Timer(16, new ActionListener (){ public void actionPerformed(ActionEvent e) { mipelota.move(); repaint(); } }); } //Controla el inicio y fin de la animación public void animar(boolean turnOnOff) { if (turnOnOff) { mipelota.setVelocidadXY(); timer.start(); } else { timer.stop(); } } //pinta la animación @Override public void paintComponent(Graphics g) { super.paintComponent(g); mipelota.dibujar(g); } }
4. Más dificil no podia estar, porque ya terminamos :), solo nos falta implementar estas clases en nuestra interfaz, vamos a la parte del codigo de nuestra interfaz.java, añadimos el codigo :
//instancia a mi clase panel.java panel mipanel; /** Creates new form interfaz */ public interfaz() { initComponents(); setTitle( "Java2D Animación by Mouse" ); setLocationRelativeTo(null); //se crea instancia a panel de animacion y se añade a la interfaz mipanel=new panel( this.jPanel1.getSize() ); this.jPanel1.add(mipanel); } //esto para los eventos de los submenus private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) { mipanel.animar(true); } private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) { mipanel.animar(false); }
NOTA: No copies y pegues el código, estudialo y ve donde va cada parte. Por demas esta decir de que esta interfaz debes llamarlos desde la clase main.java.
Terminamos el proyecto, compila y ejecuta el programa, te dejo tambien un video para que hagas una comparación de tu trabajo.
Enlace de descarga: http://link.jc-mouse.net/?id=J2DBALLJM9
Modelo Vista Controlador (MVC) es un patrón de arquitectura de software que separa los datos de una aplicación, la inter[...]
Acierta los colores o Adivina los colores es un sencillo juego que consiste en que dado 6 colores «rojo», «verde», «salm[...]
Melody.ml es un aplicación online que usa la I.A (Inteligencia Artificial) para procesar archivos MP3 y separar en pist[...]
Continuando el post de «Introducción a Retrofit» donde realizamos una breve preparación a lo que es el uso de la librerí[...]
El diseño web adaptable (Responsive Web Design) va evolucionando como una filosofía de diseño y desarrollo de paginas we[...]
Radio.Garden es un proyecto interactivo desarrollado por el Instituto Holandés para el Sonido y la Visión en cooperación[...]