【问题标题】:How can I solve this error in Flash game?如何解决 Flash 游戏中的此错误?
【发布时间】:2015-01-02 13:32:24
【问题描述】:

我在 Flash 益智游戏中遇到问题。如果我在时间线的第一帧创建游戏,它可以工作,但如果游戏是在(例如)第 5 帧创建的,它就不起作用!

它向我发送此错误:

TypeError:错误 #1009:无法访问 null 的属性或方法 对象引用。 在 Map() 类型错误:错误 #2007:参数 hitTestObject 必须为非空。 在 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
    {

    }
}

}

【问题讨论】:

  • 阅读我的回答。你的 hitTestObject 方法总是被错误地调用。

标签: actionscript-3 flash-cs5 hittest


【解决方案1】:

编辑:

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

您正在声明一个地图,并尝试在您的对象存在之前将您的对象添加到其中。它直到第 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。我能做的就这么多了。

【讨论】:

  • tnx 我添加这一行 = this.target = (evt.target as DisplayObject);但现在向我发送此错误:TypeError:错误 #1009:无法访问空对象引用的属性或方法。在 Map() 并且当我在游戏中拖放我的对象时,所需的对象被隐藏了! :((请下载我的游戏并检查它:mediafire.com/?u0y39kll1yo5tib
  • 我认为我们必须更改 map.as !؟
  • 啊。我知道你在做什么。您的地图正在 DragDrop 中设置目标。在这种情况下,这不是你的问题,我建议回到你最初使用的东西,因为这不是你的问题。我用 CS5 打不开你的 fla。您在哪里从这些类创建对象?您是否设置了文档类,或者您是否在 fla 的第一帧中声明了这些对象?如果您也发布了该代码,并且您的 fla 中有该代码,那将会有所帮助。
  • 非常感谢您的帮助♥我将fla保存到cs5,现在您可以查看它了:(mediafire.com/?b0ql0ncd4nl6bim
  • 恐怕行不通。我不能把它当回事。代码有很多问题,需要完全重写。我得到一点工作,然后还有另一个问题。我将在我的回答中列出其中一些。如果您已逐步按照教程进行操作,我强烈建议您避免进一步继续,因为它已经实现了一半。
【解决方案2】:

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

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

关于 hitTestObject 方法的 Adob​​e 帮助。

编辑

所以你应该这样写你的类:

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

【讨论】:

  • hi tanx 非常好,我很抱歉,但我不太明白,你介意你改变我自己的代码,我不明白我应该做什么吗?
  • 太感谢你了,我复制你的代码并运行游戏,当我在游戏中拖放我的对象时,所需的对象被隐藏发送新错误:TypeError:错误#1009:无法访问空对象引用的属性或方法。在 Map() :( 你能看到 Map.as 失败吗? :((
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
  • 2012-02-14
  • 2015-04-12
相关资源
最近更新 更多