- 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;
}
}
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.