-1

それで、私の仲間はRenderingEngine、グラフィックスが持っているメソッドをほとんど含んでいる場所を構築しました。そうすれば、RenderingEnginesクラスのメソッドを呼び出して、画面に何かをレンダリングするだけで済みます。不正行為の代わりに見たり学ぼうとしたりせずに、私の知識に基づいてそれを複製しようとしています. しかし、私は問題に遭遇しました。私のすべてのメソッドは、RenderingEngine クラスがゲーム クラスで初期化されるときに、JPanel のグラフィックを取得しようとした後、RenderingEngine クラスのグラフィック g が null になるということだけで機能します。これがどのように機能するかを理解していないかどうかはわかりませんが、説明が欲しいので、コードを下に置いてください。

以下のレンダリングクラス:

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

withの「Graphics g を初期化する方法」についての質問に答えると、満足できないと思うかもしれませんJPanel...

全くない!

カスタム ペインティングの実行に関する記事、またはAWT と Swing でのペインティングに関する記事(残念ながら、Sun から Oracle への移行中に少し混乱しましたが、他の記事よりも価値のある詳細な情報が含まれています) をご覧になることをお勧めします。 )。

GraphicsJPanel、いわばオペレーティング システムによって管理され、描画が行われる画面上の領域を表します。パネルがまだ表示されていない場合、Graphicsへの呼び出しによって返される は でgetGraphics()ある可能性がありますnull。それnull以外の場合もあるかもしれません。特に、イベント発行スレッド以外のスレッドからアクセスした場合。

一般的に、経験則として:

getGraphicsコンポーネントを呼び出さないでください!

このような「RenderingEngine」クラスの解決策の1 つGraphicsは、BufferedImage. これはそれほど複雑ではありませんが、ここでいくつかの側面を考慮する必要があります。

  • イメージはいつ初期化されますか?
  • グラフィックはいつ初期化されますか?
  • グラフィックスはいつ破棄されますか?
  • パネルのサイズを変更するとどうなりますか?
  • ...

しかし、この方法であれば、少なくとも用途に応じた「RenderingEngine」を作成できるはずです。

于 2014-05-02T15:59:30.393 に答える