Memoryimagesource & double buffer

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 334 fois - Téléchargée 856 fois

Contenu du snippet

- Utilisation de la classe MemoryImageSource
- Double Buffer pour un meilleur rendu

Source / Exemple :


//	Lesson05
//	- MemoryImageSource
//	- PixelGrabber
//	This code is better viewed with tab size=4

import java.applet.Applet;
import java.awt.image.*;
import java.awt.*;

public class Lesson05 extends Applet implements Runnable
{
	int		width,height;		// applet width,height

	int		pixels[];			// pixels array
	Image	target;				// Image
	MemoryImageSource mis;		// MemoryImageSource

	Image	 backImage;			// back Image
	Graphics backGraphics;		// back Graphics

	Thread	thread;				// Thread
	boolean	threadRunning;		// thread running ?

	int		spriteWidth, spriteHeight;
	int		spritePixels[];		// sprite pixels array
	int		spriteX,spriteY;	// Sprite position

	Color	txtColor;			// Text color

	public void init()
	{
		width=Integer.parseInt(getParameter("width"));
		height=Integer.parseInt(getParameter("height"));

		// Init pixels array
		pixels=new int[width*height];
		// Init MemoryImageSource - pixels will be in 32bit ARGB format
		DirectColorModel dcm=new DirectColorModel(32, 0xff0000, 0xff00, 0xff);
		mis=new MemoryImageSource(width,height,dcm,pixels,0,width);
		mis.setAnimated(true);
		mis.setFullBufferUpdates(true);
		target=createImage(mis);
		// Init double buffering
		backImage = createImage(width, height);
		backGraphics = backImage.getGraphics();

		// Load Image
		Image image=getImage(getDocumentBase(),getParameter("image"));
		MediaTracker mediatracker = new MediaTracker(this);
		mediatracker.addImage(image, 0);
		try { mediatracker.waitForID(0); }
		catch(InterruptedException ex) {}
		// Init sprite pixels array
		spriteWidth = image.getWidth(null);
		spriteHeight = image.getHeight(null);
		spritePixels = new int[spriteWidth*spriteHeight];
		// Grab pixels
		PixelGrabber pg= new PixelGrabber(image,0,0,spriteWidth,spriteHeight,spritePixels,0,spriteWidth);
		try { pg.grabPixels(); }
		catch (InterruptedException e) {}
		image=null; mediatracker=null;

		spriteX = width/2;
		spriteY = height/2;

		txtColor = Color.white;
	}

	public void start() {
		if(thread == null)
			thread = new Thread(this);
		threadRunning=true;
		thread.start();
	}

	public void run()
	{
		while (threadRunning)
		{
			try
			{
				Thread.sleep(20);						// sleep a while
			}			
			catch(InterruptedException ex) {}			// catch exception

			drawSprite(spriteX,spriteY);				// draw sprite
			repaint();									// repaint will call update
		}
	}

	public void stop() {
		if(thread != null) {
			threadRunning=false;
			//thread.stop();			// this method has been deprecated
			thread = null;
		}
	}
 
	public void destroy()
	{
	}

	public void paint(Graphics g)
	{
		mis.newPixels(0,0,width,height);
		backGraphics.drawImage(target, 0, 0, this);
		backGraphics.setColor(txtColor);
		backGraphics.drawString("Lesson05",10,20);
		g.drawImage(backImage, 0, 0, this);
	}

	// Overwrite imageUpdate
	public boolean imageUpdate(Image image, int i1, int j1, int k, int i2, int j2) {
		return true;
	}

	public void update(Graphics g)
	{
		paint(g);
	}

	public void drawSprite(int x, int y) {
		int index=(y-spriteHeight/2)*width+(x-spriteWidth/2);
		for (int i=0;i<spriteWidth;i++)
		{
			for (int j=0;j<spriteHeight;j++)
			{
				try { pixels[index+j] = spritePixels[j*spriteWidth+i]; }
				catch (ArrayIndexOutOfBoundsException e) {}
			}
			index+=width;
		}
	}

	public boolean mouseEnter(Event event, int i, int j) {
		setCursor(new Cursor(Cursor.HAND_CURSOR));		// Change mouse cursor
		return true;
	}

	public boolean mouseExit(Event event, int i, int j) {
		setCursor(new Cursor(Cursor.DEFAULT_CURSOR));	// Change mouse cursor
		return true;
	}

	public boolean mouseMove(Event event, int i, int j) {
		spriteX=i;
		spriteY=j;
		return true;
	}

}

A voir également

Ajouter un commentaire Commentaire
Messages postés
22
Date d'inscription
vendredi 10 janvier 2003
Statut
Membre
Dernière intervention
22 mars 2005

Ca a l'air intéressant mais difficile de voir au premier coup d'oeil ce que fait cette applet... un commentaire serait le bienvenu.
Le fichier ZIP est corrompu, on peut voir son contenu mais pas l'extraire.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.