-1

所以我的一个朋友建立了一个RenderingEngine几乎包含图形方法的地方。这样,您只需要调用RenderingEngines类的方法即可将内容呈现到屏幕上。没有寻找和尝试学习而不是作弊,我试图根据我的知识复制它。我遇到了一个问题。我所有的方法都起作用,只是当 RenderingEngine 类在我的游戏类中初始化时,我的 RenderingEngine 类中的图形 g 在尝试获取 JPanel 的图形后为空。我不知道我是否不理解这是如何工作的并且希望得到解释,我将代码放在下面。

渲染类如下:

package game.Main;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.font.FontRenderContext;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;


public class RenderingEngine extends JPanel
{
    private Graphics g;
    public RenderingEngine()
    {
        g = this.getGraphics();
    }

    public void setColor(Color color)
    {
        g.setColor(color);
    }

    public void fillRect(Rectangle rect)
    {
        g.fillRect(rect.x, rect.y, rect.width, rect.height);
    }

    public void drawRect(Rectangle rect)
    {
        g.drawRect(rect.x, rect.y, rect.width, rect.height);
    }

    public void setStringFont(Font font)
    {
        g.setFont(font);
    }

    public void drawString(String string, int x, int y)
    {
        g.drawString(string, x, y);
    }

    public void drawImage(BufferedImage image, Rectangle rect)
    {
        g.drawImage(image, rect.x, rect.y, rect.width, rect.height, this);
    }

    public void clear(Rectangle rect)
    {
        g.clearRect(rect.x, rect.y, rect.width, rect.height);
    }

    public int widthofString(String string, Font font)
    {
        String text = string;
        AffineTransform affinetransform = new AffineTransform();
        FontRenderContext frc = new FontRenderContext(affinetransform,true,true);
        Font f1 = font;
        int textwidth = (int)(font.getStringBounds(text, frc).getWidth());
        return textwidth;
        //int textheight = (int)(font.getStringBounds(text, frc).getHeight());
    }

    public int heightofString(String string, Font font)
    {
        String text = string;
        AffineTransform affinetransform = new AffineTransform();
        FontRenderContext frc = new FontRenderContext(affinetransform,true,true);
        Font f1 = font;
        //int textwidth = (int)(font.getStringBounds(text, frc).getWidth());
        int textheight = (int)(font.getStringBounds(text, frc).getHeight());
        return textheight;
    }

    public void paint()
    {

    }
}

我在游戏类中初始化渲染引擎的地方:

private void Load()
{
    frame = new JFrame();
    frame.setSize(800,600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setResizable(false);
    render = new RenderingEngine();
    frame.add(render);
    LoadContent();
    gameloop = new GameLoop();
    gameloop.Run();
}
4

1 回答 1

3

当我回答关于“如何初始化图形 g”的问题时,您可能会认为它不令人满意JPanel

一点也不!

您可能想查看Performing Custom Painting文章,或有关在 AWT 和 Swing 中进行绘画的文章(不幸的是,在从 Sun 到 Oracle 的过渡期间有些混乱,但仍然包含比其他文章更有价值和更详细的信息)。

Graphics可以说, aJPanel是由操作系统管理的,表示屏幕上可能发生绘画的区域。当面板还不可见时,Graphics调用getGraphics()可能返回的 是null。也可能null在其他场合。特别是,当它从不是事件分派线程的线程访问时。

一般来说,根据经验:

永远不要调用getGraphics组件!

这种“RenderingEngine”类的一种可能解决方案是使用. 这不应该太复杂,但是您必须在这里考虑几个方面:GraphicsBufferedImage

  • 什么时候初始化图像?
  • 什么时候初始化图形?
  • 什么时候处理图形?
  • 调整面板大小时会发生什么?
  • ...

但是,使用这种方法,至少应该可以创建适合预期用途的“渲染引擎”。

于 2014-05-02T15:59:30.393 回答