java - 调用以 Graphics g 为边界的方法

标签 java object methods nullpointerexception slick2d

我正在使用 slick2D 创建一个简单的 java 游戏。不幸的是,我的 Java 技能并不简单。这个游戏将是一个内存游戏,因为我认为它制作起来很简单。我遇到的问题之一是我有一个 NormalMode 类和一个 Square 类。我在正常模式类中创建了一个 Square 对象来调用 Square 的方法。所以,我试图调用它的一个以“图形 g”为边界的方法,结果我得到一个空指针异常错误(或者其他我不知道的东西)。

Square类:(该类最后一个方法暂未完成)

       package data.src;

import java.util.Random;

import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.state.StateBasedGame;

public class Square {

    private StateBasedGame game;
    boolean correct;
    boolean clickable;
    boolean clicked;
    boolean started;
    int squares;
    int squareX;
    int squareY;
    public Image squareIncorrect;
    public Image squareCorrect;

    public Square() {

                }



    public boolean checkCorrect(){
        return correct;

    }
    public boolean checkClickable(){
        return clickable;
    }

    public boolean checkClicked(){
        return clicked;

    }


        public void squareStart(int x ,int y, Graphics g){

            if(correct == true){
                g.drawImage(squareCorrect, x, y);
            }
            else if(correct == false){
                g.drawImage(squareIncorrect, x, y);
            }
            g.drawString("Remember the blue squares!", x, y);
            try {
                wait(3000);
            } catch (InterruptedException e) {

                e.printStackTrace();
            }
            started = true;
            while(started == true){
                try {
                    squareCorrect = new Image("res/squareCorrect");
                } catch (SlickException e) {

                    e.printStackTrace();
                }

            }

        }

    public void createRandom(){

        Random rand = new Random();
        int sRand = rand.nextInt(1);

            if(sRand == 0){
                correct = false;
                clickable = true;
                clicked = false;

            }
            else if(sRand == 1){
                correct = true;
                clickable = true;
                clicked = false;
                squares++;

            }
    }


    public void youWin(int x, int y, Graphics g){
        if(squares == 0){
            g.drawString("You win!", x, y);
            game.enterState(0);
        }
    }
}

普通模式类:

package data.src;

import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.state.BasicGameState;
import org.newdawn.slick.state.StateBasedGame;

public class NormalMode extends BasicGameState {

    private Square[][] square = new Square[4][4];

    public NormalMode() {


                }

    @Override
    public void init(GameContainer arg0, StateBasedGame Game)throws SlickException {
                    for(int i = 0; i < square.length; i++){
                        for(int j = 0; j < square.length; j++){
                            square[i][j] = new Square();
                            square[i][j].createRandom();
                        }
                    }

            }

    @Override
    public void render(GameContainer container, StateBasedGame game, Graphics g)
            throws SlickException{
                square[1][1].squareStart(40, 300, g);

    }

    @Override
    public void update(GameContainer container, StateBasedGame game, int delta)
            throws SlickException {


    }

    @Override
    public int getID() {
        return 3;
    }


}

P.S:如果我的代码看起来很愚蠢,请原谅我胡说八道。

错误:

Sun Jan 05 01:17:25 MST 2014 ERROR:null
java.lang.NullPointerException
    at org.newdawn.slick.Graphics.drawImage(Graphics.java:1384)
    at org.newdawn.slick.Graphics.drawImage(Graphics.java:1433)
    at data.src.Square.squareStart(Square.java:46)
    at data.src.NormalMode.render(NormalMode.java:32)
    at org.newdawn.slick.state.StateBasedGame.render(StateBasedGame.java:199)
    at org.newdawn.slick.ScalableGame.render(ScalableGame.java:158)
    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 data.src.Core.main(Core.java:30)
Sun Jan 05 01:17:25 MST 2014 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 data.src.Core.main(Core.java:30)

最佳答案

squareCorrectsquareIncorrect 为空,因为您在使用变量之前没有设置它们。

您应该在声明它们之后立即加载它们:

public Image squareIncorrect;
public Image squareCorrect;
{
    squareIncorrect = new Image("res/squareCorrect");
    squareIncorrect = new Image("res/squareIncorrect");
}

关于java - 调用以 Graphics g 为边界的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20931464/

相关文章:

java - 如何从另一个类的静态方法更改静态变量的值

javascript - JS。遍历多维数组以计算每列中元素的出现次数

java - DataSize 验证的注释

java - 用Java命名文件以包含日期和时间戳

JavaScript concat 没有按预期工作,需要详细说明吗?

typescript 中的数组

java - return 语句有问题

java - 在 Java 中,如果两个类同时调用第三个类中的方法会发生什么情况?

javascript - AJAX 方法 Jquery 无法返回数据

Java编译错误 'package does not exist'