AS3 - 如何使用hitTestObject正确停止玩家并根据碰撞区域限制玩家的移动?

时间:2015-12-31 14:35:09

标签: actionscript-3 hittest

我有两个碰撞问题,当多次按下移动键时,玩家可以在对象中出现故障,并且一旦接触到对象的任何一侧,玩家的xy移动都会停止。它应该只停止xy,具体取决于它所接触的那一面。

当它接触边界框的左/右侧时,它仍然可以上下移动。当它接触边界框的顶部/底部时,它应该能够左右移动。

我在Player类ENTER_FRAME内的移动代码:

private function onEnterFrame(event:Event):void
{
    _vx = 0;
    _vy = 0;

    if (isRight)
    {
        _vx = 5;
    }

    if (isLeft)
    {
        _vx = -5;
    }

    if (isUp)
    {
        _vy = -5;
    }

    if (isDown)
    {
        _vy = 5;
    }

    x += _vx;
    y += _vy;

}

我在CollisionBase类ENTER_FRAME中的hitTestObject代码(MovieClips的基类):

private function onEnterFrame(event:Event):void
{
    if (MovieClip(parent).player.collisionArea.hitTestObject(this))
    {
        if (MovieClip(parent).player.isLeft)
        {
            MovieClip(parent).player.x -= MovieClip(parent).player._vx;
        }

        if (MovieClip(parent).player.isRight)
        {
            MovieClip(parent).player.x -= MovieClip(parent).player._vx;
        }

        if (MovieClip(parent).player.isUp)
        {
            MovieClip(parent).player.y -= MovieClip(parent).player._vy;
        }

        if (MovieClip(parent).player.isDown)
        {
            MovieClip(parent).player.y -= MovieClip(parent).player._vy;
        }
    }
}

FLA档案:https://www.dropbox.com/s/k5dlxrsnvbrmtke/Subject.zip?dl=0

FLA文件包含一个玩家和一张可以碰撞的床。

1 个答案:

答案 0 :(得分:1)

您的游戏设计结构不合理。游戏逻辑应该只有一个ENTER_FRAME。除此之外,您有一个ENTER_FRAME用于玩家,一个ENTER_FRAME用于交换子项,一个ENTER_FRAME用于每个障碍。这种设计让您不止一次头疼,并将您的游戏性能放在场上。

要解决hitTest的问题,请执行以下操作:

将此代码放入CollisionBase Class

private function onEnterFrame(event:Event):void
{

    var player:MovieClip = MovieClip(this.parent).player;

    if (player.collisionArea.hitTestObject(this)) player.collision = true;
}

将此媒体资源添加到Player Class

private var _collision:Boolean = false;

public function set collision(value:Boolean):void{
    _collision = value;
}

然后,在onEnterFrame函数的开头添加这些行:

private function onEnterFrame(event:Event):void
{

    if(_collision){

        x -= _vx;
        y -= _vy;

        _collision = false;

       return;

    }

    _vx = 0;
    _vy = 0;

    if (isRight)
    {
    ....

问题已解决,但现在你的玩家在遇到障碍时会闪烁。发生这种情况是因为玩家ENTER_FRAME移动玩家,然后其他ENTER_FRAME检查碰撞(在CollisionBase.class中)并且在玩家ENTER_FRAME的下一个周期中玩家执行退后。如果您有一个ENTER_FRAME,那么这种事情永远不会发生。

我建议你另外一个选择。看看这个例子,看看它是如何制作的,也许它会给你一些想法;)

Download the example