#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. Кажется, что он заполняет массив первым изображением, затем вторым и, наконец, третьим. Итак, я, кажется, в итоге получаю массив, заполненный одним и тем же изображением .. хммммм