在我的Flash程序中,我试图在对象中运行一个函数。该对象使用一个名为“SkullDemon.as”的类。我试图运行的函数叫做“moveSkullDemon();”此函数在“SkullDemon.as”类中编码。
我的主要文件类是“TME2d_Main.as”。在该文件中,我创建了一个Skull Demon类的实例,如下所示:
public var skullD1b:SkullDemon;
skullD1b = new SkullDemon();
skullD1b.x = 2990.75;
skullD1b.y = 836.95;
skullDemonContainer.addChild(skullD1b);
存储SkullDemon实例的'skullDemonContainer'被放入另一个名为'envContainer'的容器中,该容器使用以下代码行添加到屏幕中:
this.addChild(envContainer);
创建SkullDemon实例并将其加载到屏幕上就好了。当我尝试在SkullDemon类中运行任何函数时会出现问题。
如前所述,我尝试为'skullD1b'实例调用'SkullDemon.moveSkullDemon()'函数。现在,'moveSkullDemon()'函数只是将SkullDemon对象移到左边。
我尝试从SkullDemon的构造函数中调用此函数,但这不起作用。实际上,在创建Skull Demon对象时,不会执行在SkullDemon的构造函数中编写的任何代码。我试图在SkullDemon类中创建一个调用'moveSkullDemon()的EventListener,但是什么也没做。
我尝试了以下方法来运行'moveSkullDemon()'函数:
1:从'TME2d_Main'调用'moveSkullDemon()',如下所示:
skullD1b.moveSkullDemon();
但这会引发错误(#1006),说'moveSkullDemon'不是函数。
2:做与#1相同的事情,除了函数调用中没有括号:
skullD1b.moveSkullDemon;
3:在'TME2d_Main'中为'skullD1b'实例创建一个EventListener,调用其'moveSkullDemon'函数:
skullD1b.addEventListener(Event.ADDED, skullD1b.moveSkullDemon);
这会带来另一个错误:“错误#2007:参数侦听器必须为非null。”它还经常发现“null”引用错误:
"1009: Cannot access a property or method of a null object reference.
at classes::TME2d_Main/controlPlayer()"
我不知道为什么这个问题引用'controlPlayer()'方法,因为它根本不涉及Skull Demon实例。 'controlPlayer()'通过EventListener调用,代码在'TME2d_Main'中:
player.addEventListener(Event.ENTER_FRAME, controlPlayer);
4:为调用move函数的'SkullDemonContainer'创建一个EventListener:
skullDemonContainer.addEventListener(Event.ADDED, skullD1b.moveSkullDemon);
这会带来与#3相同的错误。
我几天来一直遇到这个问题而且不知道是什么导致了这个问题。这是'moveSkullDemon()'函数中的代码:
public function moveSkullDemon() {
trace("skull demon moving!");
this.x -= 5;
// If the Player has not hit the 'floor,' increase his falling
//speed
if (! floor.hitTestPoint(this.x, this.y, true)) {
this.y += this.sdGravity;
// The Skull Demon is not on the ground when he's not touching it
sdOnGround = false;
}
// Increase the 'sdYVel' variable so that the Skull Demon will fall
// progressively faster down the screen. This code technically
// runs "all the time" but in reality it only affects the Skull Demon
// when he's off the ground.
sdYVel += sdGravity;
// Increase the Skull Demon's 'y' coordinate by the 'sdYVel' value
if (! sdOnGround) {
this.y += sdYVel;
}
}
感谢您提供的任何帮助。
答案 0 :(得分:0)
如果我理解正确,你是试图针对你的显示对象发送一个事件,因此调用一个函数?
当您实例化头骨恶魔对象时,为您想要处理的事件类型添加一个事件侦听器。例如,如果您创建了“DemonEvent”类:
// instantiate and add event listener:
skullD1b = new SkullDemon();
skullD1b.addEventListener(DemonEvent.MOVE, moveDemonHandler);
如果要调用“moveDemonHandler”函数,则会针对该对象调度事件:
// do call this event listener, dispatch an event
// against the object
skullD1b.dispatchEvent(new DemonEvent(DemonEvent.MOVE));
您可以将代码放在事件处理程序中,或者从事件处理程序代码中调用您的函数:
protected function moveDemonHandler(event:DemonEvent):void
{
moveSkullDemon();
}
protected function moveSkullDemon():void
{
// ... your code here.
}
示例“DemonEvent”如果您需要:
package
{
import flash.events.Event;
public class DemonEvent extends Event
{
public static const MOVE:String = "MOVE";
public function DemonEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}
}
}
<强>更新强>
根据您的评论,听起来您正在确定放置代码以移动对象的最佳位置。你的头骨恶魔可以移动自己,或者因为你的TME2d_Main类添加了头骨恶魔,最初定位它,并且因为你需要在地板上进行测试,所以将这个逻辑放在TME2d_Main类中会更有意义。
此示例不使用事件;但是,希望能帮助您入门。如果你想要一个使用事件的例子,请告诉我。
这里有两个类作为示例实现:
TME2d_Main.as
package
{
import flash.display.Sprite;
import flash.events.Event;
public class TME2d_Main extends Sprite
{
/** skull demon instance */
public var skullD1b:SkullDemon;
/** floor */
public var floor:Sprite;
/** constructor */
public function TME2d_Main()
{
super();
// best if implemented on addedToStage
skullD1b = new SkullDemon();
skullD1b.x = stage.stageWidth * 0.5;
skullD1b.y = 1;
addChild(skullD1b);
// listen for enter frame
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
/** every frame, move skull demon */
protected function enterFrameHandler(event:Event):void
{
// call local function of this class
moveSkullDemon();
}
protected function moveSkullDemon():void
{
// since this TME2d_Main class defined and positioned
// skullD1b, it probably makes sense for this class
// to continue positioning it, especially if you need to
// hit test again a floor, which is probably also defined
// in this class?
if (skullD1b.hitTestObject(floor))
{
// skull is on floor
skullD1b.sdOnGround = true;
// end animation
removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
else
{
// otherwise, skull is in air and falling
skullD1b.y *= skullD1b.sdYVel;
}
}
// if you wanted to have skull demon
// move itself, you would call:
//
// skullD1b.moveSkullDemon()
//
// ...but make sure that function exists
// in SkullDemon class.
}
}
SkullDemon.as
package
{
import flash.display.Sprite;
public class SkullDemon extends Sprite
{
/** acceleration factor */
public var sdYVel:Number = 1.05;
/** whether skull demon is on ground */
public var sdOnGround:Boolean = false;
/** constructor */
public function SkullDemon()
{
super();
}
// if you want SkullDemon to move itself,
// make sure you define a moveSkullDemon function:
//
// public function moveSkullDemon():void
// {
// }
}
}
答案 1 :(得分:0)
在您的TME2d_Main.as文件中,您声明您的代码是这样的。
public var skullD1b:SkullDemon;
skullD1b = new SkullDemon();
skullD1b.x = 2990.75;
skullD1b.y = 836.95;
skullDemonContainer.addChild(skullD1b);
最后4行需要放在一个函数中。您无法在函数外部的类中实例化或赋值。
那么你可以像这样实例化,但所有其他代码都需要功能化(甚至是一个单词)。
public var skullD1b:SkullDemon = new SkullDemon();
// TME2d_Main is the constructor and should be called automatically
public function TME2d_Main( ):void{
skullD1b.x = 2990.75;
skullD1b.y = 836.95;
skullDemonContainer.addChild(skullD1b);
}
你最好的办法就是这样做。
public var skullD1b:SkullDemon;
// TME2d_Main is the constructor and should be called automatically
public function TME2d_Main( ):void{
skullD1b = new SkullDemon();
skullD1b.x = 2990.75;
skullD1b.y = 836.95;
skullDemonContainer.addChild(skullD1b);
}
如果这不能解决问题,请发布完整的TME2d_Main.as文件。