2013-02-20 3 views
0

Работа с массивами. Я создаю объекты на базе класса, вставляю их в массив, у меня есть две кнопки: один добавляет Ребенка и толкает его в Массив, второй - Shifts Array и удаляет Ребенка. Кроме того, функция на моей мыши, если я нажимаю объект, я определяю, что это номер массива, удалите Child и ... ну, не уверен, что успешно, но «delete Array [i];», где i - номер массива цели. Я могу видеть Array.length в текстовом поле каждый раз, когда что-то делаю. Вторая кнопка фактически удаляет объект из массива, число уменьшается. Но удаление указанного объекта из массива, а также Array.slice (i, 1) не уменьшает длину массива. Поэтому я боюсь, что это может привести к переполнению. Это только Array, не уверен, может быть, это нормально, чтобы иметь более миллиона ячеек в массиве? Как будто я делаю игру с метеорным потоком, метеоры удаляются с экрана, но у массива все еще есть свои ячейки. И если они выглядят как 30-50 в секунду, очевидно, что я могу получить проблемы с памятью за 20 минут после ее запуска. Ну, это 60k, так что, может быть, Не стоит беспокоиться, так как только графика занимает много памяти?Переполнение стека AS3?

Тем не менее, я мог бы использовать совет о том, как перемещать объект в середине массива. Избранный. Как удалить его, как если бы он никогда не был создан, как и Shift? (не так ли?)

ответ

1

Array.splice() сделаю большую часть трюков. Как удалить метеор от экрана, вы можете склеить его из массива, сделайте так:

var i:int=meteorArray.indexOf(meteorToRemove); 
if (i>=0) meteorArray.splice(i,1); 
+0

Я клянусь, флэш пытается убить мой мозг! Я пробовал это раньше, это не сработало, теперь это так. XD Спасибо! – SherWood

1

Вы не должны создать новый объект, как хорошая практика, если вы удаляете другими. Попробуйте переработать или лучше сказать «пулы объектов»

Вы должны выяснить количество максимальных элементов, которые вы можете использовать сразу. создайте свойство «активно» для каждого и установите его в true или false вместо создания/удаления. Затем вы можете запустить обновление на каждом объекте и обновлять его только при необходимости

Например:

var meteors:Array = []; 

// create 500 meteors 
for (var i:int = 0; i < 500; i++) { 
    var meteor:Meteor = new Meteor(); 
    meteor.active = false; 
    meteors.push(meteor); 
} 

// enable one meteor 
meteors[0].active = true; 

// in your update method: 
for each (var meteor in meteors) 
    if (meteor.active) 
    meteor.update(); 

Надежда, что помогает.

Также вы можете добавить вспомогательный метод, чтобы получить метеор доступный:

function getMeteorAvailable():Meteor 
{ 
    for each (var meteor in meteors) 
     if (!meteor.active) 
     return meteor; 
} 
+0

нужно научиться ходить, прежде чем он сможет летать. Очевидно, он научился ползти. Хотя эта идея правильная, она для него еще слишком продвинута, ИМХО. – Vesper

+1

Vesper, я быстрый ученик = P mika, спасибо, попробует это, немного сложнее, чем просто очистить массив или сделать новый, но имеет смысл = D – SherWood

+0

Право на @SherWood Не стесняйтесь прокомментировать это если у вас есть вопросы – mika

Смежные вопросы