Actionscript 3中的hitTestObject错误1046

时间:2012-09-08 18:07:50

标签: flash actionscript

我刚刚开始在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();
    }

}

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:

  

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

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

var witdh:Number;

同样hitTestObject也不是那么精确的碰撞方法。您可以计算两个物体之间的距离,并检查它们是否发生碰撞。

这可以帮到你:

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/

答案 1 :(得分: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实际上是在舞台上吗?如果是这样,你需要稍微改变一下。评论并告诉我是否是这种情况。