2016-01-21 5 views
1

У меня есть абстрактный класс Sprite, который в своем конструкторе создает массив для отдельных спрайтов. Конструктор берет путь к спрайту, типу спрайтов как перечислению, а также ширине и высоте отдельных спрайтов. Конструктор берет путь к спрайту, загружает его в BufferedImage и захватывает отдельные спрайты из изображения, чтобы загрузить их в массив. Вот класс:Как я могу выборочно сбросить размеры массива?

package exosoft.Zerfall; 

public abstract class Sprite extends Main { 
    BufferedImage spriteSheet = null; 
    BufferedImage[] sprites; 
    int spriteWidth = 0; 
    int spriteHeight = 0; 

    public enum SheetType { 
     SINGLE, 
     HORIZONTAL, 
     VERTICAL, 
     RECTANGULAR 
    } 
    public Sprite(SheetType type, String sheetPath, int spriteWidth, int spriteHeight) { 
     try { 
      spriteSheet = ImageIO.read(new File(sheetPath)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     switch(type) { 
     case HORIZONTAL: 
      sprites = new BufferedImage[spriteSheet.getWidth()/spriteWidth]; 
      for (int i = 0; i < spriteSheet.getWidth()/spriteWidth; i++) { 
       sprites[i] = spriteSheet.getSubimage(i * spriteWidth, 0, spriteWidth, spriteHeight); 
      } 
      break; 
     case RECTANGULAR: 
      break; 
     case VERTICAL: 
      sprites = new BufferedImage[spriteSheet.getHeight()/spriteHeight]; 
      for (int i = 0; i < spriteSheet.getHeight()/spriteHeight; i++) { 
       sprites[i] = spriteSheet.getSubimage(0, i * spriteHeight, spriteWidth, spriteHeight); 
      } 
      break; 
     default: 
      break; 
     } 
    } 
} 

То, что я хочу сделать, это позволить BufferedImage[] sprites массив, чтобы добавить или удалить измерение на основе данного SheetType. Например, здесь есть переключатель заявление, как я хотел бы, чтобы работать:

switch(type) { 
    case HORIZONTAL: 
     sprites = new BufferedImage[spriteSheet.getWidth()/spriteWidth]; 
     //load sprites into one-dimensional array 
     break; 
    case RECTANGULAR: 
     sprites = new BufferedImage[spriteSheet.getWidth()/spriteWidth][spriteSheet.getHeight/spriteHeight]; 
     //load sprites into two-dimensional array 
     break; 
    case VERTICAL: 
     sprites = new BufferedImage[spriteSheet.getHeight()/spriteHeight]; 
     //load sprites into one-dimensional array 
     break; 
    case SINGLE: 
     sprites = new BufferedImage(); 
     //load sprite into zero-dimensional BufferedImage 
     break; 
    default: 
     break; 
} 

Цель состоит в том, чтобы в конечном итоге с массивом с именем sprites с отдельными спрайтов, содержащихся с размерами по мере необходимости. Это вообще возможно? Спасибо.

+0

Нет, это не возможно, так же, как вы сделали выше. Ваша переменная-член 'sprites' должна быть либо нормальной переменной, либо массивом. Почему бы просто не использовать только двумерный массив и использовать 1 для измерения, которое вас не волнует? Он всегда будет работать. – haraldK

ответ

1

Что вы делаете это:

BufferedImage[][] sprites=null; 

case 0-dimension: sprites=new BufferedImage[1][1]; 
case 1-dimension: sprites=new BufferedImage[n][1] 
case 2-dimension: sprites=new BufferedImage[n][m] 

затем

case 0-dimension: sprites[0][0]=new BufferedImage(....); 
case 1-dimension: for(i) sprites[i][0]=new BufferedImage() 
case 2-dimension: for(i) for(j) sprites[i][j]=new BufferedImage() 
+0

Это действительно работает, но моя цель состояла в том, чтобы избавиться от ненужных измерений по мере необходимости. Вы подразумеваете, что это невозможно? – GingerDeadshot

+0

Да, у него не может быть той же переменной, что и безмерность, и как массив - другие возможные решения - создать класс, но тогда вам придется снова указать размерность – gpasch

+0

Хм ... Я чувствую, что это должно быть возможно, но о хорошо, я должен буду с этим справиться, я думаю. Спасибо за Ваш ответ! – GingerDeadshot

Смежные вопросы