AS3 - 如何使用hitTestObject触摸对象时停止播放器?

时间:2016-01-02 03:15:28

标签: actionscript-3 keyboard-events hittest enterframeevent

我想知道在触摸物体时如何阻止玩家。我在这里设置了动作,但是在触摸物体时我无法找到让玩家正常停止的方法。

播放器Class中我的播放器移动代码:

这是按下按键时的事件侦听器。按下时Boolean值变为true。

public function onKeyDown(event:KeyboardEvent):void
{
    if (event.keyCode == Keyboard.D)
    {
        isRight = true;
    }
    if (event.keyCode == Keyboard.A)
    {
        isLeft = true;
    }
    if (event.keyCode == Keyboard.W)
    {
        isUp = true;
    }
    if (event.keyCode == Keyboard.S)
    {
        isDown = true;
    }
}

这是未按下键时的事件侦听器。未按下时Boolean值变为false。

private function onKeyUp(event:KeyboardEvent):void
{
    if (event.keyCode == Keyboard.D)
    {
        isRight = false;
    }

    if (event.keyCode == Keyboard.A)
    {
        isLeft = false;
    }

    if (event.keyCode == Keyboard.W)
    {
        isUp = false;
    }

    if (event.keyCode == Keyboard.S)
    {
        isDown = false;;
    }

}

这是输入框架,vxvyint变量,未按下按键时为0,但按下按键时它们会改变值。 vxvy每帧都会添加到玩家的xy,但当它们为0时,玩家将无法移动。

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;

}

3 个答案:

答案 0 :(得分:1)

添加另一个条件&在检查 onEnterFrame 中的键状态的条件后,将增量器_vx或_vy(或两者)设置为0。

if(player.hitTestObject(object)){
        _vx = 0;
        _vy = 0;
}

答案 1 :(得分:1)

您不需要有很多条件,请看一下这个例子:

_keys = new Object();

_keys[Keyboard.D] = false;
_keys[Keyboard.A] = false;
_keys[Keyboard.W] = false;
_keys[Keyboard.S] = false;  

this.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyInteraction);
this.stage.addEventListener(KeyboardEvent.KEY_UP, keyInteraction);

//---Key events
function keyInteraction(evt:KeyboardEvent){

    if( _keys.hasOwnProperty(evt.keyCode) ){

        _keys[evt.keyCode] = Boolean( evt.type == KeyboardEvent.KEY_DOWN );

    }

}

当您按下或释放 A W D S 键时,相应的_keys {{ 1}}属性从Object更改为true

现在,false部分。也许hitTest方法比hitTestPoint方法更好,因为最后一个方法只检查两个对象的边界是否接触。虽然hitestObject方法会检查hitTestPoint是否触及point的任何像素。

当你每五个像素移动一个玩家时,有必要将玩家恢复到正确的位置,在这个位置它没有碰到物体(为此我已经做了Object个循环)。取决于您的游戏设计,您需要更改代码,但这将指导您实现目的:

  

whilemaze无法触及的对象:

玩家的getPoint方法

player

HitTest Code(Game Tick)

public function getPoint(corner:uint){

    var point:Point = this.parent.localToGlobal( new Point( this.x, this.y ) );

    if(corner == 1 || corner == 2) point.x += _w;
    if(corner == 2 || corner == 3) point.y += _h;

    return point;

}

Download the example

答案 2 :(得分:0)

if(player.hitTestObject(object)){
     // stop player
    player.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
}

或者你可以做相反的事情。 把它放在播放器的输入框内。