如何在Flash游戏中解决此错误?

时间:2015-01-02 13:32:24

标签: actionscript-3 flash-cs5 hittest

我在Flash益智游戏中遇到了问题。如果我在时间轴的第一帧创建游戏它正在工作,但如果游戏已经在第5帧中创建(例如)它确实有效!

它发给我这个错误:

  

TypeError:错误#1009:无法访问null的属性或方法   对象参考。       at Map()TypeError:错误#2007:参数hitTestObject必须为非null。       在flash.display :: DisplayObject / _hitTest()       在flash.display :: DisplayObject / hitTestObject()       在DragDrop / drop()

拖拉类

     package 
{
    import flash.display.*;
    import flash.events.*;


    public class DragDrop extends Sprite
    {
        var origX:Number;
        var origY:Number;
        var target:DisplayObject  ;


        public function DragDrop()
        {
            // constructor code
            origX = x;
            origY = y;
            addEventListener(MouseEvent.MOUSE_DOWN, drag);
            buttonMode = true;
        }

        function drag(evt:MouseEvent):void
        {
            stage.addEventListener(MouseEvent.MOUSE_UP, drop);
            startDrag();
            parent.addChild(this);
        }

        function drop(evt:MouseEvent):void
        {
            stage.removeEventListener(MouseEvent.MOUSE_UP, drop);
            stopDrag();

            if(hitTestObject(target))
            {
                visible = false;
                target.alpha = 1;
                Object(parent).match();
            }

            x = origX;
            y = origY;
        }


    }
}

我认为问题在于var目标!而且我不知道如何解决它。

Map.as     在这里输入代码包 {

import flash.display.*;
import flash.events.*;


public class Map extends MovieClip
{
    var dragdrops:Array;


    public function Map()
    {
        // constructor code
        dragdrops = [tt1];
        var currentObject:DragDrop;
        for(var i:uint = 0; i < dragdrops.length; i++)
        {
            currentObject = dragdrops[i];
            currentObject.target = getChildByName(currentObject.name + "_target");
        }
    }

    public function match():void
    {

    }
}

}

2 个答案:

答案 0 :(得分:0)

这是因为未正确调用hitTestObject方法。必须在Display Object实例中调用此方法,以测试Display Object的另一个实例是否会命中它:

if (myDisplayObject.hitTestObject(anotherDisplayObject))
{
    // do stuff
}

关于hitTestObject方法的Adobe帮助。

修改

所以你应该写那样的课:

package 
{
    import flash.display.*;
    import flash.events.*;

    public class DragDrop extends Sprite
    {
        var origX:Number;
        var origY:Number;
        var target:DisplayObject;

        public function DragDrop()
        {
            addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event):void {
            origX = x;
            origY = y;
            stage.addEventListener(MouseEvent.MOUSE_DOWN, drag);
            buttonMode = true;
        }

        private function drag(evt:MouseEvent):void
        {
            stage.addEventListener(MouseEvent.MOUSE_UP, drop);
            startDrag();
            parent.addChild(this);
        }

        private function drop(evt:MouseEvent):void
        {  
            target = (evt.target as DisplayObject);
            stage.removeEventListener(MouseEvent.MOUSE_UP, drop);
            stopDrag();

            if(target.hitTestObject(target))
            {
                visible = false;
                target.alpha = 1;
                Object(parent).match();
            }

            x = origX;
            y = origY;
        }
    }
}

<强>备注

您不应该调用变量target,因为它是Flash原生变量的名称。例如,将其重命名为targ

答案 1 :(得分:0)

修改

代码存在多个问题。我担心会列出太多,但最重要的是:

您正在声明地图,并尝试在对象存在之前将对象添加到地图中。它在第5帧之前不存在,所以这不起作用。我已经重新编写了下面的代码,但老实说,代码有很多错误,如果不重写它的重要部分就无法修复。

package 
{

import flash.display.*;
import flash.events.*;


public class Map extends MovieClip
{
    var dragdrops:Array;


    public function Map()
    {
        // constructor code
        dragdrops = new Array();

    }
    public function addElement(gamepiece:DragDrop):void {
        dragdrops.push(gamepiece);
    }
    public function addChildElements():void {
        var currentObject:Object;
        for(var i:uint = 0; i < dragdrops.length; i++)
        {
            currentObject = dragdrops[i];
            currentObject.test();
            currentObject.target = (currentObject.name + "_target"); // this should work now, but doesn't. Why? 
            currentObject.target.test();
        }
    }
    public function match():void
    {

    }
}

}

然后,在第一帧,我补充道:

var map:Map = new Map();

然后,在第五帧,我补充道:

map.addElement(tt1);
map.addChildElements();

至少在地图上添加了tt1,但这就是我所得到的。你现在的问题是;

currentObject.target = (currentObject.name + "_target");

现在这是正确的名称,但它不会将其添加到target。这就是我所能做的。