Inicio > Java2D, Tutoriales > Crear lluvia en Java

Crear lluvia en Java

Saludos amigos, les traigo un pequeño ejemplo de como poner lluvia en Java. Es algo súper chévere y sabiendo combinar las imágenes de fondo podremos tener un buen efecto. A lo mejor les sirve para los que estén desarrollando su propio plataformas y quieran poner un escenario con lluvia. Bueno a lo que vinimos:

package lluvia;

/**
 *
 * @author gmedinac
 */

 import java.awt.*;
 import java.awt.geom.*;
 import java.awt.event.*;
 import java.util.*;
 import javax.swing.*;
 import java.awt.Image;
 import javax.swing.ImageIcon;

public class Lluvia extends JApplet{
 private Image imagen_fondo;
 public static void main(String s[]) {
 JFrame frame = new JFrame();
 frame.setTitle("LLuvia Java");
 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 JApplet applet = new Lluvia();
 applet.init();
 frame.getContentPane().add(applet);
 frame.pack();
 frame.setVisible(true);
 }

 public void init() {
 JPanel panel = new Panel();
 getContentPane().add(panel);   

 }
}

class Panel extends JPanel implements Runnable{
 Point2D.Double[] pts = new Point2D.Double[1200];
 Image imagen_fondo = new ImageIcon(this.getClass().getResource("/recursos/calle07.jpg")).getImage();
 private int alto, ancho;

 public RainPanel() {
 ancho = 200;
 alto = 274;

 setPreferredSize(new Dimension(ancho, alto));
 setBackground(Color.BLACK);
 for (int i = 0; i < pts.length; i++) {
 pts[i] = new Point2D.Double(Math.random(), Math.random());
 }
 Thread thread = new Thread(this);
 thread.start();
 }

 public void paintComponent(Graphics g) {
 super.paintComponent(g);
 Graphics2D g2d = (Graphics2D)g;
 g2d.drawImage(imagen_fondo, 0, 0, this);      

 g.setColor(Color.LIGHT_GRAY);
 for (int i = 0; i < pts.length; i++) {
 int x = (int)(ancho*pts[i].x);
 int y = (int)(alto*pts[i].y);
 int h = (int)(5*Math.random());
 g.drawLine(x, y, x, y+h);
 }
 }

 public void run() {
 while(true) {
 for (int i = 0; i < pts.length; i++) {
 double x = pts[i].getX();
 double y = pts[i].getY();
 y += 0.9*Math.random();
 if (y > 1) {
 y = 0.9*Math.random();
 x = Math.random();
 }
 pts[i].setLocation(x, y);
 }
 repaint();
 try {
 Thread.sleep(70);
 } catch (InterruptedException ex) {}
 }
 }
}

Este es el código de las dos clases usadas las dos las tengo en el mismo archivo .java. Ahora explicare un poco el funcionamiento del código:

Ahora tenemos un Array que almacena las posiciones de las líneas para la lluvia. Lo inicializamos con valores aleatorios.

Point2D.Double[] pts = new Point2D.Double[1200];
pts[i] = new Point2D.Double(Math.random(), Math.random());

El método paintComponent dibuja las líneas verticales basada en el valor del arreglo.

 public void paintComponent(Graphics g) {
 super.paintComponent(g);
 Graphics2D g2d = (Graphics2D)g;
 g2d.drawImage(imagen_fondo, 0, 0, this);      

 g.setColor(Color.LIGHT_GRAY);
 for (int i = 0; i < pts.length; i++) {
 int x = (int)(ancho*pts[i].x);
 int y = (int)(alto*pts[i].y);
 int h = (int)(5*Math.random());
 g.drawLine(x, y, x, y+h);
 }
 }

El método run contiene un loop infinito que actualiza las posiciones de las líneas en el arreglo pts. Cada punto se incrementa con un valor aleatorio en la coordenada-y.

Cuando una línea llega al fondo el punto es reiniciado con una posición aleatoria al principio de la pantalla o en él TOP de la pantalla. Después de que el arreglo es actualizado el método repaint es llamado para volver a pintar la pantalla.

Pueden aplicarlo y ver los resultados pueden hacer varias pruebas con imágenes haber como se ve mejor. No soy muy bueno haciendo las combinaciones y en este ejemplo hice varias combinaciones de imágenes de fondo, como pueden apreciar.

Proyecto Lluvia

Imagen del Proyecto Lluvia

Este ejemplo es algo que aprendí hace unos días, y me parece un buen complemento para proyectos como los plataformas 2D o lo que sea. Les adjunto las imagenes finales del proyecto y una vez mas disculpas por el formato y la manera de postear ya pronto ire mejorando, lo estoy haciendo de a poco es que el Final Fantasy XII me tiene enganchado y del trabajo llego a jugar.

Lluvia

Proyecto Lluvia

Categorías:Java2D, Tutoriales Etiquetas: ,
  1. noviembre 28, 2009 a las 12:23 am

    uuoo
    se ve Interesante eso de la lluvia
    bueno…estoy con un proyecto de animacion en java
    algo sencillo con Threads y Applets
    creo servira de mucho
    Gracias

    • noviembre 28, 2009 a las 6:46 am

      Espero te pueda servir y cuando termines tu proyecto me lo enseñes. Saludos gracias por comentar.

  2. joel
    abril 25, 2010 a las 12:13 pm

    puedes subir el proyecto completo por favor..me parece muy interesante el tema..

  3. abril 25, 2010 a las 12:43 pm

    De momento no tengo a la mano el proyecto, pero solo basta con crear un clase llamada lluvia, pegas el codigo de arriba que es la clase completa. Luego creas un nuevo paquete le llamas “recursos” y agregas la imagen solo arrastrandola dentro del paquete. Y listo ya tienes el proyecto.

  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: