2011-12-23 11 views
0

私は本当に基本的なプログラムで戦いをシミュレートしようとしていますが、これはJavaで大きなプログラムで初めてのことですから、どのように進行するのかわかりません。私は600×600の大きなパネルを持っていて、Graphics2Dを使って地形を20×20の長方形として描画すると思っていました...残念ながら、いくつかのチュートリアルでも何をすべきか分かりません。Java - Graphics2D Rectangleを使用してパネルに2Dタイルマップを作成しますか?

私には、10種類の地形と5種類の風景があります。基本的に私がプログラムにしたいのは、コンボボックスで特定のプロファイルを選択したときに、風景と2つの反対側を戦闘で描くことです(まだ私はまだありません)。

正直に私は持っていませんプログラムで非常に進歩しました。私はこのようなもののためにGraphics2Dと四角形だけを使うべきですか、それともOpenGLなどに切り替えるべきですか?私の現在のJavaの経験では、私はそれが非常に遠くに役立つとは思わない。とにかく、ここで私がこれまで持っているものです。

public class Map extends JPanel { 
    int n = 1; 
    int x; int y; 
    int Area = 750; 
    public Color City = new Color(214,217,223); 
    public Color Desert = new Color(255,204,102); 
    public Color DirtRoad = new Color(153,102,0); 
    public Color Forest = new Color(0,102,0); 
    public Color Hills = new Color(51,153,0); 
    public Color Lake = new Color(0,153,153); 
    public Color Mountains = new Color(102,102,255); 
    public Color Ocean = new Color(0,0,153); 
    public Color PavedRoad = new Color(51,51,0); 
    public Color Plains = new Color(102,153,0); 
    public Rectangle blocks[]; 
    public Map(){ 
     blocks = new Rectangle[750]; 
     if (n == 1) { 
      setBackground(City); 
      n = 2; 
     } else if (n == 2) { 
      setBackground(Desert); 
      n = 3; 
     } else if (n == 3) { 
      setBackground(DirtRoad); 
      n = 4; 
     } else if (n == 4) { 
      setBackground(Forest); 
      n = 5; 
     } else if (n == 5) { 
      setBackground(Hills); 
      n = 6; 
     } else if (n == 6) { 
      setBackground(Lake); 
      n = 7; 
     } else if (n == 7) { 
      setBackground(Mountains); 
      n = 8; 
     } else if (n == 8) { 
      setBackground(Ocean); 
      n = 9; 
     } else if (n == 9) { 
      setBackground(PavedRoad); 
      n = 10; 
     } else if (n == 10) { 
      setBackground(Plains); 
      n = 1; 
     } else { 
     } 
     for (int i = 1; i <= Area; i++) { 
      blocks[i] = new Rectangle(x, y, 20, 20); 
     } 
    } 

私のコードは少し不安定ですので、私は、いくつかのYouTubeのチュートリアルをはるかにこれを得ました。私がメインフォームコードで持っているのは、checkBox発火イベントだけです。 (GUIはNetbeansエディタであらかじめ設計されています)

+0

So..what質問ですか?投票を終了する。 – mre

+0

マップを作成するためにGraphics2DまたはOpenGLを使用する必要がありますか?また、どちらの方法でマップを作成する必要がありますか? – lopzjk12

+0

それらが画像の場合は、どちらかを気にせずに単に 'JLabel'を使用してください。それらがそうでない場合(あなたの例が示すように)、 'JComponent'の' paintComponent'をオーバーライドすることによって 'Graphics2D'を使います。 @mreは正しいです(例: – mre

答えて

7

1)OpenGLの前にJava 2dを学ぶことを強くお勧めします。
2)モデルのビューを分離するのが理想的です。地図の内容を表すクラスと実際にレンダリングするクラスがあります。

あなたの目標に少し近づけるためのサンプルコードです。読んでみてを理解してください。コピーして貼り付けたり、ハックしたりするだけではありません。

enter image description here

import javax.swing.*; 
import java.awt.*; 
import java.util.Random; 

public class Map extends JPanel { 

    public static final Color CITY = new Color(214,217,223); 
    public static final Color DESERT = new Color(255,204,102); 
    public static final Color DIRT_ROAD = new Color(153,102,0); 
    public static final Color FOREST = new Color(0,102,0); 
    public static final Color HILLS = new Color(51,153,0); 
    public static final Color LAKE = new Color(0,153,153); 
    public static final Color MOUNTAINS = new Color(102,102,255); 
    public static final Color OCEAN = new Color(0,0,153); 
    public static final Color PAVED_ROAD = new Color(51,51,0); 
    public static final Color PLAINS = new Color(102,153,0); 

    public static final Color[] TERRAIN = { 
     CITY, 
     DESERT, 
     DIRT_ROAD, 
     FOREST, 
     HILLS, 
     LAKE, 
     MOUNTAINS, 
     OCEAN, 
     PAVED_ROAD, 
     PLAINS 
    }; 

    public static final int NUM_ROWS = 25; 
    public static final int NUM_COLS = 30; 

    public static final int PREFERRED_GRID_SIZE_PIXELS = 10; 

    // In reality you will probably want a class here to represent a map tile, 
    // which will include things like dimensions, color, properties in the 
    // game world. Keeping simple just to illustrate. 
    private final Color[][] terrainGrid; 

    public Map(){ 
     this.terrainGrid = new Color[NUM_ROWS][NUM_COLS]; 
     Random r = new Random(); 
     // Randomize the terrain 
     for (int i = 0; i < NUM_ROWS; i++) { 
      for (int j = 0; j < NUM_COLS; j++) { 
       int randomTerrainIndex = r.nextInt(TERRAIN.length); 
       Color randomColor = TERRAIN[randomTerrainIndex]; 
       this.terrainGrid[i][j] = randomColor; 
      } 
     } 
     int preferredWidth = NUM_COLS * PREFERRED_GRID_SIZE_PIXELS; 
     int preferredHeight = NUM_ROWS * PREFERRED_GRID_SIZE_PIXELS; 
     setPreferredSize(new Dimension(preferredWidth, preferredHeight)); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     // Important to call super class method 
     super.paintComponent(g); 
     // Clear the board 
     g.clearRect(0, 0, getWidth(), getHeight()); 
     // Draw the grid 
     int rectWidth = getWidth()/NUM_COLS; 
     int rectHeight = getHeight()/NUM_ROWS; 

     for (int i = 0; i < NUM_ROWS; i++) { 
      for (int j = 0; j < NUM_COLS; j++) { 
       // Upper left corner of this terrain rect 
       int x = i * rectWidth; 
       int y = j * rectHeight; 
       Color terrainColor = terrainGrid[i][j]; 
       g.setColor(terrainColor); 
       g.fillRect(x, y, rectWidth, rectHeight); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JFrame frame = new JFrame("Game"); 
       Map map = new Map(); 
       frame.add(map); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+1

ありがとうございます - 私はそれを修正したと思います。まだ間違っている場合は教えてください。 – I82Much

+0

さて、これは有望そうだし、何が起こっているのかかなり分かります。ありがとう。 – lopzjk12

+0

質問:forループがpaintComponentでどのように動作するかはわかりません。それは本質的に、透明な矩形、矩形の矩形を個々に描画しますか? – fungusanthrax

1

正直言って、あなたは間違った方法でJavaを学ぶつもりです。それがあなたがこれらのチュートリアルから学ぶことによってやろうとしているものなら。

私は個人的にタイルマップを実行する際にexprienceを持っていませんが、あなたのコードを読んで見ることができないものがいくつかあります。

通常、タイルマップコードを見ると、2次元の配列が表示されます。その場合は、ランダムなインデックスに1〜10の範囲の2次元配列になります。表示されたコードの中で私が理解していることは、数字にイメージを割り当ててブロック配列に追加することだけです。

実際に作成しているマップを視覚化するための2D配列がないため、レイアウトを作成することは、バックグラウンドを持つ四角形の束です。

私が理解できない別の問題は、基本的にフィールドである720のインデックスにマップ領域を設定しているという事実です。私は27の画像で27の画像をあなたのxとyの値にしますあなたが作成したints。あなたが作成しようとしている目に見えないタイルマップグリッドに分割されたJPanelが残されます。

私が先に話していた2D配列のインデックスに何番目の数字があるかに基づいて、背景が対応するイメージで塗りつぶされます。

OpenGLまたはグラフィックス2Dの問題について: どのグラフィックスライブラリを使用しても問題はありません。どのようにコード化するかです。 OpenGLは初心者の方にはかなり進んでいます(私の経験からは特に2Dです)、3Dライブラリなので、2Dでも可能ですが、ちょっと難しいです。 Java APIのいくつかを学び、次のステップに進んでください。

私は助けてくれました。また、O_oをもう一度やりました。投稿したコードに応答しています。

+0

ええ、私は知っています、私は期限のためにこのプロジェクトを予定しています。ああ、私はそれがうまく行くことを望む! – lopzjk12

関連する問題