プロが教える店舗&オフィスのセキュリティ対策術

以下のようなコードで、ブロック崩し的なものを作ろうとしています。
.flaファイルのステージ上には、プレイヤーが操る左右に動く棒状の自機があります。
ボールはステージにあらかじめ配置せずに、コードの中でnew演算子で呼び出して、最初は自機の子要素として自機にくっついており、スペースキーを押すとボールがステージの子要素に変わり、発射されるようにしたいのですが、以下のコードだとエラーになります。

~略~
public class Main extends MovieClip
{
var vx:int;

public function Main():void
{
init();
}

function init():void
{
vx = 0;

var ball:Ball = new Ball(); ←ここについての質問です
player.addChild(ball);
ball.x = 0;
ball.y = 0;

stage.addEventListener('keyDown',onKeyDown);
stage.addEventListener('keyUp',onKeyUp);
stage.addEventListener('enterFrame',onEnterFrame);
}

function onKeyDown(e:KeyboardEvent):void
{
if (e.keyCode == Keyboard.LEFT)
{
vx = -5;
}
else if (e.keyCode == Keyboard.RIGHT)
{
vx = 5;
}
else if (e.keyCode == Keyboard.SPACE)
{
stage.addChild(ball); ←この行でエラーが出ます。
ball.x = player.x;
ball.y = player.y;

}
}

~以下略~

この場合、「1120: 未定義のプロパティ ball へのアクセスです。」と、エラーが出てしまいます。
ですが、ボールをステージにあらかじめ配置しておくと、うまくいきます。

子要素を変えなくても作れるとは思うんですが、
あえてそうするなら、new演算子で動的に配置したインスタンスの場合、
どのようなコードを書いたらよいでしょうか?

ご教授お願いします。

A 回答 (1件)

そのBallというクラスの定義は、



class Ball extends MovieClip

という継承宣言は入っていますか?
stageにaddChild()できるのは、MovieClipやSpriteクラスを継承したクラスのインスタンスだけですよ。
    • good
    • 0
この回答へのお礼

ありがとうございました。

どうやらエラーの原因の目の付け所が間違っていたようです。

インスタンスの変数宣言をinitメソッド内で定義していたので、
インスタンスの入れ物用のball変数がローカルスコープになっていたようです。
メソッドの外で定義し直したらいけました><

また機会がありましたらアドバイスお願いします。

お礼日時:2014/02/01 23:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!