当对象到达另一个对象AS3时删除它

时间:2015-10-30 08:21:50

标签: actionscript-3 flash oop

初学者。我在时间轴上有一个实例名称为' island'的符号,所以基本上我想要移除击中该岛的单元格

if (cell.hitTestObject (island)) {

             if(stage.contains(cell))
             removeChild (cell);
         }

我在moveCell函数下尝试了这个,但它只删除了一个单元格,而不是每个单元格都可以移动到岛上。谢谢大家!

到目前为止,这是我的代码:

 package  {
    import flash.display.MovieClip;
    import flash.utils.Timer;
    import flash.events.TimerEvent;

    public class Main extends MovieClip {

        public var cell:Cell;
        public var group:Array;
        public var gameTimer:Timer;


        public function Main() {

            cell = new Cell (400, -15);
            addChild (cell);

            group = new Array();
            var newCell = new Cell (100, -15);
            group.push ( newCell);
            addChild(newCell);


            gameTimer = new Timer (25);
            gameTimer.addEventListener(TimerEvent.TIMER,moveCell);
            gameTimer.start();
        }

        public function moveCell (timerEvent:TimerEvent):void {

             if (Math.random() < 0.01) {
             var randomX:Number = Math.random() * 700;
             var newCell:Cell = new Cell (randomX, -15);
             group.push (newCell);
             addChild(newCell);
             }


         for each(var i:MovieClip in group) {
             if (i.hitTestObject(island)) {

                i.visible = false;
                //i.parent.removeChild(i); 

                var score:int = 0;

                 score ++;

                scoreOutPut.text = score.toString();



             }   
         }



        }

    }

}`

1 个答案:

答案 0 :(得分:1)

您有“无法访问空对象引用的属性或方法”,因为您已从Cell(其父级)中删除了DisplayObjectContainer对象,但未从{{1}中删除}数组,所以在你的group循环的下一次迭代中,该对象不再存在,并且将触发该错误。

为避免这样做,你可以这样做:

for

对于for(var i:int = 0; i < group.length; i++) { var cell:Cell = Cell(group[i]); if (cell.hitTestObject(island)) { cell.parent.removeChild(cell); group.splice(i, 1); score++; } } ,它应该是所有课程的全局属性,每次都要更新。

此外,为了让您的代码更有条理,更清晰,最好将每个任务放在一个方法中。

例如,要创建单元格,您可以使用score方法:

createCell()

然后,您可以在代码中的任何位置使用它,例如,您在构造函数中创建的两个第一个单元格:

// 0 is the default value of __x and -15 is the default one of __y
private function createCell(__x:Number = 0, __y:Number = -15): void 
{
    var cell:Cell = new Cell(__x, __y);
    group.push(cell);
    addChild(cell);
}

public function Main() { // .. createCell(400); createCell(100); // ... } 方法内部:

moveCell()

此外,如果您确实不需要将属性或方法设为if (Math.random() < 0.01) { var randomX:Number = Math.random() * 700; createCell(randomX); } ,请不要将其公之于众。

...

希望可以提供帮助。