Java Frame неправильно определяет размеры - PullRequest
1 голос
/ 23 февраля 2012

Я делаю 2D-игру и рисую на поверхности внутри фрейма.Проблема в том, что я зацикливаюсь на фоне и рисую фоновое изображение (используя мозаичное изображение), вот результат:

Примечание. Я установил для кадра значение 640,480

enter image description here

Как вы видите, верхняя и левая стороны отстоят на несколько пикселей, я в основном волнуюсь за верхнюю часть.

Я использую этот код для инициализации фрейма:

    frame = new Frame(_title);


    frame.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    });


    frame.addMouseListener(new Mouse());
    frame.addKeyListener(new Keyboard());   
    frame.setSize(new Dimension(width, height));
    frame.setResizable(false);
    frame.setBackground(Color.lightGray);
    frame.setVisible(true);
    frame.createBufferStrategy(2);

А вот как я рисую фон:

    for(int x = 0; x < GameClient.width; x+= 32) {
        for(int y= 0; y< GameClient.height; y+= 32) {
                g.drawImage(floor, x , y, null);

        }
    }

Я бы подумал, что он будет работать нормально, но, очевидно, нет ..

Что такоеЯ делаю неправильно, или как я могу это исправить?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 23 февраля 2012

Во-первых, вы должны использовать свинг, а не старый awt (но принцип тот же).


Рамка начинается в верхнем левом углу включая границу.Добавьте компонент к фрейму и переопределите paintComponent для этого метода компонента, чтобы получить правильные начальные координаты.


Вот полный пример:

enter image description here

public static void main(String[] args) {

    JFrame frame = new JFrame();
    frame.add(new JComponent() {
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            g.setColor(Color.GRAY);
            for (int x = 0; x < getWidth(); x += 32)
                for (int y = 0; y < getHeight(); y += 32)
                    g.fill3DRect(x+1, y+1, 30, 30, true);
        }
    });

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(600, 600);
    frame.setVisible(true);
}
1 голос
/ 23 февраля 2012

В любом случае, используйте frame.getInsets.top(), frame.getInsets().left, и тогда вы начнете рисовать в этих точках.

...