0

I have a class called Tile which represents a tile in a game. In my main screen, I have a loop that draws the tiles on the user's screen. I want to turn each of these tiles into their own objects. I need to store the data for each tile(coordinates, etc) in an array so that I can access them later. I also need to store this array in a class property so I can access them in any method of the main screen class. My code throws an exception on the line boardTiles[totalTiles] = new Tile(...); I assume it's because I am improperly assigning the objects to the array somehow. How do I fix this?

The main screen java code:

public class MyGame extends JPanel {

    public Tile[] boardTiles;

    private void drawHexGridLoop(Graphics g, Point origin, int size, int radius, int padding) {
        double ang30 = Math.toRadians(30);
        double xOff = Math.cos(ang30) * (radius + padding);
        double yOff = Math.sin(ang30) * (radius + padding);
        int half = size / 2;

        int[] diceSpaces = {2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12};
        diceSpaces = shuffleInts(diceSpaces);

        String[] resourcesDefault = new String[]{ 
            "Lumber", "Lumber", "Lumber", "Lumber",
            "Whool", "Whool", "Whool", "Whool",
            "Stone", "Stone", "Stone",
            "Wheat", "Wheat", "Wheat", "Wheat",
            "Brick", "Brick", "Brick",
            "Wasteland"};

        String[] resources = shuffleStrs(resourcesDefault);

        int totalTiles = 0;
        for (int row = 0; row < size; row++) {
            int cols;
            cols = size - java.lang.Math.abs(row - half);
            for (int col = 0; col < cols; col++) {                
                int xLbl = row < half ? col - row : col - half;
                int yLbl = row - half;
                int x = (int) (origin.x + xOff * (col * 2 + 1 - cols));
                int y = (int) (origin.y + yOff * (row - half) * 3);
                String resource;
                resource = resources[totalTiles];
                int assignedDice;
                if(resource.equals("Wasteland")){
                    assignedDice = 0;
                } else {
                    assignedDice = diceSpaces[totalTiles];
                }
                drawHex(g, x, y, radius, resource, assignedDice);
                boardTiles[totalTiles] = new Tile(totalTiles, xLbl, yLbl, resource, diceSpaces[totalTiles]);  
                totalTiles++;
            }
        }
    }
}

Tile.java:

import java.awt.*;
import javax.swing.*;
public class Tile {

    public int xCoord;
    public int yCoord;
    public int xPoly;
    public int yPoly;
    public String resource;
    public int diceNumber;
    //Starts in top left, goes clockwise.  Indicates what occupies a corner(settlement or city and player that owns it.
    public String Corner1;
    public String Corner2;
    public String Corner3;
    public String Corner4;
    public String Corner5;
    public String Corner6;
    //Starts on top, goes clockwise.  Indicates if a player's road occupies a certain side of the tile.
    public String Side1;
    public String Side2;
    public String Side3;
    public String Side4;
    public String Side5;
    public String Side6;
    public boolean hasRobber;
    private PolygonObject hexagon;

    Tile(int ID, int posX, int posY, String resource, int diceNumber){  

       this.diceNumber = diceNumber;
       this.resource = resource;

    }
}
ShoeLace1291
  • 4,551
  • 12
  • 45
  • 81
  • what exception exactly? – ItamarG3 Oct 28 '16 at 15:35
  • Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException – ShoeLace1291 Oct 28 '16 at 15:36
  • 1
    Hint: having variables names Corner1 to Corner6 is a clear indication that you are doing something wrong. You already know about arrays, so **use** them! Besides: Variable names go camelCase. Always! – GhostCat Oct 28 '16 at 15:36
  • You are missing a simple `boardTiles = new ... ` statement. And for the record: you should try to write **less** code before you start testing. Start testing as soon as you got a tiny bit of functionality! – GhostCat Oct 28 '16 at 15:38

1 Answers1

0

You need to initialize the array of board tiles before you actually use it:

public Tile[] boardTiles = new Tile[size*size];
Tim Biegeleisen
  • 502,043
  • 27
  • 286
  • 360