各プレイヤーが複数のユニットを持ち、各ユニットが次の方法でファイルから読み取った共通の画像を使用してユーザーに表示されるボードゲームを実装しています。アプリケーションの起動時にこの画像を読み取り、後で使用します。
private static BufferedImage readBufferedImage (String imagePath) {
try {
InputStream is = IconManager.class.getClassLoader().getResourceAsStream(imagePath);
BufferedImage bimage = ImageIO.read(is);
is.close();
return bimage;
} catch (Exception e) {
return null;
}
}
ユニットは、共通の画像の上にあるさまざまなカラフルなトークンで異なります。
いくつかの commonImages を JPanel に追加する前に、commonImage の上に浮かんでいた JLabels を使用してトークンを実装しました。
//at startup
ImageIcon commonImage = new ImageIcon(readBufferedImage("image.png"));
...
JPanel panel = new JPanel();
panel.add(commonImage);
panel.add(commonImage);
//located JLabels with token on the top of each commonImage
しかし、今は JPanel の代わりに JScrollPane を使用したいので、ユーザーに表示する前に各 commonImage に drawString() と drawImage() を使用する方が良いと思います。
おおよそのユニット数を 20 と見積もっています。したがって、ユニットごとにターンごとに、さまざまなトークン構成でオンザフライで個別の BufferedImage を生成する必要があります。
問題は、トークンの構成に応じて、既に生成された BufferedImages をキャッシュして、同じ構成でイメージが以前に生成された場合にキャッシュから抽出する必要があるかどうかです。