Java - Slick 2D - 在矩形(或任何形状)上放置文本(或任何图形)
Java - Slick 2D - Placing text (or any graphics) on a rectangle (or any Shape)
我正在使用 Slick 2D 制作 RTS 游戏。我有一座建筑 class,它包含一个名为 resources 的整数。我希望资源变量成为一个字符串并渲染到我的建筑物的中心(它应该是一个矩形)。
这是我的建筑 class:
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 class(未显示)的渲染函数中运行,但它在我的 BaseBuilding class 中给了我这个错误:
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 class 中的 font 变量这是空的。
您正在使用不为字体变量提供默认值的默认构造函数实例化 Graphics。而另一个,正如doc所说,只有容器应该实例化Graphics。
因此,您永远不应该 实例化图形,而只是从 everywhere 的 GameContainer (getGraphics) 中检索它,或者你也可以从游戏的 render 方法中获取 g class (Game,BasicGame,BasicGameState,StateBasedGame,取决于你用什么...)。
为简单起见,只需将 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);
}
我正在使用 Slick 2D 制作 RTS 游戏。我有一座建筑 class,它包含一个名为 resources 的整数。我希望资源变量成为一个字符串并渲染到我的建筑物的中心(它应该是一个矩形)。
这是我的建筑 class:
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 class(未显示)的渲染函数中运行,但它在我的 BaseBuilding class 中给了我这个错误:
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 class 中的 font 变量这是空的。
您正在使用不为字体变量提供默认值的默认构造函数实例化 Graphics。而另一个,正如doc所说,只有容器应该实例化Graphics。
因此,您永远不应该 实例化图形,而只是从 everywhere 的 GameContainer (getGraphics) 中检索它,或者你也可以从游戏的 render 方法中获取 g class (Game,BasicGame,BasicGameState,StateBasedGame,取决于你用什么...)。
为简单起见,只需将 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);
}