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

标签 java slick2d

我正在使用 Slick 2D 制作 RTS 游戏。我有一个构建类,它包含一个称为资源的 int。我希望资源变量成为一个字符串并渲染到我的建筑物的中心(它应该是一个矩形)。

这是我的构建类:

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

到目前为止,我的所有状态都正常工作,并且矩形正确显示。我的 g.drawString(str, float, float) 代码具有正确的参数将在其渲染函数中的 GameState 类(未显示)上工作,但它在我的 BaseBuilding 类中给了我这个错误:

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

在互联网上找不到;如果可以请帮忙,谢谢。

最佳答案

查看 Slick 源代码后,您的问题来自于 Graphics 类中的 font 变量,该变量为 null。

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

因此,您永远不应该实例化 Graphics,而只需从 GameContainer (getGraphics) 中检索它,即 everywhere ,或者您也可以从游戏类(Game、BasicGame、BasicGameState、StateBasedGame,具体取决于您使用的...)的 render 方法中获取 g

为了简单起见,只需通过渲染方法传递 Graphics 对象即可:

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

在你的游戏中:

render(GameContainer container, Graphics g) {
    myBaseBuilding.render(g);
}

关于Java - Slick 2D - 将文本(或任何图形)放置在矩形(或任何形状)上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29715126/

相关文章:

java - 使用Slick2D加载声音时的Java堆错误

java - 当我尝试为乒乓 Racket 制作人工智能时,遇到了一个奇怪的故障

java - 测试红色

java - Java IO 是否有最大文件名长度限制?

java - 字符串 setter 的 Spring AOP 切入点定义

java - 让 Spring 替换不同文件类型中的占位符(除了 Spring 的配置)

java - 从哪里开始创建Minecraft客户端模块

java - java中对鼠标点击使用react的功能接口(interface)

java - slick.util 和 lwjgl 纹理的问题

java - 运行 Slick2D 会导致 NoClassDefFoundError