1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
class Car {
Point pos = new Point();
double angle = 0;
BufferedImage sprite = ...
...
}
class MapPanel extends JPanel {
public static enum RenderMethod {
OFFSCREEN_RENDERING, ACTIVE_RENDERING
}
private RenderMetod renderMethod = OFFSCREEN_RENDERING;
private BufferedImage offscreenImage;
private BufferedImage sourceMap = ...
private java.util.List<Car> carList = ...
...
// Reaction quand les voitures se deplacent et qu'il faut redessiner la map mise-a-jour.
if (modified) {
// Dans cette methode l'image est rendue en dehors de la periode de re-dessin. Ceci peut-etre eventuellement gere dans une thread a part.
if (renderingMethod == OFFSCREEN_RENDERING) {
// Creer l'image offscreen si necessaire.
if (offscreeImage == null) {
// Verifier si besoin de creer une image transparente.
offscreenImage = new BufferedImage(sourceMap.getWidth(), sourceMap.getHeight(), BufferedImage.TYPE_INT_RGB);
}
Graphics2D g2d = offscreenImage.createGraphics();
try {
drawContent(g2d, offscreenImage.getWidth(), offscreenImage.getHeight());
}
finally {
g2d.dispose();
}
}
repaint();
}
...
protected void paintComponent(Graphics g) {
// Pas la peine d'appeler super.paintComponent si le panel n'a pas de bords et que l'image/map couvre toute la surface du panel et n'est pas transparente).
if (renderingMethod == OFFSCREEN_RENDERING) {
if (offscreenImage != null) {
graphics.drawImage(offscreenImage, 0, 0, null);
}
}
else {
Insets insets = getInsets();
Dimension size = getSize();
int width = size.widht-(insets.left+insets.right);
int height = size.height-(insets.top+insets.bottom);
Graphics2D g2d = (Graphics2D) g.create(insets.left, insets.top, width, height);
try {
drawContent(g2d, width, height);
}
finally {
g2d.dispose();
}
}
}
private void drawContent(Graphics2D graphics, int width, int height) {
graphics.drawImage(sourceMap, 0, 0, null);
...
for (Car car : carList) {
// Dans le cas ou il y a plusieurs threads (nottement une qui deplace les voitures) penser a cacher les valeurs (car.pos.x, ...) localement dans des variables.
graphics.translate(car.pos.x, car.pos.y);
graphics.rotate(car.angle);
// On dessine la voiture "autour" du point.
graphics.drawImage(car.sprite, -car.sprite.getWidth()/2, -car.sprite.getHeight()/2, null);
graphics.rotate(-car.angle);
graphics.translate(-car.pos.x, -car.pos.y);
}
...
}
} |
Partager