Actionscript 3 如何解决Flash游戏中的此错误?
我在Flash益智游戏中遇到了一个问题。如果我在时间线的第一帧中创建了游戏,它就工作了,但是如果游戏是在第五帧中创建的(例如),它就不工作了 它向我发送了以下错误: TypeError:Error#1009:无法访问null的属性或方法 对象引用。 at Map()类型错误:错误#2007:参数HITTESTABJECT必须为非空。 at flash.display::DisplayObject/_hitTest() 在flash.display::DisplayObject/hitTestObject()中 在DragDrop/drop()处 dragdrop类Actionscript 3 如何解决Flash游戏中的此错误?,actionscript-3,flash-cs5,hittest,Actionscript 3,Flash Cs5,Hittest,我在Flash益智游戏中遇到了一个问题。如果我在时间线的第一帧中创建了游戏,它就工作了,但是如果游戏是在第五帧中创建的(例如),它就不工作了 它向我发送了以下错误: TypeError:Error#1009:无法访问null的属性或方法 对象引用。 at Map()类型错误:错误#2007:参数HITTESTABJECT必须为非空。 at flash.display::DisplayObject/_hitTest() 在flash.display::DisplayObject/hitTestOb
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
在包中输入代码
{
导入flash.display.*;
导入flash.events.*;
公共类映射扩展了MovieClip
{
var dragdrops:数组;
公共功能图()
{
//构造代码
阻力=[tt1];
var currentObject:DragDrop;
对于(变量i:uint=0;i
}这是因为没有正确调用
hitTestObject
方法。必须在显示对象实例中调用此方法,以测试显示对象的另一个实例是否命中它:
if (myDisplayObject.hitTestObject(anotherDisplayObject))
{
// do stuff
}
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本机变量的名称。例如,将其重命名为target。编辑:
代码存在多个问题。恐怕太多了,但最大的一个是:
您正在声明一个映射,并试图在对象存在之前将对象添加到该映射中。它在第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");
现在它是正确的名称,但不会将其添加到
目标中。这就是我所能做的。你好,tanx,非常抱歉,我没有取消重启,你介意你更改我自己的代码吗?我取消重启,我该怎么办?我复制你的代码并运行游戏,当我在游戏中拖放我的对象时,所需对象已隐藏发送新错误:TypeError:error#1009:无法访问空对象引用的属性或方法。at Map():(你能看到一个Map.as失败吗?:((tnx我添加这行=this.target=(evt.target作为DisplayObject);但是现在给我发送这个错误:TypeError:error#1009:无法访问空对象引用的属性或方法。在Map()上,当我在游戏中拖放我的对象时,所需的对象被隐藏了!:((请下载我的游戏并检查它:我想我们必须更改地图。啊!我知道你在做什么。你的地图在DragDrop中设定目标。如果这样,这不是你的问题,我建议回到你最初使用的游戏,因为这不是你的问题。我无法打开你的fla,因为我使用CS5。你在crea哪里从这些类中删除对象?您是否设置了文档类,或者是否在fla的第一个框架中声明了这些对象?如果您也发布了这些代码,以及您在fla中的代码位置,将会有所帮助。非常感谢您的帮助♥ 我已将fla保存到cs5,现在您可以检查它,请:(我担心这是行不通的。我不能理解它的头尾。代码有太多错误,需要完全重新编写。我有一点工作,然后还有另一个问题。我将在我的答案中列出其中的一些。如果你一步一步地遵循教程,我强烈建议避免使用contin更进一步,因为它是半实现的。请阅读我的答案。hitTestObject方法总是被错误地调用。
currentObject.target = (currentObject.name + "_target");