AS3:无法创建 Movieclip class 实例?
AS3: Can't create Movieclip class instance?
我只是在学习如何使用一些非常基本的代码在 AS3 中使用 classes,我正在绞尽脑汁想弄清楚如何做最简单的事情。
我已经将文档 class 设为 'Test' class(本质上是我的主文档 class),我想用它做的就是添加'WhiteBall' class(动画片段)的一个实例到舞台上。
'WhiteBall' class 应该允许我用键盘控制动画片段。我不知道这部分是否有效,因为我不断收到此错误:
TypeError:错误 #1009:无法访问 属性 或空对象引用的方法。
在 WhiteBall$iinit()[/Users/Owner/Desktop/Animation/Coding/WhiteBall.as:13]
在测试 $iinit()[/Users/Owner/Desktop/Animation/Coding/Test.as:11]
这是 'Test' class 的代码:
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' class 的代码:
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--;
}
}
}
}
'Test'class中的第 11 行错误指的是这一行:
var whiteBall:WhiteBall = new WhiteBall ();
我不知道这里有什么问题。如果您能给我任何帮助,我们将不胜感激。
Organis 所说的是这样的:当您创建一个 DisplayObject,例如您的 WhiteBall 扩展的 class MovieClip 时,该对象的阶段 属性 为空。这意味着当您尝试在其构造函数
上访问白球的 属性 阶段时
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);
}
因此,当您的 Test class 实例将球添加到舞台时,您的 WhiteBall 实例的舞台 属性 将具有一个值,因此可以安全地监听任何键盘事件。
我只是在学习如何使用一些非常基本的代码在 AS3 中使用 classes,我正在绞尽脑汁想弄清楚如何做最简单的事情。
我已经将文档 class 设为 'Test' class(本质上是我的主文档 class),我想用它做的就是添加'WhiteBall' class(动画片段)的一个实例到舞台上。
'WhiteBall' class 应该允许我用键盘控制动画片段。我不知道这部分是否有效,因为我不断收到此错误:
TypeError:错误 #1009:无法访问 属性 或空对象引用的方法。 在 WhiteBall$iinit()[/Users/Owner/Desktop/Animation/Coding/WhiteBall.as:13] 在测试 $iinit()[/Users/Owner/Desktop/Animation/Coding/Test.as:11]
这是 'Test' class 的代码:
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' class 的代码:
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--;
}
}
}
}
'Test'class中的第 11 行错误指的是这一行:
var whiteBall:WhiteBall = new WhiteBall ();
我不知道这里有什么问题。如果您能给我任何帮助,我们将不胜感激。
Organis 所说的是这样的:当您创建一个 DisplayObject,例如您的 WhiteBall 扩展的 class MovieClip 时,该对象的阶段 属性 为空。这意味着当您尝试在其构造函数
上访问白球的 属性 阶段时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);
}
因此,当您的 Test class 实例将球添加到舞台时,您的 WhiteBall 实例的舞台 属性 将具有一个值,因此可以安全地监听任何键盘事件。