2017-01-04 17 views
0

私はJavaで単純なゲームを作っています。私はSwingを使っています。私はJFrameを持っており、その中に実際のゲームのために2つのJPanelsを持っていたいと思っています。すべてのJPanelには独自の座標があるので、点(0、0)はそのパネルの左上隅にあることを読んでいます。描画中にJPanel座標を使用する

私はメソッドpaintControl()をオーバーライドします。ゲームを表示する私のクラスのGameView(これは、上記の2番目のJPanelです)。しかし、私がgameViewの左上隅に何かを描画し、その画像の座標を(0,0)に設定すると、BarViewが描画されます。

私は図面に関する多くのチュートリアルや記事を読んでいます。私は何が間違っているのか分かりません。だから私の質問は、JPanelの座標ではなくJFrameの座標を使って何かを描くのですか?ここではいくつかのコードは次のとおりです。JFrameのにJPanelのを拡張するオブジェクトの追加

:JPanelの中​​

GameView v = new GameView(); 
    BarView bv = new BarView(); 
    frame.getContentPane().add(bv); 
    frame.getContentPane().add(v); 
    frame.setVisible(true); 
    v.requestFocus(); 
    v.repaint(); 
    bv.repaint(); 

描画:gameSceneで

public class GameView extends JPanel implements View, Commons{ 

    public static final int WIDTH=WINDOW_WIDTH, HEIGHT=ARENA_HEIGHT; 
    private GameScene gameScene; 
    private TexturePaint paint; 
    private BufferedImage bi; 

    public GameView(){ 
    addKeyListener(new CustomKeyListener()); 
    addMouseMotionListener(new CustomMouseListener()); 
    setSize(WINDOW_WIDTH, ARENA_HEIGHT); 
    setFocusable(true); 
    try { 
     bi = ImageIO.read(new File("src/res/texture.png")); 
    } catch (IOException e) { 
      // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    this.paint = new TexturePaint(bi, new Rectangle(0, 0, bi.getWidth(), bi.getHeight())); 
    } 

    @Override 
    public void paintComponent(Graphics g1) { 

    Graphics2D g = (Graphics2D) g1; 
    g.setPaint(paint); 
    g.fillRect(0, 0, WINDOW_WIDTH, ARENA_HEIGHT); 
    for(Iterator<Drawable> it = gameScene.models.iterator(); it.hasNext();) 
    { 
     Drawable d = it.next(); 
     d.draw(g1); 
    } 
    Toolkit.getDefaultToolkit().sync(); 

    } 

とモデルの方法ドローは、通常、次のようになります。

public void draw(Graphics g1){ 
    Graphics2D g = (Graphics2D) g1.create(); 
    int cx = image.getWidth(null)/2; 
    int cy = image.getHeight(null)/2; 
    g.rotate(rotation, cx+x, cy+y); 
    g.drawImage(image, x, y, null); 
} 
+0

"View、Commonsを実装する":これらは何ですか?ちんぷんかんぷん?? – gpasch

+0

より良いヘルプを早く得るには、[mcve]を投稿してください。実際に問題を示すために画像が必要な場合は、それらにホットリンクしてください。 –

答えて

3

LayoutManagerを指定していないようですですので、デフォルトはBorderLayoutになります。

その後、frame.getContentPane().add(component)を位置定数なしで呼び出すと、位置BorderLayout.CENTERがデフォルトになります。

この結果、お客様のGameViewBarViewコンポーネントが互いに重ねて表示されます。簡単なテストとして

、次のようにコンポーネントの位置を指定してみてください:

GameView v = new GameView(); 
BarView bv = new BarView(); 
frame.getContentPane().add(bv, BorderLayout.LINE_START); 
frame.getContentPane().add(v, BorderLayout.LINE_END); 

あなたのUIは本当に簡単でない限り、あなたはおそらく、あなたが他のいくつかのレイアウトマネージャを使用する必要があることがわかります。この件については、'How to Use Various Layout Managers'を参照してください。

関連する問題