0

使用数组。我在类基础上创建对象,将它们推入数组,我有 2 个按钮:一个添加一个子项并将其推入数组,第二个按钮移动数组并删除子项。也是我鼠标上的一个功能,如果我单击一个对象,我定义它的数组编号,删除子项,然后......好吧,不确定是否成功,但“ delete Array[i]; ”,其中 i 是目标的数组编号。每次我做某事时,我都可以在文本字段中看到 Array.length。第二个按钮实际上确实从数组中删除了一个对象,数量减少了。但是从 Array 中删除指定的对象以及Array.slice(i,1)不会减少 Array 的长度。所以我担心它可能会导致溢出。只是阵列,不确定,也许阵列中有超过一百万个单元格就可以了?就像我用流星雨制作游戏一样,流星从屏幕上移除,但阵列仍然有它们的单元格。如果它们看起来像每秒 30-50 次,很明显我可能会在运行 20 分钟后出现内存问题。好吧,它是 60k,所以也许我不应该担心,因为只有图形会占用很多内存?

不过,我可以使用有关如何在数组中间移动对象的建议。选一个。我如何删除它,就像它从未被创建一样,就像 Shift 一样?(确实如此,对吧?)

4

2 回答 2

1

Array.splice()会做大部分的把戏。当您将流星移出屏幕时,您可以将其从阵列中拼接出来,如下所示:

var i:int=meteorArray.indexOf(meteorToRemove);
if (i>=0) meteorArray.splice(i,1);
于 2013-02-20T06:06:48.247 回答
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;
}
于 2013-02-20T06:11:39.900 回答