Java ArrayList 似乎在 init 方法之后无效

标签 java arrays object arraylist slick2d

基本上,在我的 init 方法中,我创建了一个数组列表并用 wizardObjects 的新实例填充它。 wizardObjects 有 4 个适当填充的构造函数。运行 for 循环后,我什至有一个 System.out.println 来验证列表是否已填充。

我的问题是,当渲染方法、更新方法或任何其他方法启动时,arraylist 会抛出一个空指针异常。我不会在任何地方重新分配或重新初始化它。

顺便说一句,我正在使用 slick2d,但我认为这对这个问题来说并不重要。

public void init(GameContainer container) throws SlickException {



        SpriteSheet spritesheet1 = new SpriteSheet("/res/mainsprites.png", 32, 32);

        wizardSprite = spritesheet1.getSprite( 5,3 );

        wizardXArray = new int[100];
        wizardYArray = new int[100];

        random = new Random();
map = new TiledMap("/res/map.tmx");

        ArrayList<WizardObject> wizList = new ArrayList <WizardObject>(100);

        for(int i = 0; i < 100 ;i++){


            int randX = random.nextInt(100) * 32;
            wizardXArray[i] = randX;
            int randY = random.nextInt(100) * 32;
            wizardYArray[i] = randY;
            WizardObject wizardObject  = new WizardObject(wizardXArray[i], wizardYArray[i], wizardSprite, map);
            wizList.add(wizardObject);


        }
        for(int x = 0; x < 100 ;x++){
            System.out.println(wizList.get(x));
            System.out.println(wizList.get(x).getX() + "  " + wizList.get(x).getY());

            }



public void render(GameContainer container, Graphics g)
            throws SlickException {

if(wizList == null ){

                    System.out.println("true");
                }}

对于没有时间阅读所有内容的人来说,这就是代码的要点。对于那些这样做的人:

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;

import org.newdawn.slick.Animation;
import org.newdawn.slick.AppGameContainer;
import org.newdawn.slick.BasicGame;
import org.newdawn.slick.Color;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.SpriteSheet;
import org.newdawn.slick.particles.ParticleSystem;
import org.newdawn.slick.tiled.TiledMap;
import org.newdawn.slick.util.Log;
import org.newdawn.slick.gui.AbstractComponent;
import org.newdawn.slick.gui.ComponentListener;
import org.newdawn.slick.gui.MouseOverArea;
import org.newdawn.slick.gui.TextField;

import com.tinyline.tiny2d.i;

public class MainGameLoop extends BasicGame {
    private static final int PLAYER_SIZE = 32;
    private static final int TILE_SIZE = 32;
      private boolean[][] blocked;
    private int playerX = 50;
    private int playerY = 50;

    private int widthInTiles;
    private int heightInTiles;

    private int topOffsetInTiles;
    private int [] wizardXArray;
    private int [] wizardYArray;


    private int leftOffsetInTiles;
    private int randX;
    private int randY;
    private TiledMap map;
    private Image wizardSprite;
    private long currentTime;
    private long dblUpdateTime;
    private long updateTime;
    private boolean isTicking = false;
    private boolean isTocking = false;
    private Random random;
    private boolean isIntroOver = false;
    private Image titleImage;
    private Image[] circleImage;
    private Animation circleAnim;
    private SpriteSheet spritesheet1;
    public int[] circleDuration = { 300, 300, 300 };

    private int x = 100;
    private int y = 100;
    private int dx = 1;
    private int dy = 1;

    private int rx = 1;
    private int ry = 450;
    private int rdx = 1;
    private int rdy = 1;

    private int fx = 1;
    private int fy = 450;
    private int fdx = 1;
    private int fdy = 1;

    private int pdx = 1;
    private int pdy = 1;
    private int px = 1;
    private int py = 450;

    private int wdx = 1;
    private int wdy = 1;
    private int wx = 1;
    private int wy = 450;

    private Image image;

    public Image baseBGImage;
    public Image basePotionImage;
    public Image[] brenImage;
    public Animation brenAnim;
    public int[] duration = { 300, 300, 300, 300 };
    public WizardObject wizardObject;
    public List<WizardObject> wizList;

    private boolean isWizardDrawn;


    public MainGameLoop() {
        super("MainGameLoop");
    }

    /**
     * @see org.newdawn.slick.BasicGame#init(org.newdawn.slick.GameContainer)
     */
    public void init(GameContainer container) throws SlickException {



        SpriteSheet spritesheet1 = new SpriteSheet("/res/mainsprites.png", 32, 32);

        wizardSprite = spritesheet1.getSprite( 5,3 );

        wizardXArray = new int[100];
        wizardYArray = new int[100];

        random = new Random();
        image = new Image("/res/GreenFire.png");
        map = new TiledMap("/res/map.tmx");

        ArrayList<WizardObject> wizList = new ArrayList <WizardObject>(100);

        for(int i = 0; i < 100 ;i++){


            int randX = random.nextInt(100) * 32;
            wizardXArray[i] = randX;
            int randY = random.nextInt(100) * 32;
            wizardYArray[i] = randY;
            WizardObject wizardObject  = new WizardObject(wizardXArray[i], wizardYArray[i], wizardSprite, map);
            wizList.add(wizardObject);





        }
        for(int x = 0; x < 100 ;x++){
            System.out.println(wizList.get(x));
            System.out.println(wizList.get(x).getX() + "  " + wizList.get(x).getY());

            }

        Image[] brenImage = { new Image("/res/Bren1.png"),
                new Image("/res/Bren2.png"), new Image("/res/Bren4.png"),
                new Image("/res/Bren7.png") };
        brenAnim = new Animation(brenImage, duration, true);


         // build a collision map based on tile properties in the TileD map
        blocked = new boolean[map.getWidth()][map.getHeight()];
        for (int x = 0; x < map.getWidth(); x++) {
            for (int y = 0; y < map.getHeight(); y++) {
                int tileID = map.getTileId(x, y, 0);
                String value = map.getTileProperty(tileID, "blocked", "false");
                if ("true".equals(value)) {
                    blocked[x][y] = true;
                }
            }
        }

        updateTime = System.currentTimeMillis() + 200;
        dblUpdateTime = System.currentTimeMillis() + 400;

        titleImage = new Image("/res/title.png");
        baseBGImage = new Image("/res/baseBG.png");
        basePotionImage = new Image("/res/potions.png");
        Image[] circleImage = { new Image("/res/circle_f1.png"),
                new Image("/res/circle_f2.png"),
                new Image("/res/circle_f3.png") };
        circleAnim = new Animation(circleImage, circleDuration, true);

        // calculate some layout values for rendering the tilemap. How many
        // tiles
        // do we need to render to fill the screen in each dimension and how far
        // is
        // it from the center of the screen
        widthInTiles = container.getWidth() / TILE_SIZE;
        heightInTiles = container.getHeight() / TILE_SIZE;
        topOffsetInTiles = heightInTiles / 2;
        leftOffsetInTiles = widthInTiles / 2;




        // system = new ParticleSystem();

        // update the vector of movement based on the initial angle

        Log.info("Window Dimensions in Tiles: " + widthInTiles + "x"
                + heightInTiles);
    }

    /**
     * @see org.newdawn.slick.BasicGame#update(org.newdawn.slick.GameContainer,
     *      int)
     */
    public void update(GameContainer container, int delta)
            throws SlickException {






        if (rx > container.getWidth() - brenAnim.getWidth())
            rdx = -1;

        if (rx < 0)
            rdx = 1;

        if (ry > (container.getWidth() - brenAnim.getHeight()) - 250)
            rdy = -1;

        if (ry < 440)
            rdy = 1;

        rx = rx + rdx * 3;
        ry = ry + rdy;

        if (fx > container.getWidth() - 1000)
            fdx = -1;

        if (fx < -500)
            fdx = 1;
        if (fy > (container.getWidth() - baseBGImage.getHeight()) - 200)
            fdy = 0;

        if (fy < 450)
            fdy = 1;

        fx = fx + fdx * 2;
        fy = fy + fdy * 2;

        if (px > container.getWidth() - 900)
            pdx = -1;

        if (px < -200)
            pdx = 1;
        if (py > container.getWidth() - wizardSprite.getHeight())
            pdy = -1;

        if (py < 430)
            pdy = 1;

        px = px + pdx;
        py = py + pdy;

        if (wx > map.getWidth())
            wdx = -1;

        if (wx < 0)
            wdx = 1;

        if (wy > map.getWidth() - wizardSprite.getHeight())
            wdy = -1;

        if (wy < 430)
            wdy = 1;

        wx = wx + wdx;
        wy = wy + wdy;


        currentTime = System.currentTimeMillis();
        if (currentTime >= updateTime) {

            isTicking = true;
            updateTime = (currentTime + 200);

        } else {

            isTicking = false;
        }
        if (currentTime >= dblUpdateTime) {

            isTocking = true;
            dblUpdateTime = (currentTime + 400);
            //System.out.println(container.getFPS());

        } else {

            isTocking = false;
        }

        if (isIntroOver == false) {



            isWizardDrawn = false;

            if (x > container.getWidth() - titleImage.getWidth())
                dx = -1;

            if (x < 0)
                dx = 1;

            if (y > (container.getWidth() - titleImage.getHeight()) - 350)
                dy = -1;

            if (y < 0)
                dy = 1;

            x = x + dx;
            y = y + dy;

            if (isTicking == true) {
                // System.out.println("x = " + x);
                // System.out.println("y = " + y);

                for (int x = 0; x < map.getWidth(); x++) {
                    for (int y = 0; y < map.getHeight(); y++) {

                        map.setTileId(x, y, 0, random.nextInt(191));

                    }
                }

                if (container.getInput().isKeyPressed(Input.KEY_ENTER)) {

                    isIntroOver = true;
                    for (int x = 0; x < map.getWidth(); x++) {
                        for (int y = 0; y < map.getHeight(); y++) {

                            map.setTileId(x, y, 0, random.nextInt(191));
                        }

                    }


                }
            }
        }



        if (isIntroOver == true) {

            if(container.getInput().isKeyPressed(Input.KEY_ENTER)){


                isWizardDrawn = true;
            }

            if (container.getInput().isKeyDown(Input.KEY_W)) {

                if (container.getInput().getMouseX() > 775) {
                    if (isTicking == true) {
                        playerX += 2;
                    }

                }
                if (container.getInput().getMouseX() < 50) {
                    if (isTicking == true) {
                        playerX -= 2;
                    }

                }
                if (container.getInput().getMouseY() < 425) {
                    if (isTicking == true) {
                        playerY -= 2;
                    }

                }
                if (container.getInput().getMouseY() > 50) {
                    if (isTicking == true) {
                        playerY += 2;
                    }

                }
            }

            if (container.getInput().isMousePressed(0)) {
                int mx = container.getInput().getMouseX();
                int my = container.getInput().getMouseY();

                // int tileIDmid = map.getTileId(mx, my, 0);
                int px = playerX;
                int py = playerY;
                //
                // map.setTileId((px + (mx / 32) - 13) , py + ((my / 32) - 10),
                // 0, 3);
                int clickedTile = map.getTileId((px + (mx / 32) - 13), py
                        + ((my / 32) - 10), 0);
                if (clickedTile > 185) {

                    System.out.println("true");

                }
                //
                // System.out.println("Clicked x: " + mx + " y: " + my);

            }
        }

        if (container.getInput().isKeyDown(Input.KEY_ESCAPE)) {

            if (container.isFullscreen()) {

                container.setFullscreen(false);
                container.setMouseGrabbed(false);
            } else {

                container.exit();
            }
        }
        if (container.getInput().isKeyDown(Input.KEY_M)) {

            container.setFullscreen(true);
            container.setMouseGrabbed(true);

        }

    }

    private boolean blocked(float x, float y) {

        return blocked[(int) x][(int) y];

    }

    private boolean tryMove(int x, int y) {
        int newx = playerX + x;
        int newy = playerY + y;
// first we try the real move, if that doesn't work
// we try moving on just one of the axis (X and then Y) 
// this allows us to slide against edges
        if (blocked(newx, newy)) {
            if (blocked(newx, playerY)) {
                if (blocked(playerX, newy)) {
// can't move at all!
                    return false;
                } else {
                    playerY = newy;
                    return true;
                }
            } else {
                playerX = newx;
                return true;
            }
        } else {
            playerX = newx;
            playerY = newy;
            return true;
        }
    }


    /**
     * @see org.newdawn.slick.Game#render(org.newdawn.slick.GameContainer,
     *      org.newdawn.slick.Graphics)
     */
    public void render(GameContainer container, Graphics g)
            throws SlickException {

        // draw the appropriate section of the tilemap based on the centre
        // (hence the -(TANK_SIZE/2)) of
        // the player
        int playerTileX = (int) playerX;
        int playerTileY = (int) playerY;

        // caculate the offset of the player from the edge of the tile. As the
        // player moves around this
        // varies and this tells us how far to offset the tile based rendering
        // to give the smooth
        // motion of scrolling
        int playerTileOffsetX = (int) ((playerTileX - playerX) * TILE_SIZE);
        int playerTileOffsetY = (int) ((playerTileY - playerY) * TILE_SIZE);

        // render the section of the map that should be visible. Notice the -1
        // and +3 which renders
        // a little extra map around the edge of the screen to cope with tiles
        // scrolling on and off
        // the screen
        map.render(playerTileOffsetX - (PLAYER_SIZE / 2), playerTileOffsetY
                - (PLAYER_SIZE / 2), playerTileX - leftOffsetInTiles - 1,
                playerTileY - topOffsetInTiles - 1, widthInTiles + 3,
                heightInTiles + 3);



        // draw entities relative to the player that must appear in the center
        // of the screen

        g.translate(400 - (int) (playerX * 32), 300 - (int) (playerY * 32));




        // draw other entities here if there were any


        g.resetTransform();

        if (isIntroOver == false) {

            int mx = container.getInput().getMouseX();
            int my = container.getInput().getMouseY();
            g.drawAnimation(circleAnim, mx - 32, my - 32);
            g.drawImage(titleImage, x, y);

            g.setColor(Color.black);
            g.fillRect(0, 450, 800, 150);

            g.drawImage(baseBGImage, fx, fy);
            g.drawAnimation(brenAnim, rx, ry);
            g.drawImage(basePotionImage, px - 50, py + 70);
            g.setColor(Color.white);
            g.drawRect(0, 450, 799, 149);


        }

        if (isIntroOver == true){

            g.drawImage(baseBGImage, fx, fy);
            //g.drawAnimation(brenAnim, rx, ry);
            g.drawImage(basePotionImage, px - 50, py + 70);
            //g.setColor(Color.black);
            //g.fillRect(0, 450, 800, 150);
            g.drawAnimation(brenAnim, 300, ry);
            g.drawRect(0, 450, 799, 149);
            g.drawRect(1, 451, 798, 148);



            //long slideTime = System.currentTimeMillis() + 2000;



            if (isWizardDrawn == true){


                g.translate(400 - (int) (playerX * 32), 300 - (int) (playerY * 32));

                if(wizList == null ){

                    System.out.println("true");
                }



                }

            }


            if (fy < 1000 && py < 900 ){
            fy = fy + 1;
            py = py + 2;






            //if (slideCount <=1){
            //slideTime = System.currentTimeMillis() + 2000;
            //slideCount++;}
            //else{
            //g.setColor(Color.black);
            //g.fillRect(0, 450, 800, 150);}



            }









            if(container.getInput().isKeyPressed(Input.KEY_ESCAPE)){


                isIntroOver = false;



        }}






    /**
     * 
     * 
     * @param argv
     *            The argument passed on the command line (if any)
     */
    public static void main(String[] argv) {
        try {
            // create a new container for our example game. This container
            // just creates a normal native window for rendering OpenGL
            // accelerated
            // elements to
            AppGameContainer container = new AppGameContainer(
                    new MainGameLoop(), 800, 600, false);
            container.setAlwaysRender(true);
            container.setVSync(true);
            container.setShowFPS(false);
            container.setMouseGrabbed(false);
            container.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

最佳答案

您的 init 方法初始化一个局部变量:

ArrayList<WizardObject> wizList = new ArrayList <WizardObject>(100);

类成员保持未初始化状态,因此它包含 null(默认值):

public List<WizardObject> wizList;

改变

ArrayList<WizardObject> wizList = new ArrayList <WizardObject>(100);

wizList = new ArrayList <WizardObject>(100);

关于Java ArrayList 似乎在 init 方法之后无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29913162/

相关文章:

java - 如何手动添加依赖到Android Studio

javascript - 使用 JavaScript 自定义比较函数合并两个对象数组

java - 对象的地址在其生命周期内是否固定?

java - 从域对象生成 DTO 和映射器

java - VisualVM 和 Mac OS X 分析问题

java - 现代 IDE 可以检测子树中的字段/方法使用情况吗?

java - 手动添加 IndexOutOfBounds 异常

ruby - 如何在 ruby​​ 中像这样的数组中添加多个数组

ruby - 条件语句是 Ruby 中的对象吗?

来自 PayPal 的 C# UrlReferrer 返回供应商按钮?对象未设置对象的实例