String Array итерация и setsWith () - PullRequest
0 голосов
/ 05 апреля 2011

У меня есть класс, который отвечает за анимацию некоторых изображений.У меня есть 3 класса игроков, каждый из которых создает свой собственный экземпляр этого класса анимации.Каждый класс проигрывателя отправляет путь String и массив String имен файлов в мой класс анимации.Так что я делаю, проверяя, начинается ли массив строк с именами файлов вверх, вниз, влево или вправо.Затем я добавляю их в массив буферизованных изображений, в общей сложности 4 именуются вверх, вниз, влево и вправо.

Теперь, когда игрок хочет перейти влево, например, левое [] будет анимировано, то же самое относится и кнаправление вверх и т. д. Проблема в том, что в каждом массиве сохраняется только одно изображение.Например, up [] буферизованных изображений содержит только одно изображение up, в то время как их должно быть 3 (есть 3 изображения для каждого направления).Я не могу понять это.

Следующий код взят из моего класса Animation, который обрабатывает массивы.Может кто-нибудь сказать мне, если я что-то упустил?

Если это не имело никакого смысла, мои извинения:) ... это звучало хорошо в моей голове

спасибо

try
    {
        for (String file : fileName)
        {
            String path = PATH + file + EXT;

            for (int i = 0; i < arrayLength; i++)
            {
                if (file.startsWith("u"))
                {
                    up[i] = ImageIO.read(new File(path));
                }

                if(file.startsWith("d"))
                {
                    down[i] = ImageIO.read(new File(path));
                }

                if (file.startsWith("l"))
                {
                    left[i] = ImageIO.read(new File(path));
                }

                if (file.startsWith("r"))
                {
                    right[i] = ImageIO.read(new File(path));
                }
            }
        }
    }
    catch (IOException e)
    {
        System.out.println("Could not load images: " + e);
    }
    catch (ArrayIndexOutOfBoundsException e)
    {
        System.out.println("Array out of bounds: " + e);
    }

Ответы [ 2 ]

0 голосов
/ 05 апреля 2011

У меня возникли проблемы с выполнением вашего описания, но, глядя на ваш код, я думаю о том, что может быть вашей проблемой.Во-первых, не связанное с вашей проблемой предложение по кодированию, у вас есть взаимоисключающие случаи (file.startsWith (...)), которые вы тестируете с помощью ifs, вы должны иметь другое, чтобы, когда один из тестов дал положительный результат, другие могли игнорироваться:

for (String file : fileName) {
  String path = PATH + file + EXT;

  for (int i = 0; i < arrayLength; i++) {
    if (file.startsWith("u")) {
      up[i] = ImageIO.read(new File(path));
    } else if(file.startsWith("d")) {
      down[i] = ImageIO.read(new File(path));
    } else if (file.startsWith("l")) {
      left[i] = ImageIO.read(new File(path));
    } else if (file.startsWith("r")) {
      right[i] = ImageIO.read(new File(path));
    }
  }
}

Что касается логики кода, я вижу одну потенциальную проблему в том, что индекс вашего массива, похоже, неправильно связан с файлом.На данный момент ваш код может быть переписан таким образом без изменения его эффектов:

for (String file : fileName) {
  String path = PATH + file + EXT;

  BufferedImage array = null;
  if (file.startsWith("u")) {
    array = up;
  } else if(file.startsWith("d")) {
    array = down;
  } else if (file.startsWith("l")) {
    array = left;
  } else if (file.startsWith("r")) {
    array = right;
  }

  for (int i = 0; i < arrayLength; i++) {
    array[i] = ImageIO.read(new File(path));
  }
}

Вы просто пишете новое буферизованное изображение с тем же путем ко всему массиву (или любой другой части, включенной в переменную "arrayLength"") на каждой итерации внешнего цикла.Из-за этого, если «file» каждый раз имеет один и тот же тип (то есть, начальные значения с одним и тем же значением), ваш массив будет содержать только последний элемент в массиве fileName.

Здесь я начну угадыватьваше намерениеЯ предполагаю, что каждая строка в fileName - это один путь, который должен быть следующим изображением в массиве анимации для этого конкретного направления, поэтому вам нужен отдельный индекс для каждого массива:

int upArrayIndex = 0, downArrayIndex = 0,
   leftArrayIndex = 0, rightArrayIndex = 0;
for (String file : fileName) {
  String path = PATH + file + EXT;

  if (file.startsWith("u")) {
    up[upArrayIndex++] = ImageIO.read(new File(path));
  } else if(file.startsWith("d")) {
    down[downArrayIndex++] = ImageIO.read(new File(path));
  } else if (file.startsWith("l")) {
    left[leftArrayIndex++] = ImageIO.read(new File(path));
  } else if (file.startsWith("r")) {
    right[rightArrayIndex++] = ImageIO.read(new File(path));
  }
}

Iнадеюсь, что это правильный путь для вопроса, который вы задаете, или, по крайней мере, даст вам представление, с чего начать.

0 голосов
/ 05 апреля 2011

Вот ответ без ответа.Установите точку останова в этом методе с помощью отладчика.Вы запускаете этот код в IDE, например Eclipse ?Корень, вызывающий эту проблему, будет намного легче, когда вы действительно увидите поток выполнения вашей программы - и это важный инструмент для любого разработчика, который хочет по-настоящему понять некоторый данный код.В качестве примечания, я думаю, что ваша проблема связана с arrayLength.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...