我在Flash益智游戏中遇到了问题。如果我在时间轴的第一帧创建游戏它正在工作,但如果游戏已经在第5帧中创建(例如)它确实有效!
它发给我这个错误:
TypeError:错误#1009:无法访问null的属性或方法 对象参考。 at Map()TypeError:错误#2007:参数hitTestObject必须为非null。 在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
{
}
}
}
答案 0 :(得分:0)
这是因为未正确调用hitTestObject
方法。必须在Display Object实例中调用此方法,以测试Display Object的另一个实例是否会命中它:
if (myDisplayObject.hitTestObject(anotherDisplayObject))
{
// do stuff
}
关于hitTestObject方法的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原生变量的名称。例如,将其重命名为targ
。
答案 1 :(得分:0)
修改强>
代码存在多个问题。我担心会列出太多,但最重要的是:
您正在声明地图,并尝试在对象存在之前将对象添加到地图中。它在第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
。这就是我所能做的。