images (Bilder)
Import
Das statische Attribut images der Klasse Controller kann über einen statischen Import eingebunden werden:
Bilder laden
Über das statische Attribut Controller.images bzw. den statischen Import import staticpi.Controller.images; werden Bilder als BufferedImage geladen.
import static pi.Controller.images;
import java.awt.image.BufferedImage;
BufferedImage moon = images.get("moon.png");
Der übergebene Name ist ein Ressourcenpfad relativ zum Ressourcenordner.
Die Klasse BufferedImage
BufferedImage ist die Standardklasse in Java für Bilder im Speicher. Sie enthält die Pixel eines Bildes und ermöglicht es, Breite, Höhe und Farbwerte direkt auszulesen oder zu verarbeiten. In Engine Pi liefert der ImageContainer Bilder genau in diesem Format, damit sie direkt in der Figur bzw. im Actor Image verwendet werden können.
Pixel vervielfältigen
Pixelgrafiken lassen sich beim Laden mit Hilfe der Methode get(String, int) mit einem Vergrößerungsfaktor abrufen. Dabei wird jeder Pixel als Block vervielfacht.
import static pi.Controller.images;
import java.awt.image.BufferedImage;
BufferedImage normal = images.get("box.png");
BufferedImage x2 = images.get("box.png", 2);
BufferedImage x3 = images.get("box.png", 3);
Zusätzlich kann global in der Konfiguration GraphicsConfig#pixelMultiplication() gesetzt werden.
Farben in Bildern ersetzen
Die Methode get(String, Color[], Color[]) unterstützt das Ersetzen von Farben direkt beim Abruf.
import static pi.Controller.images;
import java.awt.Color;
import java.awt.image.BufferedImage;
Color[] from = { Color.BLUE };
Color[] to = { Color.RED };
BufferedImage recolored = images.get("box.png", from, to);
BufferedImage recoloredScaled = images.get(
"box.png",
2,
from,
to
);
Bild als Figur verwenden
Die vom ImageContainer geladenen Bilder als BufferedImage können in der Figur bzw. dem Actor Image entweder über den Konstruktor Image#Image(BufferedImage) oder die Setter-Methode Image#image(BufferedImage) verwendet werden.
import static pi.Controller.images;
import pi.Controller;
import pi.Scene;
import pi.actor.Image;
import java.awt.image.BufferedImage;
public class MyScene extends Scene
{
public MyScene()
{
BufferedImage dude = images.get("dude.png")
Image actor = new Image(dude)
.pixelPerMeter(30)
.center(0, 0);
add(actor);
}
public static void main(String[] args)
{
Controller.instantMode(false);
Controller.start(new MyScene());
}
}
Caching und Performance
Der Bildcontainer speichert geladene Bilder intern. Mehrfaches
images.get("...") mit demselben Namen liefert typischerweise dieselbe
Instanz aus dem Cache. Dadurch werden Dateizugriffe reduziert und Ladezeiten
verbessert.
Bei Bedarf kann der Container geleert werden: