Java-Slick 2D-将文本(或任何图形)放置在矩形(或任何形状)上

Java-Slick 2D-将文本(或任何图形)放置在矩形(或任何形状)上,java,slick2d,Java,Slick2d,我正在使用Slick 2D制作RTS游戏。我有一个building类,它包含一个名为resources的int。我希望resources变量变成一个字符串,并呈现在我的建筑的中心(它应该是一个矩形) 这是我的建筑课: package test; import org.newdawn.slick.Color; import org.newdawn.slick.Graphics; import org.newdawn.slick.geom.Rectangle; public class Base

我正在使用Slick 2D制作RTS游戏。我有一个building类,它包含一个名为resources的int。我希望resources变量变成一个字符串,并呈现在我的建筑的中心(它应该是一个矩形)

这是我的建筑课:

package test;

import org.newdawn.slick.Color;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.geom.Rectangle;

public class BaseBuilding extends Rectangle{

    private int resources;
    private Graphics g;

    public BaseBuilding(float x, float y, float width, float height) {
        super(x, y, width, height);
        resources = 0;
        g = new Graphics();
    } // end constructor

    public void render(){
        g.drawString("bro wat", resources, resources);
        g.setColor(Color.gray);
        g.fill(this);
        g.drawString(Integer.toString(resources), this.width/2, this.height/2);
    } // end update

    public int getResources(){
        return resources;
    } // end getResources

    public void addResources(int mulla){
        resources += mulla;
        if (resources < 0) 
            resources = 0;
    } // end addResources

    public void createBasicUnit(){
        // create a BasicUnit object in a randomly, valid position close to this object
        // TODO
    } // end createBasicUnit

} // end class def
java.lang.NullPointerException
at org.newdawn.slick.Graphics.drawString(Graphics.java:1366)
at test.BaseBuilding.render(BaseBuilding.java:19)
at test.GameState.render(GameState.java:34)
at org.newdawn.slick.state.StateBasedGame.render(StateBasedGame.java:199)
at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:688)
at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:411)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:321)
at test.StateBaseGame.main(StateBaseGame.java:22)
Sat Apr 18 03:18:55 EDT 2015 ERROR:Game.render() failure - check the game code.
org.newdawn.slick.SlickException: Game.render() failure - check the game code.
at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:691)
at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:411)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:321)
at test.StateBaseGame.main(StateBaseGame.java:22)
所以我四处寻找,发现是这条线给我带来了问题:

g.drawString(Integer.toString(resources), this.width/2, this.height/2);

在互联网上找不到它;如果可以,请提供帮助,谢谢。

在查看了流畅的源代码后,您的问题来自图形类中的字体变量,该变量为null

您正在使用默认构造函数实例化图形,该构造函数不为字体变量提供默认值。另一个,正如前面所说的,只有容器应该实例化图形

因此,永远不应实例化图形,而应仅从GameContainer(getGraphics)中检索图形,也可以从游戏类的render方法(game、BasicGame、BasicGameState、StateBasedGame,具体取决于您使用的…)中获取g

为了保持简单,只需通过渲染方法传递图形对象:

public void render(Graphics g){
    g.drawString("bro wat", resources, resources);
    g.setColor(Color.gray);
    g.fill(this);
    g.drawString(Integer.toString(resources), this.width/2, this.height/2);
} // end update
在游戏中:


说得好;炒锅真有魅力!如果我想创建一个形状或一些图像,我想我也可以这样做。矩形和图像在Sick.geom中是两种不同的东西。矩形是一种抽象结构,它只包含一些数学方法和基本变量。图像具有openGL逻辑,可以在游戏的渲染方法(myImage.draw(0,0))中绘制自身。但它也可以由g(g.drawImage(myImage))绘制。但是要小心,您必须在游戏类的渲染方法(主循环)中进行每次绘制。
render(GameContainer container, Graphics g) {
    myBaseBuilding.render(g);
}