【问题标题】:Java Frame sizing itself wrongJava 框架大小本身错误
【发布时间】:2012-03-13 15:10:25
【问题描述】:

我正在制作 2D 游戏并绘制到 Frame 内的表面。问题是这样的,我正在循环遍历背景并绘制背景图像(使用平铺图像),结果如下:

注意:我将帧设置为 640,480

您可以看到顶部和左侧偏离了几个像素,我主要担心顶部..

我正在使用这段代码来初始化框架:

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

        }
    }

我原以为它会正常工作,但显然不是......

我做错了什么,或者我该如何解决?

谢谢。

【问题讨论】:

    标签: java graphics awt frame


    【解决方案1】:

    首先,你应该使用swing而不是旧的awt(但原理是一样的)。


    框架从左上角开始包括边框。将组件添加到框架并覆盖该组件方法上的paintComponent 以获得正确的起始坐标。


    这是一个完整的例子:

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

    【讨论】:

    • 我没有使用 JFrame,我使用的是 AWT 的 Frame。虽然我不确定这是否重要。
    • 在回复您的编辑时,该网站上的用户告诉我,我应该使用 AWT 进行 2D 游戏开发而不是 Swing..
    • +1 这是正确答案。可惜OP选择了不太合适的策略是正确的。至于“告诉使用 AWT”。那个建议可能是做自定义绘画,你通常只使用 AWT 中的类。 GraphicsGraphics2DColorFont 之类的东西很常见。至于要使用的组件,应该都是Swing。我怀疑在当今时代使用 AWT 组件是否有任何显着的“性能提升”(如果有的话)。
    • 对这段代码的一个小改进是使用大小来设置自定义组件首选大小,然后打包框架。这样一来,无论框架装饰如何,您都可以保证绘图区域中的特定尺寸。
    【解决方案2】:

    无论哪种方式,使用frame.getInsets.top()frame.getInsets().left,然后在这些点开始绘制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-16
      • 2019-05-21
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多