Class AS3:Can';不创建Movieclip类实例?
我只是在学习如何使用一些非常基本的代码在AS3中使用类,我正在绞尽脑汁试图找出如何做最简单的事情 我已经将document类设置为“Test”类(基本上是我的主类),我所要做的就是在stage中添加一个“WhiteBall”类的实例(movieclip) “白球”课程应该允许我用键盘控制电影剪辑。我不知道这部分是否有效,因为我一直遇到以下错误: TypeError:错误#1009:无法访问空对象引用的属性或方法。 在WhiteBall$iinit()[/Users/Owner/Desktop/Animation/Coding/WhiteBall.as:13] 测试$iinit()[/Users/Owner/Desktop/Animation/Coding/Test.as:11] 以下是“测试”类的代码:Class AS3:Can';不创建Movieclip类实例?,class,actionscript-3,flash,null,addchild,Class,Actionscript 3,Flash,Null,Addchild,我只是在学习如何使用一些非常基本的代码在AS3中使用类,我正在绞尽脑汁试图找出如何做最简单的事情 我已经将document类设置为“Test”类(基本上是我的主类),我所要做的就是在stage中添加一个“WhiteBall”类的实例(movieclip) “白球”课程应该允许我用键盘控制电影剪辑。我不知道这部分是否有效,因为我一直遇到以下错误: TypeError:错误#1009:无法访问空对象引用的属性或方法。 在WhiteBall$iinit()[/Users/Owner/Desktop/A
package {
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class Test extends MovieClip
{
var whiteBall:WhiteBall = new WhiteBall ();
public function Test() {
addEventListener(Event.ENTER_FRAME, whiteBallSpawn);
}
public function whiteBallSpawn(evt:Event) {
stage.addChild(whiteBall);
whiteBall.x = 200;
whiteBall.y = 250;
}
}
}
以下是“WhiteBall”类的代码:
package {
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class WhiteBall extends MovieClip
{
public function WhiteBall() {
stage.addEventListener(KeyboardEvent.KEY_DOWN, keysdown);
}
public function keysdown(mykey:KeyboardEvent) {
if(mykey.keyCode==Keyboard.UP) {
this.y--;
}
if(mykey.keyCode==Keyboard.DOWN) {
this.y++;
}
if(mykey.keyCode==Keyboard.RIGHT) {
this.x++;
}
if(mykey.keyCode==Keyboard.LEFT) {
this.x--;
}
}
}
}
“测试”类中的第11行错误指的是这一行:
var whiteBall:WhiteBall = new WhiteBall ();
我不知道这里有什么问题。如果您能给我任何帮助,我将不胜感激。Organi所说的是:当您创建一个DisplayObject时,例如一个MovieClip,它是您的WhiteBall扩展的类,那么该对象的stage属性为空。这意味着,当您试图在其构造函数上访问whiteball的stage属性时
public function WhiteBall()
{
stage.addEventListener(KeyboardEvent.KEY_DOWN, keysdown);
}
由于阶段为空,引发了错误。因此,要解决这个问题,最安全、最常见的方法是等到球被加入舞台,然后收听任何舞台键盘事件。像这样:
public function WhiteBall()
{
if(stage != null)
{
stage.addEventListener(KeyboardEvent.KEY_DOWN, keysdown);
}
else
{
this.addEventListener(Event.ADDED_TO_STAGE, addedToStage);
}
}
private function addedToStage(e:Event):void
{
this.removeEventListener(Event.ADDED_TO_STAGE, addedToStage);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keysdown);
}
因此,当您的测试类实例将球添加到stage时,您的WhiteBall实例的stage属性将有一个值,因此可以安全地侦听任何键盘事件。Easy。您尝试访问白球构造函数中的stage。但是,此实例不属于显示列表,因此其阶段字段为空。你需要第一个addChild(whiteBall);在主类中,然后才尝试从球本身访问stage(这意味着您应该编写某种initBall()方法,并在将实例添加到显示列表后调用它)。下次我坐下来编写代码时,我会尝试一下,看看是否能让它正常工作。非常感谢您的帮助和清晰的解释!尝试使用
newwhiteball()代码>而不是当前的新白球()谢谢你们的建议,伙计们。到VC.One-更改“新的白球();”到“新白球”(;)正如你所说的,我似乎没有解决这个问题。错误消息保持不变,并引用相同的行。对Organia来说——我已经尝试过按照你描述的方式来实现这个方法,但是因为我是一个彻头彻尾的笨蛋,我不知道该怎么做。你能用一些代码具体地告诉我你将如何实现它吗(例如initBall()方法的条件是什么)?如果你有时间的话。非常感谢你,这是一个非常有用和清晰的解释!下次我编写代码时,我会尝试一下,并让您知道结果如何!很高兴能帮上忙!!