Actionscript 3 为什么flash输出TypeError:Error#2007:参数子项必须为非null。在flash.display::DisplayObjectContainer/addChild()处
这是我到目前为止的代码Actionscript 3 为什么flash输出TypeError:Error#2007:参数子项必须为非null。在flash.display::DisplayObjectContainer/addChild()处,actionscript-3,flash,Actionscript 3,Flash,这是我到目前为止的代码 package { import flash.display.MovieClip; import flash.events.*; public class Main extends MovieClip { var leftpressed:Boolean = false; var rightpressed:Boolean = false; public function Main()
package {
import flash.display.MovieClip;
import flash.events.*;
public class Main extends MovieClip {
var leftpressed:Boolean = false;
var rightpressed:Boolean = false;
public function Main()
{
//constructor code
Spaceship.addEventListener(Event.ENTER_FRAME, moveToKey);
stage.addEventListener(KeyboardEvent.KEY_DOWN, setKeyPress);
stage.addEventListener(KeyboardEvent.KEY_UP, setKeyUnpress);
stage.addEventListener(KeyboardEvent.KEY_DOWN, FlyBullet);
}
function moveToKey (event:Event)
{
if (leftpressed && (Spaceship.x>0))
{
Spaceship.x = -5;
}
if (rightpressed && (Spaceship.x<550))
{
Spaceship.x = +5;
}
}
function setKeyPress(e:KeyboardEvent):void
{
if (e.keyCode == 37)
{
leftpressed = true;
}
if (e.keyCode == 39)
{
rightpressed = true;
}
}
function setKeyUnpress(e:KeyboardEvent): void
{
if (e.keyCode == 37)
{
leftpressed = false;
}
if (e.keyCode == 39)
{
rightpressed = false;
}
}
function FlyBullet (e:KeyboardEvent):void
{
if (e.keyCode == 32)
var bulletshot:Bullet = new Bullet();
addChild(bulletshot);
bulletshot.x = Spaceship.x;
bulletshot.y = Spaceship.y
}
}
}
这就是你的问题:
if (e.keyCode == 32)
var bulletshot:Bullet = new Bullet();
addChild(bulletshot);
bulletshot.x = Spaceship.x;
bulletshot.y = Spaceship.y
没有花括号,因此if
条件仅适用于分配了bulletshot
的第一行。换言之,如果您按下SPACE
以外的任何键,它将跳过bulletshot
的赋值,但仍然尝试addChild(bulletshot)
,但由于bulletshot
未被赋值,因此它是null
,您会得到错误
我想你的意思是:
if (e.keyCode == Keyboard.SPACE) {
var bulletshot:Bullet = new Bullet();
addChild(bulletshot);
bulletshot.x = Spaceship.x;
bulletshot.y = Spaceship.y
}
PS:您的代码在很多地方缩进很差。使代码正确缩进会有帮助。自动格式化程序可以在这里帮助您。这是您的问题:
if (e.keyCode == 32)
var bulletshot:Bullet = new Bullet();
addChild(bulletshot);
bulletshot.x = Spaceship.x;
bulletshot.y = Spaceship.y
没有花括号,因此if
条件仅适用于分配了bulletshot
的第一行。换言之,如果您按下SPACE
以外的任何键,它将跳过bulletshot
的赋值,但仍然尝试addChild(bulletshot)
,但由于bulletshot
未被赋值,因此它是null
,您会得到错误
我想你的意思是:
if (e.keyCode == Keyboard.SPACE) {
var bulletshot:Bullet = new Bullet();
addChild(bulletshot);
bulletshot.x = Spaceship.x;
bulletshot.y = Spaceship.y
}
PS:您的代码在很多地方缩进很差。使代码正确缩进会有帮助。自动格式化程序在这方面可以帮助您。在多行if语句中省略括号通常被认为是不好的做法,这就是一个例子。每当
e.keyCode!=32
将尝试运行addChild
行
解决办法是:
///...in the Main function//
stage.addEventListener(KeyboardEvent.KEY_DOWN, flyBullet);
///...
function flyBullet (e:KeyboardEvent):void
{
if (e.keyCode == 32)
{
var bulletshot:Bullet = new Bullet();
addChild(bulletshot);
bulletshot.x = Spaceship.x;
bulletshot.y = Spaceship.y;
}
}
一些不相关的as3代码质量提示,以避免以后可能出现的错误: 我猜Spaceship不是一个静态类,所以我建议变量/函数名使用小写字母,类使用大写字母,但这只是一个很好的实践,不会影响代码的正确性 定义函数的可访问性也是一种很好的做法,即
公共、私有、内部、受保护的
。如果省略它,则默认值为内部
必要时只跳过条件句后的方括号。在多行if语句中省略方括号通常被认为是不好的做法,这就是一个例子。每当
e.keyCode!=32
将尝试运行addChild
行
解决办法是:
///...in the Main function//
stage.addEventListener(KeyboardEvent.KEY_DOWN, flyBullet);
///...
function flyBullet (e:KeyboardEvent):void
{
if (e.keyCode == 32)
{
var bulletshot:Bullet = new Bullet();
addChild(bulletshot);
bulletshot.x = Spaceship.x;
bulletshot.y = Spaceship.y;
}
}
一些不相关的as3代码质量提示,以避免以后可能出现的错误: 我猜Spaceship不是一个静态类,所以我建议变量/函数名使用小写字母,类使用大写字母,但这只是一个很好的实践,不会影响代码的正确性 定义函数的可访问性也是一种很好的做法,即
公共、私有、内部、受保护的
。如果省略它,则默认值为内部
必要时只跳过条件后面的括号。请指定您试图完成的内容(期望输出)。请指定您试图完成的内容(期望输出)。^与我的答案相同(在此之前发布)。此外,“在多行
if
语句中省略括号并不被认为是不好的做法”,没有括号的多行if语句是不可能的。我也很好奇在条件“必要”之后跳过括号。这不是必须的,这是可选的,主要取决于个人意见。^答案与我的相同(在此之前发布)。此外,“在多行if
语句中省略括号并不被认为是不好的做法”,没有括号的多行if语句是不可能的。我也很好奇在条件“必要”之后跳过括号。这从来都不是必要的,这是可选的,很大程度上取决于个人意见。