本当に自分の投稿を実際に見たことがある人にとっては、自分のスプライトシートを私が望むように表示できるようになりました。ここに私のコードは次のとおりです。スクロールバーとイメージのサイズ変更の問題を追加する
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
public class AnimTest
{
public static void main(String[] args)
{
AnimTest test = new AnimTest();
test.go();
}
public void go()
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyDrawP drawP = new MyDrawP();
frame.getContentPane().add(drawP);
frame.setSize(640,640);
frame.setVisible(true);
frame.setResizable(true);
}
}
class MyDrawP extends JPanel
{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
try {
BufferedImage bigImg = ImageIO.read(new File("C:/Users/scott/Desktop/Personal Work/Pixel Art/terrain.png"));
final int width = 64;
final int height = 64;
final int rows = 5;
final int cols = 16;
final int mapX = 10;
final int mapY = 8;
BufferedImage[][] sprites = new BufferedImage[cols][rows];
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
//System.out.println("J is: " + j);
//System.out.println("I is: " + i);
//System.out.println("i * width is: " + i * width);
//System.out.println("j * height is: " + j * height);
//System.out.println("");
sprites[j][i] = bigImg.getSubimage(j * width, i * height, width, height);
//g.drawImage(sprites[j][i], 5, 5, this);
}
}
for (int i = 0; i < mapX; i++)
{
for (int j = 0; j < mapY; j++)
{
ArrayList<BufferedImage> spriteListRoad = new ArrayList<BufferedImage>();
BufferedImage road4way = sprites[0][0];
spriteListRoad.add(road4way);
BufferedImage roadS = sprites[1][0];
spriteListRoad.add(roadS);
BufferedImage roadV = sprites[2][0];
spriteListRoad.add(roadV);
BufferedImage roadH = sprites[3][0];
spriteListRoad.add(roadH);
BufferedImage roadEndU = sprites[4][0];
spriteListRoad.add(roadEndU);
BufferedImage roadEndL = sprites[5][0];
spriteListRoad.add(roadEndL);
BufferedImage roadEndR = sprites[6][0];
spriteListRoad.add(roadEndR);
BufferedImage roadEndD = sprites[7][0];
spriteListRoad.add(roadEndD);
BufferedImage roadLU = sprites[8][0];
spriteListRoad.add(roadLU);
BufferedImage roadRU = sprites[9][0];
spriteListRoad.add(roadRU);
BufferedImage roadLD = sprites[10][0];
spriteListRoad.add(roadLD);
BufferedImage roadRD = sprites[11][0];
spriteListRoad.add(roadRD);
BufferedImage roadUT = sprites[12][0];
spriteListRoad.add(roadUT);
BufferedImage roadLT = sprites[13][0];
spriteListRoad.add(roadLT);
BufferedImage roadRT = sprites[14][0];
spriteListRoad.add(roadRT);
BufferedImage roadDT = sprites[15][0];
spriteListRoad.add(roadDT);
ArrayList<BufferedImage> spriteListRiver = new ArrayList<BufferedImage>();
BufferedImage riverV = sprites[0][1];
spriteListRiver.add(riverV);
BufferedImage riverH = sprites[1][1];
spriteListRiver.add(riverH);
BufferedImage riverLU = sprites[2][1];
spriteListRiver.add(riverLU);
BufferedImage riverRU = sprites[3][1];
spriteListRiver.add(riverRU);
BufferedImage riverLD = sprites[4][1];
spriteListRiver.add(riverLD);
BufferedImage riverRD = sprites[5][1];
spriteListRiver.add(riverRD);
BufferedImage riverRoadV = sprites[6][1];
spriteListRiver.add(riverRoadV);
BufferedImage riverRoadH = sprites[7][1];
spriteListRiver.add(riverRoadH);
ArrayList<BufferedImage> spriteListTerrain = new ArrayList<BufferedImage>();
BufferedImage grass = sprites[0][2];
spriteListTerrain.add(grass);
BufferedImage trees = sprites[1][2];
spriteListTerrain.add(trees);
BufferedImage mountain = sprites[2][2];
spriteListTerrain.add(mountain);
ArrayList<BufferedImage> spriteListOre = new ArrayList<BufferedImage>();
BufferedImage copper = sprites[0][3];
spriteListOre.add(copper);
BufferedImage dornite = sprites[1][3];
spriteListOre.add(dornite);
BufferedImage kryz = sprites[2][3];
spriteListOre.add(kryz);
BufferedImage iron = sprites[3][3];
spriteListOre.add(iron);
BufferedImage shallux = sprites[4][3];
spriteListOre.add(shallux);
BufferedImage mithril = sprites[5][3];
spriteListOre.add(mithril);
ArrayList<BufferedImage> spriteListWood = new ArrayList<BufferedImage>();
BufferedImage oak = sprites[0][4];
spriteListWood.add(oak);
BufferedImage olive = sprites[1][4];
spriteListWood.add(olive);
BufferedImage rath = sprites[2][4];
spriteListWood.add(rath);
BufferedImage yew = sprites[3][4];
spriteListWood.add(yew);
BufferedImage eeth = sprites[4][4];
spriteListWood.add(eeth);
BufferedImage ebony = sprites[5][4];
spriteListWood.add(ebony);
g.drawImage(spriteListTerrain.get((int) (Math.random() * 3)), i* width, j * height, this); //this one works by itself
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
そして、ここでは私の質問です。なぜ私はこのコードを実行すると、ウィンドウのサイズを変更するたびに再度実行され、マップが再作成されるのですか?私はスクロールバーを追加することでそれを修正するかもしれないと思ったが、どのようにそれらを追加するのか分からない。サイズを変更するたびにコードを再ループさせないようにするにはどうすればよい?
ありがとうございました。
このメソッドを試してみるためにコードを修正しました。Iveは、paintImageを除いてpaintComponentからすべてを取得しようとしましたが、drawImageはPaintComponentに何も渡すことが不可能であるため、何を描画するのか分かりません。 また、私のマップ作成プログラムの全ポイントは、ランダムマップを持つことでした。私が描画コードのランダムを取り除くなら、それは私が望むことを決してしません。 私のコードは混乱していましたが、あなたの示唆はそれほど意味がありません。 – sekimberly52
paintComponentメソッドをどのように呼び出すのですか?グラフィックスは定義されていないと不平を言っていますが、システムが単にメソッドを実行してデフォルトでそれを作るまでは決して定義することはできません。 – sekimberly52
「createMap」というメソッドがあるとします。これにより、バッファリングされたイメージ上にランダムマップが作成されます。このバッファされたイメージはpaintComponent()メソッドでペイントされます。マップを変更する場合は、「createMap」メソッドを再度呼び出す必要があります。マップのランダム化は、paintComponent()メソッド自体で行うべきではありません。コンポーネントの再描画を強制し、コンポーネントのrepaint()メソッドを呼び出します。おそらく、[カスタムペインティングアプローチ](http://tips4java.wordpress.com/2009/05/08/custom-painting-approaches/)の「画像上の描画」の例は、基本を助けます。 – camickr