Как я могу склеить текущий индекс в foreach?
У меня есть этот цикл foreach для проверки на столкновение, и я хочу, чтобы платформа (мувиклип) была удалена в случае столкновения. До сих пор я придумал это:
if (mcContent.mcPlayer.y + mcContent.mcPlayer.height > platformCloud.y)
{
mcContent.mcPlayer.y = platformCloud.y - mcContent.mcPlayer.height - 1;
jump();
mcContent.removeChild(platformCloud);
//platformsCloud.splice(platformCloud);
}
Что это делает, так это удаление фрагмента ролика (пока все хорошо), но без сращивания, когда цикл снова запускается через массив, он все еще там. Таким образом, с закомментированным соединением есть одна маленькая проблема: он удаляет все мувиклипы из массива по отдельности.
Как я могу склеить только текущий индекс, который проверяется?
2 ответа
.splice()
принимает начальный индекс и количество удаляемых элементов, а не объект, который вы хотите удалить из массива.
параметры
startIndex:int
- Целое число, которое указывает индекс элемента в массиве, с которого начинается вставка или удаление. Вы можете использовать отрицательное целое число, чтобы указать позицию относительно конца массива (например, -1 - последний элемент массива).
deleteCount:uint
- Целое число, которое указывает количество удаляемых элементов. В это число входит элемент, указанный в параметре startIndex. Если вы не укажете значение для параметра deleteCount, метод удалит все значения из элемента startIndex до последнего элемента в массиве. Если значение равно 0, элементы не удаляются.
Вы хотите сделать это:
var index:int = platformsCloud.indexOf(platformCloud);
platformsCloud.splice(index, 1);
Почему бы просто не создать новый массив элементов для хранения? использование Array.push
добавлять новые предметы. Это на самом деле может быть более эффективным, чем изменение существующего массива. Это также не требует отслеживания индексов (которые необходимы для использования Array.splice
).
Пример кода:
var keptPlatforms = [];
// do stuff
if (mcContent.mcPlayer.y + mcContent.mcPlayer.height > platformCloud.y)
{
mcContent.mcPlayer.y = platformCloud.y - mcContent.mcPlayer.height - 1;
jump();
mcContent.removeChild(platformCloud);
} else {
keptPlatforms.push(platformCloud);
}
// later, after this cycle, use the new Array
platformClouds = keptPlatforms;
Теперь причина platformsCloud.splice(platformCloud)
удаляет все элементы, потому что первый аргумент приведен к целому числу, поэтому он эквивалентен platformsCloud.splice(0)
который говорит "удалить 0-й индексированный элемент до конца массива". И это действительно очищает массив.
Использовать Array.splice
Вы должны сделать что-то вроде:
// inside a loop this approach may lead to O(n^2) performance
var i = platformClouds.indexOf(platformCloud);
if (i >= 0) {
platformClouds.splice(i, 1); // remove 1 item at the i'th index
}