Java Slick 2D:呈现空指针异常
所以我的问题是,当我创建的状态被调用时,我会得到一个Java Slick 2D:呈现空指针异常,java,nullpointerexception,slick2d,Java,Nullpointerexception,Slick2d,所以我的问题是,当我创建的状态被调用时,我会得到一个NullPointerException 问题是,它不是null,至少我这么认为。有人能告诉我NPE是从哪里来的吗 PS:这是一个草率的代码,因为我还没有清理它 粗体行出现错误 public class NewPlayerState extends BasicGameState { private int stateID; private boolean mouseDown; private int mouseX;
NullPointerException
问题是,它不是nul
l,至少我这么认为。有人能告诉我NPE是从哪里来的吗
PS:这是一个草率的代码,因为我还没有清理它
粗体行出现错误
public class NewPlayerState extends BasicGameState {
private int stateID;
private boolean mouseDown;
private int mouseX;
private int mouseY;
private Random rand;
private String allTheStats;
private Image classPreview;
private Image genderSelector;
private Player player;
private Write write;
private String className = "paladin";
private String name = "JamacanGuy";
private int hitPoints = 0;
private int str = 0;
private int dex = 0;
private int sta = 0;
private int intel = 0;
private int cha = 0;
private boolean male = true;
private int hpMod = 0;
private int strMod = 0;
private int dexMod = 0;
private int staMod = 0;
private int intelMod = 0;
private int chaMod = 0;
private Input input;
public NewPlayerState(int stateID) {
this.stateID = stateID;
}
/*
*
* Initiation method, brings up relevant variables and get this Initializes them!
*
*/
@Override
public void init(GameContainer gc, StateBasedGame sbg)
throws SlickException {
// Ready the PARSER!!!!
rand = new Random();
write = new Write();
// init classPreview as paladin
classPreview = new Image("gfx/player/previews/paladin_male.png");
// init gender icons
genderSelector = new Image("gfx/extra/new_player/gender_selector.png");
allTheStats = "Hitpoints: " + hitPoints + " + HP Modifier: " + hpMod + " = " + (hitPoints + hpMod) + "\n" +
"Strength: " + str + " + STR Modifier: " + strMod + " = " + (str + strMod) + "\n" +
"Dexterity: " + dex + " + DEX Modifier: " + dexMod + " = " + (dex + dexMod) + "\n" +
"Stamina: " + sta + " + STA Modifier: " + staMod + " = " + (sta + staMod) + "\n" +
"Inteligence: " + intel + " + INT Modifier: " + intelMod + " = " + (intel + intelMod) + "\n" +
"Charisma: " + cha + " + CHA Modifier: " + chaMod + " = " + (cha + chaMod) + "\n"
;
}
@Override
public void render(GameContainer gc, StateBasedGame sbg, Graphics g)
throws SlickException {
renderAll(g, sbg);
}
@Override
public void update(GameContainer gc, StateBasedGame sbg, int delta)
throws SlickException {
input = gc.getInput();
mouseDown = input.isMouseButtonDown(0);
mouseX = input.getMouseX();
mouseY = input.getMouseY();
checkGender();
updatePreview();
updateStatModifier();
updateStatDisplay();
}
private void renderAll(Graphics g , StateBasedGame sbg) throws SlickException {
// draw background
g.setColor(Color.white);
g.fillRect(875, 455, 305, 405);
// draw background
// draw class preview
**classPreview.draw(880, 460, 300, 400);** // Error is here
// draw class preview
// Select your class
// Paladin
if (mouseOver(875, 410, 80, 40)) {
g.setColor(Color.darkGray);
if (mouseDown) {
className = "paladin";
}
} else {
g.setColor(Color.blue);
}
g.fillRoundRect(875, 410, 80, 40, 5);
g.setColor(Color.white);
g.drawString("Paladin", 885, 420);
// Paladin
// Select your class
// Select Gender
genderSelector.draw(875, 300, 220, 100);
// Select Gender
// Roll for your stats
// Roll button
if(!mouseOver(100, 200, 100, 50)){
g.setColor(Color.white);
}else if(mouseOver(100, 200, 100, 50)){
g.setColor(Color.darkGray);
if(mouseDown){
rollForStats();
}
}
g.fillRoundRect(100, 200, 100, 50, 10);
g.setColor(Color.black);
g.drawString("Roll", 130, 215);
// Roll button
// Display stats
//Ugghhghghghghhghghghghgh!!!!!!
g.setColor(Color.white);
g.drawString(allTheStats, 80, 26);
// Display stats
// Roll for your stats
// exit and write to file, then open new level
if(!mouseOver(100, 600, 100, 50)){
g.setColor(Color.white);
}else if(mouseOver(100, 600, 100, 50)){
g.setColor(Color.darkGray);
if(mouseDown){
closeUp(sbg);
}
}
g.fillRoundRect(100, 600, 100, 50, 10);
g.setColor(Color.black);
g.drawString("Play!", 130, 615);
// exit and write to file, then open new level
}
private void closeUp(StateBasedGame sbg) throws SlickException {
//set all that data
player = new Player();
player.setClassName(className);
player.setName(name);
player.setHealth(hitPoints);
player.setStr(str);
player.setDex(dex);
player.setSta(sta);
player.setCha(cha);
player.setIntel(intel);
player.setStaMod(staMod);
player.setChaMod(chaMod);
player.setDexMod(dexMod);
player.setStrMod(strMod);
player.setIntelMod(intelMod);
player.setGender(male);
//save to xml
XStream xstream = new XStream(new StaxDriver());
String xml = xstream.toXML(player);
write.writeToFile(xml, "save");
// begin game
//Main.ps.setFirstLoad(true);
sbg.enterState(Main.PLAYSTATE, new FadeOutTransition(), new FadeInTransition());
// prevent multiple clicks
mouseDown = false;
}
private void rollForStats(){
hitPoints = rand.nextInt(20) + 1;
str = rand.nextInt(20) + 1;
dex = rand.nextInt(20) + 1;
sta = rand.nextInt(20) + 1;
intel = rand.nextInt(20) + 1;
cha = rand.nextInt(20) + 1;
}
private boolean mouseOver(int x, int y, int width, int height) {
if (mouseX > x && mouseX < x + width && mouseY > y
&& mouseY < y + height) {
return true;
} else {
return false;
}
}
private void updateStatDisplay() {
allTheStats = "Hitpoints: " + hitPoints + " + HP Modifier: " + hpMod + " = " + (hitPoints + hpMod) + "\n" +
"Strength: " + str + " + STR Modifier: " + strMod + " = " + (str + strMod) + "\n" +
"Dexterity: " + dex + " + DEX Modifier: " + dexMod + " = " + (dex + dexMod) + "\n" +
"Stamina: " + sta + " + STA Modifier: " + staMod + " = " + (sta + staMod) + "\n" +
"Inteligence: " + intel + " + INT Modifier: " + intelMod + " = " + (intel + intelMod) + "\n" +
"Charisma: " + cha + " + CHA Modifier: " + chaMod + " = " + (cha + chaMod) + "\n"
;
}
private void updatePreview() throws SlickException {
switch(className){
case "paladin":
if(male){
classPreview = new Image("gfx/player/previews/paladin_male.png");
}else {
classPreview = new Image("gfx/player/previews/paladin_female.png");
}
break;
default:
classPreview = new Image("gfx/player/previews/paladin_male.png");
break;
}
}
private void checkGender() throws SlickException {
if (!mouseOver(875, 300, 220, 100)) {
genderSelector = new Image(
"gfx/extra/new_player/gender_selector.png");
} else if (mouseOver(875, 300, 220, 100)) {
if (mouseX > 985) {
genderSelector = new Image(
"gfx/extra/new_player/male_selected.png");
if (mouseDown) {
male = true;
}
} else {
genderSelector = new Image(
"gfx/extra/new_player/female_selected.png");
if (mouseDown) {
male = false;
}
}
}
}
public void updateStatModifier() {
switch (className) {
case "paladin":
if(male){
hpMod = 6;
strMod = 6;
dexMod = 2;
staMod = 4;
intelMod = 5;
chaMod = 3;
}else{
hpMod = 6;
strMod = 3;
dexMod = 2;
staMod = 4;
intelMod = 5;
chaMod = 5;
}
break;
}
}
@Override
public int getID() {
return stateID;
}
}
公共类NewPlayerState扩展了BasicGameState{
私有int stateID;
私有布尔mouseDown;
私人智能鼠标;
私家鼠;
私有随机兰德;
私有字符串所有状态;
私有图像预览;
私人形象性别选民;
私人玩家;
私人写作;
私有字符串className=“圣骑士”;
私有字符串name=“JamacanGuy”;
私有int生命点=0;
私有int str=0;
私有int-dex=0;
私有int sta=0;
私有整数英特尔=0;
私有int cha=0;
私有布尔男性=真;
私有int hpMod=0;
私有int strMod=0;
私有整数dexMod=0;
私有int staMod=0;
私有int intelMod=0;
私有int chaMod=0;
私人投入;
公共NewPlayerState(int stateID){
this.stateID=stateID;
}
/*
*
*初始化方法,调出相关变量并获取该变量将初始化它们!
*
*/
@凌驾
public void init(GameContainer gc、StateBasedGame sbg)
抛出异常{
//准备好解析器!!!!
rand=新随机数();
写入=新写入();
//初始化类预览为圣骑士
classPreview=新图像(“gfx/player/previews/paladin_male.png”);
//初始化性别图标
genderSelector=新图像(“gfx/extra/new_player/gender_selector.png”);
ALLTESTATS=“生命值:”+生命值+“+生命值修饰符:”+hpMod+“=”+(生命值+hpMod)+“\n”+
强度:“+str+”+str修饰符:“+strMod+”=”+(str+strMod)+“\n”+
灵巧度:“+dex+”+dex修饰语:“+dexMod+”=“+(dex+dexMod)+”\n+
耐力:“+sta+”+sta修饰语:“+staMod+”=“+(sta+staMod)+”\n”+
智能:“+intel+”+INT修饰符:“+intelMod+”=“+(英特尔+intelMod)+”\n”+
魅力:“+cha+”+cha修饰语:“+chaMod+”=“+(cha+chaMod)+”\n”
;
}
@凌驾
公共void渲染(GameContainer gc、StateBasedGame sbg、Graphics g)
抛出异常{
renderAll(g,sbg);
}
@凌驾
公共无效更新(GameContainer gc、StateBasedGame sbg、int delta)
抛出异常{
input=gc.getInput();
mouseDown=input.isMouseButtonDown(0);
mouseX=input.getMouseX();
mouseY=input.getMouseY();
检查性别();
updatePreview();
updateStatModifier();
updateStatDisplay();
}
私有void renderAll(Graphics g,StateBasedName sbg)引发异常{
//画背景
g、 setColor(Color.white);
g、 fillRect(875455305405);
//画背景
//绘制类预览
**classPreview.draw(880460300400);**//这里有错误
//绘制类预览
//选择你的班级
//圣骑士
如果(鼠标悬停(875410,80,40)){
g、 setColor(Color.darkGray);
如果(鼠标向下){
className=“圣骑士”;
}
}否则{
g、 setColor(Color.blue);
}
g、 fillRoundRect(875410,80,40,5);
g、 setColor(Color.white);
g、 抽绳(“圣骑士”,885420);
//圣骑士
//选择你的班级
//选择性别
性别选民抽签(8753002000);
//选择性别
//为你的统计数据滚动
//滚动按钮
如果(!鼠标悬停(10020010050)){
g、 setColor(Color.white);
}else if(鼠标悬停(10020010050)){
g、 setColor(Color.darkGray);
如果(鼠标向下){
rollForStats();
}
}
g、 fillRoundRect(10020010050,10);
g、 设置颜色(颜色为黑色);
g、 抽绳(“卷”,130、215);
//滚动按钮
//显示统计数据
//哈哈哈!!!!!!
g、 setColor(Color.white);
g、 抽绳(所有状态,80,26);
//显示统计数据
//为你的统计数据滚动
//退出并写入文件,然后打开新级别
如果(!鼠标悬停(10060010050)){
g、 setColor(Color.white);
}else if(鼠标盖(10060010050)){
g、 setColor(Color.darkGray);
如果(鼠标向下){
特写镜头(sbg);
}
}
g、 fillRoundRect(10060010050,10);
g、 设置颜色(颜色为黑色);
g、 抽绳(“玩!”,130615);
//退出并写入文件,然后打开新级别
}
私有void特写(StateBasedGame sbg)引发异常{
//设置所有数据
player=新玩家();
player.setClassName(className);
player.setName(name);
玩家设置生命值(生命值);
player.setStr(str);
player.setDex(dex);
游戏者:setSta(sta);
玩家。塞查(查);
player.setIntel(英特尔);
游戏者:塞斯塔莫德(斯塔莫德);
玩家:塞查莫德(查莫德);
player.setDexMod(dexMod);
player.setStrMod(strMod);
player.setIntelMod(intelMod);
玩家性别(男性);
//保存为xml
XStream XStream=newxstream(new statxdriver());
字符串xml=xstream.toXML(播放器);
classPreview.draw(880, 460, 300, 400);
g.drawImage(classPreview, 800, ...