开发者问题收集

我该如何解决 Flash 游戏中的这个错误?

2015-01-02
174

我在 Flash 益智游戏中遇到了问题。如果我在时间轴的第一帧中创建游戏,游戏就可以正常运行,但如果游戏是在(例如)第 5 帧中创建的,则无法正常运行!

它向我发送了此错误:

TypeError: Error #1009: Cannot access a property or method of a null object reference. at Map() TypeError: Error #2007: Parameter hitTestObject must be non-null. at flash.display::DisplayObject/_hitTest() at flash.display::DisplayObject/hitTestObject() at DragDrop/drop()

dragdrop class

     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 在此处输入代码包 {

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个回答

编辑:

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

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

Martyn Shutt
2015-01-02

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

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

helloflash
2015-01-02