Motionblur effect in 2D

Simple motionblur effect:
Make Image ( for buffer ) with Type =TYPE_INT_ARGB
On this image draw all graphic.
And for clear screen(=buffer image) use:
g.setColor(new Color(0, 0, 0, 70));//alpha color-it is our motion blur
g.fillRect(0, 0, width, heyght);

Samples:

http://img822.imageshack.us/img822/2392/qwe2.th.png


http://img339.imageshack.us/img339/2696/qwek.th.png

Code(applet):


package motionblur;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

/**
 *
 * @author Danil
 *
 *
 */
public class motion extends Applet implements Runnable {

    int delay = 30;
    int heyght = 300;
    int width = 500;

    public void start() {
        new Thread(this).start();
    }

    public void run() {
        int x = 170, y = 120;
        int xc[] = {0, 100, 200};
        int yc[] = {0, 0, 0};
        double cnt = 0;
        boolean d = true;
        setSize(width, heyght);
        BufferedImage screen = new BufferedImage(width, heyght, BufferedImage.TYPE_INT_ARGB);
        Graphics g = screen.getGraphics();
        Graphics appletGraphics = getGraphics();
        appletGraphics.setColor(Color.white);
        appletGraphics.fillRect(0, 0, width, heyght);
        appletGraphics.setColor(Color.black);
        appletGraphics.drawString("loading...", heyght / 2 - 5, width / 2 - 80);

        BufferedImage r = new BufferedImage(15, 15, BufferedImage.TYPE_INT_ARGB);
        BufferedImage gr = new BufferedImage(15, 15, BufferedImage.TYPE_INT_ARGB);
        BufferedImage b = new BufferedImage(15, 15, BufferedImage.TYPE_INT_ARGB);
        Graphics rg = r.getGraphics();
        Graphics grg = gr.getGraphics();
        Graphics bg = b.getGraphics();
        rg.setColor(Color.red);
        rg.fillOval(0, 0, 15, 15);
        grg.setColor(Color.green);
        grg.fillOval(0, 0, 15, 15);
        bg.setColor(Color.blue);
        bg.fillOval(0, 0, 15, 15);

        int tick = 0, fps = 0, acc = 0;
        long lastTime = System.nanoTime();

        appletGraphics.setColor(Color.black);
        appletGraphics.fillRect(0, 0, width, heyght);
        while (true) {

            long now = System.nanoTime();
            acc += now - lastTime;
            tick++;
            if (acc >= 1000000000L) {
                acc -= 1000000000L;
                fps = tick;
                tick = 0;
            }

            lastTime = now;
            
            //motion blur :)
            g.setColor(new Color(0, 0, 0, 70));
            g.fillRect(0, 0, width, heyght);
            
            
            g.drawImage(r, x, y, this);
            g.drawImage(r, xc[0], yc[0], this);
            g.drawImage(gr, x + 15, y + 15, this);
            g.drawImage(gr, xc[1], yc[1], this);
            g.drawImage(b, x + 30, y + 30, this);
            g.drawImage(b, xc[2], yc[2], this);
            x = 170 + (int) (50 * Math.cos(cnt));
            y = 120 + (int) (50 * Math.sin(cnt));
            if (d) {
                if (cnt < 180) {
                    cnt += 0.09;
                } else {
                    d = false;
                }
            } else if (cnt > 0) {
                cnt -= 0.09;
            } else {
                d = true;
            }
            if (xc[0] < 300) {
                for (byte i = 0; i < 3; i++) {
                    xc[i] += 3;
                    yc[i] += 3;
                }
            } else {
                for (byte i = 0; i < 3; i++) {
                    xc[i] = 0 + i * 100;
                    yc[i] = 0;
                }
            }


            g.setColor(Color.white);
            g.drawString("FPS " + String.valueOf(fps), 20, 30);

            appletGraphics.drawImage(screen, 0, 0, null);

            try {
                Thread.sleep(delay);
            } catch (Exception e) { /* best practice */ }

            if (!isActive()) {
                return;
            }
        }
    }
}

Sorry for my English :slight_smile: