Как переместить элемент в конец отсортированного массива в Java? - PullRequest
0 голосов
/ 08 июля 2019

Во-первых, я прошу прощения, если это относится к gamedev, а не здесь, во-вторых, я все еще изучаю java, так что извините, если ответ очень прост, или если я не пойду правильно.

Я делаю игру с использованием фреймворка slick2d, с помощью присутствующих здесь людей мне удалось поместить все мои персонажи в массив, отсортировать этот массив по значению оси Y и нарисовать их в таком порядке , чтобы создать иллюзию zaxis. Однако теперь я хочу добавить новый алгоритм сортировки, чтобы после обычной сортировки он выталкивал все мертвые символы в конец массива по причине игрового процесса.

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

Я так долго смотрел на этот код, что не могу понять, что с ним не так, помощь будет очень признательна.

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

//this is what I have 

Creature temp = null;
for(int i=0; i<drawArray.length; i++) {
    if(drawArray[i].isDead){
        temp = drawArray[0];
        drawArray[0] = drawArray[i];
        int k = i
        for(int j=0; j < (i-1); j++){
            drawArray[k-1] = drawArray[k];
            k -=1;
        }
        drawArray[1] = temp;
    }
}

1 Ответ

0 голосов
/ 08 июля 2019

Сначала вам нужно получить индекс мертвого парня:

int indexOfDeadGuy = -1;
for (int i=0; i<drawArray.length; i++) {
    if (drawArray[i].isDead) {
        indexOfDeadGuy = i;
        break;
    }
}

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

if (indexOfDeadGuy > -1) {
    Creature deadGuy = drawArray[indexOfDeadGuy];
    for (int i = indexOfDeadGuy; i > 0; i--) {
        drawArray[i] = drawArray[i - 1];
    }
    drawArray[0] = deadGuy;
}

Редактировать: Если вам нужно справиться, когда более одного существа мертвы, вам нужно переосмыслить подход.Один из способов сделать это - скопировать массив (в данном случае в список), а затем повторно заполнить исходный массив за два прохода:

// first, copy the array (in this case into a list)
List<Creature> tempList = new ArrayList<>(Arrays.asList(drawArray));

// the index of the next position in the array to insert a creature
int targetIndex = 0;

// fill the array with dead things
for (Creature creature : tempList) {
    if (creature.isDead) {
        drawArray[targetIndex] = creature;
        targetIndex++;
    }
}

// continue filling the array with non-dead things
for (Creature creature : tempList) {
    if (!creature.isDead) {
        drawArray[targetIndex] = creature;
        targetIndex++;
    }
}

. В начале списка будут собраны все мертвые существа.и все не умершие существа после этого в том же относительном порядке.

...