2016-06-16 3 views
0

스윙, JFrame 및 JPanel을 사용하여 Pacman과 유사한 게임을 만들려고합니다. 크기는 256x256입니다. 그러나 실제로 게임을 컴파일 할 때 화면이 약간 커집니다. 나는 그것이 올바르게 또는 아마도 레이아웃을 다루는 무언가를 오버 라이딩하지 않았기 때문에 그 것인지 알 수 없다.Jpanel 크기가 올바르지 않음

이 추가 내 JFrame의 클래스 인 JPanel의

* 나는 그들이 도움이 아닌지 알아 내려고했기 때문에 주석 몇 가지가 있습니다. 당신이 구성 요소를 추가하고 그래서 문제가 무엇 확실하지 않다 크기 구성 요소에 JFrame의를 설정) (팩을 호출하는 경우

public class GameDevelopment extends JFrame{ 

//Window Stuff ... hopefully 
public static final int DimensionHeight = 256; 
public static final int DimensionWidth = 256; 

// Level stuff possibly  
Tile startingTile; 

Player player; 
Walls walls; 
public static Tile[][] tiles; 

public GameDevelopment(){ 
    //Initialize   
    tiles = new Tile[DimensionWidth/16 ][DimensionHeight/16]; 
    for(int i = 0; i < DimensionWidth/16; i++){ 
     for(int y = 0; y < DimensionHeight/16; y++){ 
      tiles[i][y] = new Tile(i, y); 
     } 
    } 

    startingTile = tiles[tiles.length/2][tiles[0].length/2]; 
    //xStart = (tiles.length/2) * 16; 
    //yStart = (tiles[0].length/2) * 16; 
    walls = new Walls(); 
    player = new Player(startingTile); 


    //Sceen stuff  
    setTitle("Game");       
    addKeyListener(player); 
    addMouseListener(player); 
    add(new Draw(walls, player), BorderLayout.CENTER); 
    //setSize(DimensionWidth, DimensionHeight); 
    pack(); 

    setLocationRelativeTo(null); 
    setResizable(false); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 
} 

public static void main(String[] args){ 
    SpriteSheet.getSprites(); 
    //Create tiles 
    GameDevelopment game = new GameDevelopment(); 
} 

나는 알고있다.

화면을 그려주는 Jpanel 클래스입니다. 나 또한 수동으로 화면이 직사각형 모양이어야하고 화면 명확하게 무엇을 해야하는 것보다 큽니다 그렸습니다.

* 하나의 paintComponent를 사용하여이 클래스의 메서드를 그리는 데 필요한 다양한 클래스를 전달합니다.이 클래스는 매우 잘 최적화되지 않았지만 문제가되지 않아야합니다. 돕는

http://i.stack.imgur.com/gep0O.png

감사 :

나는이 사진을 얻을 결과
public class Draw extends JPanel{ 

//Size 
int DimensionHeight; 
int DimensionWidth; 

// Components 
ArrayList components; 
int amount; 

public Draw(DrawGraphics ... _components){ 
    //Size 
    DimensionWidth = GameDevelopment.DimensionWidth; 
    DimensionHeight = GameDevelopment.DimensionHeight; 
    //this.setPreferredSize(new Dimension(256, 256)); 
    //setMinimumSize(new Dimension(DimensionWidth, DimensionHeight)); 
    //setMaximumSize(new Dimension(DimensionWidth, DimensionHeight)); 
    //setSize(DimensionWidth, DimensionHeight); 
    setBackground(new Color(80, 0, 255)); 
    System.out.println(getMinimumSize()); 

    //Components 
    components = new ArrayList(); 
    components.addAll(Arrays.asList(_components)); 
    amount = components.size(); 
} 

@Override 
public Dimension getPreferredSize(){ 
    return new Dimension(DimensionWidth, DimensionHeight); 
} 

@Override 
public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    for(int i = 0; i < 16; i++){ 
     for(int y = 0; y < 16; y++){ 
      g.drawRect(i*16, y*16, 16, 16); 
     } 
    } 
    for(int i = 0; i < amount; i++){ 
     ((DrawGraphics)components.get(i)).draw(g); 
    } 
    //g.drawRect(0, 0, 16, 16); 
    repaint(); 
} 

는 이 그려진 사각형 후 약간의 푸른 공간을 보여줍니다!

답변

1

그림 메서드에서 repaint()를 호출하지 마십시오. 이렇게하면 무한 루프가 발생합니다.

그것은 그려진 사각형 후 약간의 푸른 공간을 보여줍니다

setResizable(false); 
    pack(); 
    setLocationRelativeTo(null); 
// setResizable(false); 

당신은 당신이 프레임을 포장하기 전에 프레임이 아닌 크기를 조정할 수 있도록해야합니다.

+0

감사합니다. 또한 다시 칠해서 루프를 반복하고 플레이어의 위치를 ​​계속 그릴 것입니다. 그렇지 않으면 그렇지 않습니다. – Flameo326

+0

@ Flameo326, 다시 한번 paint 메소드에서 repaint()를 호출하면 안됩니다. 애니메이션을 원하면 [Swing Timer] (http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html)를 사용하십시오. – camickr

관련 문제