2012-06-10 21 views
1

我一直在努力,现在两晚做到这一点,并没有任何的喜悦,如果你能请帮助...删除阵列以及它与鼠标点击的内容AS3的Flash CS5.5

简单的投掷游戏与飞镖和其他武器,我正在尝试做的是 当我更换武器时,删除一个阵列及其所有的孩子,

我确信有一个简单的代码片段,将删除所有的孩子和数组没有麻烦,但我还没有弄明白,如果你知道或可以提出任何建议,我会非常感激。

类似于“removeArrayAndAllInstances(balls);”如果只是...... 此刻我有......(球是有问题的阵列)

for(var inter:int = balls.length - 1; inter > -1; inter--) 
     { 
     balls.splice(1); 
     balls.splice(1, balls.length); 
     } 

但出于某种原因,这讲解员的工作,该阵列及其所有的孩子都还上阶段。

我也试过

balls[]; 

没有运气...

请不要评判我的代码我是新手我肯定是显而易见的,我知道它的令人作呕的烂摊子,对不起(它是唯一对我有意义的方法)。

我已经试过无数的事情,希望有人能帮助

在此先感谢.....

var mouseTarget:MovieClip; 
var balls:Array = new Array(); 
var ball:MovieClip = new dart(); 
var hammers:MovieClip = new hammer(); 
ball.x = 150; 
ball.y = 50; 

hammer_btn.addEventListener(MouseEvent.MOUSE_DOWN, hammerweapon); 
dart_btn.addEventListener(MouseEvent.MOUSE_DOWN, dartweapon); 

function removealldartsfromstage(e:MouseEvent):void 
{ 
    for(var inter:int = balls.length - 1; inter > -1; inter--) 
    { 
    balls.splice(1); 
    balls.splice(1, balls.length); 
    } 

    stage.removeEventListener(MouseEvent.MOUSE_UP, addDart);  
} 
function dartweapon(e:MouseEvent):void 
{ 
    stage.removeEventListener(MouseEvent.MOUSE_UP, addHammer); 
    dart_btn.removeEventListener(MouseEvent.CLICK, dartweapon); 
    stage.addEventListener(MouseEvent.MOUSE_UP, addDart); 
    //removeChild(balls); 

} 
function hammerweapon(e:MouseEvent):void 
{ 
    stage.removeEventListener(MouseEvent.MOUSE_UP, addDart); 
    dart_btn.addEventListener(MouseEvent.MOUSE_DOWN, dartweapon); 
    //stage.addEventListener(MouseEvent.MOUSE_UP, addDart); 
    stage.addEventListener(MouseEvent.MOUSE_UP, addHammer); 

} 


function addHammer(e:MouseEvent):void 
{ 
    var hammers = new hammer(); 
    addChild(hammers); 
    removeChild(dart_btn); 
    addChild(dart_btn); 
    dart_btn.addEventListener(MouseEvent.CLICK, dartweapon); 
    balls.splice(10); 
} 

function addDart(e:MouseEvent):void 
{ 
    str.alpha = 0; 
    var ball = new dart(); 
    addChild(ball); 
    removeChild(hammer_btn); 
    addChild(hammer_btn); 
    ball.x = 150; 
    ball.y = 50; 
    balls.push(ball); 
    trace(balls); 
    addEventListener(Event.ENTER_FRAME, checkIfHitTest); 
    hammer_btn.addEventListener(MouseEvent.MOUSE_DOWN, removealldartsfromstage); 
    function checkIfHitTest(Event) 
    { 
     for (var i:int = 0; i<balls.length; i++) 
     { 
      if (balls[i].dart_point.hitTestObject(eyeleft)) 
      { 
       trace("hitleftbullseye"); 
       ball.gotoAndStop("hitlefteyeframe"); 
       Event.currentTarget.removeEventListener(Event.type, checkIfHitTest); 
       balls.splice(i, 1); 
      } 

     } 
    } 
} 
+0

'balls.splice(0);'应该足够了。你为什么要两次调用'splice'然后在一个循环中? 'splice'接受起始索引和'deleteCount',如果你忽略所有元素的默认值。如果您需要一次移除一个项目,则可以使用“pop”或“shift”方法。 – dirkgently

+0

感谢您的回应dirkgently,我没有尝试balls.splice(0);在它自己和它没有工作,我有它在一个循环中,因为有人建议它可能有所帮助,你在代码中看到的是拼命试图让它工作,为什么会balls.splice(0);不行?有任何想法吗? – johnp

+0

尝试'array.splice()'即没有索引。或者,'array.length = 0'。 (我不知道为什么它不起作用。)检查你的数组的大小(即它不是零)。如果前两个不起作用,你可以尝试在循环中使用'pop'一次删除一个项目吗? (var inter:int = balls.length-1; inter> -1; inter--) – dirkgently

回答

1

的球阵列仅仅是球引用的存储。它与舞台或DisplayObjectContainer完全没有关系。所以你必须逐个删除它们。

这是我会怎么做:

while(balls.length > 0) 
{ 
    var ball:MovieClip = balls.pop(); 
    if (ball.parent) // Just to make sure you are referencing the correct container. 
    { 
     ball.parent.removeChild(ball); 
    } 
} 

我跟不上你的游戏的逻辑非常好。也就是说,为了更容易管理它们,你最好创建一个单独的剪辑组。例如,在创建阶段:

var ballContainer:Sprite = new Sprite(); 
addChild(ballContainer); 
for (var i:int = 0; i < ballLimit; i++) 
{ 
    var ball:Dart = new Dart(); 
    ballContainer.addChild(ball); 
} 

这种方式,可以清除他们的孩子都在一次:

function removeAllChildren(container:Sprite) // Or just DisplayObjectContainer 
{ 
    while(container.numChildren > 0) 
    { 
     container.removeChild(container.getChildAt(0)); 
    } 
} 
+0

啊,这很有道理,非常感谢erkmene,我认为它几乎在那里,舞台上的实例现在闪烁并重新出现,所有的孩子也仍然在舞台上,但我认为我们越来越近了,至少我们清楚地与阵列进行了长时间的沟通谢谢! – johnp

+0

对不起,我有MOUSE_DOWN,没有点击,这修复了闪光,你知道我是如何删除其他儿童? – johnp

+0

感谢您的帮助erkmene,非常明确的帮助说明。 – johnp

相关问题