1

私は小さなゲームをプログラムしようとしていますが、いくつかの問題に遭遇しました。いくつかのクラスがあります。それらの1つは壁のクラスです。プレイヤーを叩くときにヘルスバーからハートを削除する必要があります。プレーヤーを叩くのはかなりうまくいきますが、UIクラス内にあるハートを削除することはできません。

Main.as

public class TwinRunner extends MovieClip
{
    private var _timer:Timer;
    private var _userInterface:UI = new UI();

    public function TwinRunner()
    {
        //Timer initialize
        _timer = new Timer(800, 1);
        _timer.addEventListener(TimerEvent.TIMER_COMPLETE, onUpdateTime);
        _timer.start();

        stage.addChild(_userInterface);

        mcButton.addEventListener(MouseEvent.CLICK, onButtonClick);
        addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
    }

ここでは、UIクラスをインスタンスとして追加しています。

Wall.as

        x += _vx;

        //Remove Wall when visible Sword hits
        if(MovieClip(parent).mcSword.isVisible)
        {
            if(this.hitTestObject(MovieClip(parent).mcSword))
            {
                trace("wall destroyed");
                parent.removeChild(this);
            }
        }

        //Remove Wall when Player hit
        else if(this.hitTestObject(MovieClip(parent).mcPlayer))
        {
            trace("player hit");
            parent.removeChild(this);
            MovieClip(parent)._userInterface.heartMeter = false;
        }

        //When the Wall is outside of the screen it gets removed
        if (x + width / 2 < 0)
        {
            parent.removeChild(this);
        }
    }

MovieClip(parent)._ userInterface.heartMeter = false; <-この部分は私にエラーを与えます...

そして最後にUI.as

public class UI extends MovieClip
{
    private var heart1:heartFill = new heartFill();

    public function UI()
    {
        addChild(heart1);
        heart1.x = 200;
        heart1.y = 200;

        addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
    }

    private function onAddedToStage(event:Event):void
    {
        addEventListener(Event.REMOVED_FROM_STAGE, onRemovedFromStage);
        addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }

    private function onRemovedFromStage(event:Event):void
    {
        removeEventListener(Event.ENTER_FRAME, onEnterFrame);
        removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
        removeEventListener(Event.REMOVED_FROM_STAGE, onRemovedFromStage);
    }

    private function onEnterFrame(event:Event):void
    {

    }

    public function set heartMeter(visibility:Boolean):void
    {
        heart1.visible = false;
    }
}

Mainクラスからsetter関数にアクセスできますが、wall.asクラスからはアクセスできません。そうする方法はありますか?私はまだ学んでいるので、これがそんなばかげた質問ではないことを願っています:D

前もって感謝します!

4

1 に答える 1

1

問題は、親から子(壁)を削除していることです。これにより、親変数がnullになります。以下のコードのコメントを参照してください。

parent.removeChild(this);  //this will make parent null
MovieClip(parent)._userInterface.heartMeter = false;  //parent is now null because this has been removed

これらの2つの行を切り替えるだけで、主な問題が解決するはずです。

また、_userInterfaceメインクラスでプライベート変数として宣言されているため、ウォールクラスでアクセスする場合は(実行しようとしているように)、パブリックにする必要があります。そうしないと、別のエラーが発生します。


あなたが考えたいと思うかもしれない何かは、代わりにイベントを使用しています。そうすれば、コードがUIなどの他のクラスを直接参照することはありません。クラスの依存関係を分離すると、テストとトラブルシューティングが容易になります。

だからあなたの壁のクラスではこのようなもの:

else if(this.hitTestObject(MovieClip(parent).mcPlayer))
{
    trace("player hit");
    stage.dispatchEvent(new Event(PLAYER_HIT)); //PLAYER_HIT would be a public static constant in this class:  public static const PLAYER_HIT:String = "PlayerHit";
    parent.removeChild(this); //this needs to be last because after this line, stage and parent will be null
}

次に、UIクラスで:

private function onAddedToStage(event:Event):void
{
    addEventListener(Event.REMOVED_FROM_STAGE, onRemovedFromStage);
    addEventListener(Event.ENTER_FRAME, onEnterFrame);

    stage.addEventListener(Wall.PLAYER_HIT,playerHitHandler);
}

private function playerHitHandler(e:Event):void {
    heartMeter = false;
}
于 2012-09-24T17:20:57.077 に答える