2012-02-12 12 views
1

本当に自分の投稿を実際に見たことがある人にとっては、自分のスプライトシートを私が望むように表示できるようになりました。ここに私のコードは次のとおりです。スクロールバーとイメージのサイズ変更の問題を追加する

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(); 
    } 
} 

}

そして、ここでは私の質問です。なぜ私はこのコードを実行すると、ウィンドウのサイズを変更するたびに再度実行され、マップが再作成されるのですか?私はスクロールバーを追加することでそれを修正するかもしれないと思ったが、どのようにそれらを追加するのか分からない。サイズを変更するたびにコードを再ループさせないようにするにはどうすればよい?

ありがとうございました。

答えて

2

なぜこのコードを実行すると、ウィンドウのサイズを変更するたびに再び実行され、マップが再作成されるのですか?

マップを作成するためのコードは、paintComponent()メソッドにあります。このメソッドは、Swingがコンポーネントを再描画する必要があると判断するたびに呼び出されます。フレームのサイズ変更は、コンポーネントを再描画する必要がある場合の1つです。

このため、paintComponent()メソッドはできるだけ効率的でなければなりません。この方法でI/Oを行うべきではありません。

現在のコードはあまり意味がありません。変数i、jを使用する2つのループがありますが、ハードコードされた値を使用してArrayListを構築します。 i、j変数を使用する唯一の時間はdrawImage()メソッドです。

マップを作成するコードは外部メソッドで行い、paintComponent()メソッドはループ内でdrawImage(..)のみを呼び出す必要があります。

また、drawImage()メソッドはrandom()メソッドを使用するため、paintComponent()メソッドが呼び出されるたびにイメージが変更されます。これはおそらくあなたが望むものではないので、実際にはBufferedImage全体を外部的に作成する必要があります。次に、イメージをJLabelに追加してフレームにラベルを追加すると、パネルにカスタムペイントは必要ありません。

+0

このメソッドを試してみるためにコードを修正しました。Iveは、paintImageを除いてpaintComponentからすべてを取得しようとしましたが、drawImageはPaintComponentに何も渡すことが不可能であるため、何を描画するのか分かりません。 また、私のマップ作成プログラムの全ポイントは、ランダムマップを持つことでした。私が描画コードのランダムを取り除くなら、それは私が望むことを決してしません。 私のコードは混乱していましたが、あなたの示唆はそれほど意味がありません。 – sekimberly52

+0

paintComponentメソッドをどのように呼び出すのですか?グラフィックスは定義されていないと不平を言っていますが、システムが単にメソッドを実行してデフォルトでそれを作るまでは決して定義することはできません。 – sekimberly52

+0

「createMap」というメソッドがあるとします。これにより、バッファリングされたイメージ上にランダムマップが作成されます。このバッファされたイメージはpaintComponent()メソッドでペイントされます。マップを変更する場合は、「createMap」メソッドを再度呼び出す必要があります。マップのランダム化は、paintComponent()メソッド自体で行うべきではありません。コンポーネントの再描画を強制し、コンポーネントのrepaint()メソッドを呼び出します。おそらく、[カスタムペインティングアプローチ](http://tips4java.wordpress.com/2009/05/08/custom-painting-approaches/)の「画像上の描画」の例は、基本を助けます。 – camickr

2

BufferedImageに目的のオブジェクトを描画し、ラベルに入れます。自動的にリサイズされることはありません。

オブジェクトをBIに描画し、単にフレームサイズに合わせてスケーリングすることもできます。これは構築に時間がかかる場合にのみ意味をなさないでしょう。


IDは私が行う方法を知らない一つの大きなBI、にそれらのすべてを保存する必要があります。

明らかに、Graphicsオブジェクトを処理する方法を理解しています。 1つは、getGraphics()またはcreateGraphics()のいずれかを使用してBIから取得できます。

+0

もし私がそれをしなければならなかったら、私は何とか80 BIを一つのBIに凝縮しなければならないでしょう。私のコードは、それが行の終わりに達するまで、64ピクセルごとにループし、新しいBIを配置します。だから、IDはそれらのすべてを1つの大きなBIに保存する必要があります。 – sekimberly52

+0

回答を編集するを参照してください。 –

+0

+1、最初にBufferedImageに描画します。 – camickr

関連する問題