1

AS3でプログラミングを始めたばかりですが、まだはっきりしないことがいくつかあります。

私は3つの異なるファイルを持つプロジェクトを持っています:twinrunner.fla、、。twinrunner.aswall.as

壁を画面上で右から左にスクロールさせます。プレイヤーに当たったら認識させたい。私はこれをで達成しようとしましたhitTestObject。しかし、残念ながら、エラーが発生するだけです。

twinrunner.as

public class TwinRunner extends MovieClip
{
    private var _timer:Timer;

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

        addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
    }

    private function onAddedToStage(event:Event):void
    {
        //Add event listeners
        button.addEventListener(MouseEvent.CLICK, onGuessButtonClick);
        addEventListener(Event.ENTER_FRAME, onEnterFrame);
        addEventListener(Event.REMOVED_FROM_STAGE, onRemovedFromStage);
    }

    private function onRemovedFromStage(event:Event):void
    {
        //Remove the onEnterFrame event if
        //this object is removed from the stage
        removeEventListener(Event.ENTER_FRAME, onEnterFrame);
        removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
        removeEventListener(Event.REMOVED_FROM_STAGE, onRemovedFromStage);
    }

    private function onGuessButtonClick(event:Event):void
    {
        addChild(new Wall());
    }

    private function onEnterFrame(event:Event):void
    {
    }

    private function onUpdateTime(event:Event):void
    {
        addChild(new Wall());
        _timer.reset();
        _timer.start();
    }

}

wall.as

public class Wall extends MovieClip
{
    private var _vx:int;

    public function Wall()
    {
        addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
    }

    private function onAddedToStage(event:Event):void
    {
        x = stage.width;
        y = 300;
        _vx = -5;
        stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
        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);
        trace("wall removed");
    }

    private function onKeyDown(event:KeyboardEvent):void
    {
        if (event.keyCode == Keyboard.RIGHT)
        {
        _vx = -20;
        }
    }


    private function onEnterFrame(event:Event):void
    {
        x += _vx;

        if(this.hitTestObject(Player))
        {
            trace("player hit");
        }

        if (x + width / 2 < 0)
        {
            parent.removeChild(this);
        }
    }
}

これをコンパイルしようとするたびに、エラー1046が発生します。

タイプが見つからないか、コンパイルされていません-定数:Player

それはかなりばかげた間違いだと思いますが、私は完全に道に迷っており、どこを検索すればよいかわかりません。

4

2 に答える 2

0

私はこのゲームの概念を完全には理解していないので、私がすでに理解していることに基づいて解決策を提供します。

最初はこれを使わない方がいいと思いますが、実際には壁のインスタンス名です。

if(wall.hitTestObject(Player))
{
   trace("player hit");
 }

また、幅はどこにも見つかりません。つまり、追加する必要があります(おそらく忘れてしまいます)。

var witdh:Number;

また、hitTestObjectは、衝突の正確なメソッドではありません。2つのオブジェクト間の距離を計算し、それらが衝突するかどうかを確認できます。

これはあなたを助けることができます:

http://sierakowski.eu/list-of-tips/39-collision-detection-methods-hittest-and-hittestobject-alternatives.html

http://ughzoid.wordpress.com/2011/06/20/collision-detection-alternatives-to-hittest-and-hittestobject/

于 2012-09-09T22:32:28.420 に答える
0

Playerをどこで定義しましたか?

エラーは、コンパイラがPlayerが何であるかを認識していないことを示しています。それは独自のクラスですか?その場合、このhitTestObjectテストは機能しません。1つのオブジェクトと1つのクラスではなく、2つのオブジェクトを比較する必要があります。

これは、おそらくTwinrunner.asファイルでPlayerクラスのインスタンス(存在する場合)を宣言することで修正できます。

public static var player:Player = new Player();
player.x = whatever;
player.y = whatever;
addChild(player);

次に、hitTestを実行するには:

if(this.hitTestObject(twinrunner.player))
        {
            trace("player hit");
        }

また、実際にPlayerクラスがない場合は、作成する必要があります。

または、Player実際にステージ上にありますか?もしそうなら、あなたは物事を少し変える必要があるでしょう。コメントして、その場合はお知らせください。

于 2012-09-10T02:02:18.830 に答える