1

我刚开始在 AS3 中进行一些编程,但仍有一些我不清楚的地方。

我有 3 个不同文件的项目twinrunner.flatwinrunner.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();
    }

}

墙.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:

找不到类型或不是编译常量:播放器

我想这是一个非常愚蠢的错误,但我完全迷路了,不知道在哪里搜索。

4

2 回答 2

0

我不完全理解这个游戏的概念,所以我会根据我已经理解的内容给你一个解决方案。

起初我认为最好不要使用它,但实际上是墙的实例名称。

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

宽度也无处可寻,这意味着您必须添加(可能您忘记了)。

var wdh:数字;

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 是什么。它是它自己的类吗?如果是这样,这个 hitTestObject 测试将不起作用——您需要比较两个对象,而不是一个对象和一个类。

这可以通过声明 Player 类的实例(如果有的话)来解决,可能在 Twinrunner.as 文件中:

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 回答