我该如何解决 Flash 游戏中的这个错误?
我在 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
{
}
}
>
编辑:
代码存在多个问题。恐怕太多了,无法一一列举,但最大的问题是:
您正在声明一个地图,并试图在对象存在之前将对象添加到其中。它直到第 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
。这是我能做的一切。
这是因为您的
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
。