Actionscript 3 如何解决Flash游戏中的此错误?

Actionscript 3 如何解决Flash游戏中的此错误?,actionscript-3,flash-cs5,hittest,Actionscript 3,Flash Cs5,Hittest,我在Flash益智游戏中遇到了一个问题。如果我在时间线的第一帧中创建了游戏,它就工作了,但是如果游戏是在第五帧中创建的(例如),它就不工作了 它向我发送了以下错误: TypeError:Error#1009:无法访问null的属性或方法 对象引用。 at Map()类型错误:错误#2007:参数HITTESTABJECT必须为非空。 at flash.display::DisplayObject/_hitTest() 在flash.display::DisplayObject/hitTestOb

我在Flash益智游戏中遇到了一个问题。如果我在时间线的第一帧中创建了游戏,它就工作了,但是如果游戏是在第五帧中创建的(例如),它就不工作了

它向我发送了以下错误:

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

dragdrop类

     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 target!我不知道怎么解决它

Map.as 在包中输入代码 {

导入flash.display.*;
导入flash.events.*;
公共类映射扩展了MovieClip
{
var dragdrops:数组;
公共功能图()
{
//构造代码
阻力=[tt1];
var currentObject:DragDrop;
对于(变量i:uint=0;i

}

这是因为没有正确调用
hitTestObject
方法。必须在显示对象实例中调用此方法,以测试显示对象的另一个实例是否命中它:

if (myDisplayObject.hitTestObject(anotherDisplayObject))
{
    // do stuff
}
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本机变量的名称。例如,将其重命名为target。

编辑:

代码存在多个问题。恐怕太多了,但最大的一个是:

您正在声明一个映射,并试图在对象存在之前将对象添加到该映射中。它在第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");

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

你好,tanx,非常抱歉,我没有取消重启,你介意你更改我自己的代码吗?我取消重启,我该怎么办?我复制你的代码并运行游戏,当我在游戏中拖放我的对象时,所需对象已隐藏发送新错误:TypeError:error#1009:无法访问空对象引用的属性或方法。at Map():(你能看到一个Map.as失败吗?:((tnx我添加这行=this.target=(evt.target作为DisplayObject);但是现在给我发送这个错误:TypeError:error#1009:无法访问空对象引用的属性或方法。在Map()上,当我在游戏中拖放我的对象时,所需的对象被隐藏了!:((请下载我的游戏并检查它:我想我们必须更改地图。啊!我知道你在做什么。你的地图在DragDrop中设定目标。如果这样,这不是你的问题,我建议回到你最初使用的游戏,因为这不是你的问题。我无法打开你的fla,因为我使用CS5。你在crea哪里从这些类中删除对象?您是否设置了文档类,或者是否在fla的第一个框架中声明了这些对象?如果您也发布了这些代码,以及您在fla中的代码位置,将会有所帮助。非常感谢您的帮助♥ 我已将fla保存到cs5,现在您可以检查它,请:(我担心这是行不通的。我不能理解它的头尾。代码有太多错误,需要完全重新编写。我有一点工作,然后还有另一个问题。我将在我的答案中列出其中的一些。如果你一步一步地遵循教程,我强烈建议避免使用contin更进一步,因为它是半实现的。请阅读我的答案。hitTestObject方法总是被错误地调用。
currentObject.target = (currentObject.name + "_target");