如何解决 Flash 游戏中的这个错误?
How can I solve this error in Flash game?
我在 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()
拖放类
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
方法没有被正确调用。必须在显示对象实例中调用此方法以测试显示对象的另一个实例是否命中它:
if (myDisplayObject.hitTestObject(anotherDisplayObject))
{
// do stuff
}
Adobe 关于 hitTestObject 方法的帮助。
编辑
所以你应该这样写你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()
{
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
。
编辑:
代码存在多个问题。恐怕无法一一列举,但最大的一个是:
您正在声明一个地图,并试图在您的对象存在之前将您的对象添加到其中。它在第 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();
然后,在第 5 帧,我添加了:
map.addElement(tt1);
map.addChildElements();
这至少将 tt1 添加到地图中,但这是我所能得到的。你现在的问题是;
currentObject.target = (currentObject.name + "_target");
现在是正确的名称,但不会将其添加到 target
。我能做到的就这么多了。
我在 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()
拖放类
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
方法没有被正确调用。必须在显示对象实例中调用此方法以测试显示对象的另一个实例是否命中它:
if (myDisplayObject.hitTestObject(anotherDisplayObject))
{
// do stuff
}
Adobe 关于 hitTestObject 方法的帮助。
编辑
所以你应该这样写你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()
{
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
。
编辑:
代码存在多个问题。恐怕无法一一列举,但最大的一个是:
您正在声明一个地图,并试图在您的对象存在之前将您的对象添加到其中。它在第 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();
然后,在第 5 帧,我添加了:
map.addElement(tt1);
map.addChildElements();
这至少将 tt1 添加到地图中,但这是我所能得到的。你现在的问题是;
currentObject.target = (currentObject.name + "_target");
现在是正确的名称,但不会将其添加到 target
。我能做到的就这么多了。