Итерация массива строк и StartsWith()

#java #arrays #image #iteration

#java #массивы #изображение #итерация

Вопрос:

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

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

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

Если это не имело абсолютно никакого смысла, мои извинения 🙂 … это звучало хорошо в моей голове

Спасибо

 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);
    }
  

Ответ №1:

У меня возникли некоторые проблемы с вашим описанием, но, глядя на ваш код, вот мои мысли о том, что потенциально может быть вашей проблемой. Первое, не связанное с вашей проблемой предложение по кодированию, у вас есть взаимоисключающие случаи (file.StartsWith(…)), которые вы тестируете с помощью ifs, у вас должно быть else, чтобы при положительном результате одного теста другие можно было игнорировать:

 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» каждый раз имеет один и тот же тип (т. Е. StartsWith имеет одно и то же значение), ваш массив всегда будет содержать только последний элемент в массиве 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));
  }
}
  

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

Комментарии:

1. Да, после просмотра dubugger в netbeans я обнаружил, что каждый массив заполнялся одним и тем же изображением. Я хотел сохранить класс Animation как можно более универсальным, чтобы, какой бы массив ему ни передавался, изображения вверх, вниз, влево и вправо помещались в соответствующий массив и анимировались соответствующим образом. Спасибо за ответ, это отличная помощь. Думаю, теперь я знаю, как к этому подойти 🙂

Ответ №2:

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

Комментарии:

1. Я использую netbeans, в настоящее время использую dubugger now. Кажется, что он заполняет массив первым изображением, затем вторым и, наконец, третьим. Итак, я, кажется, в итоге получаю массив, заполненный одним и тем же изображением .. хммммм