0

オブジェクトに触れたときにプレイヤーを止める方法を知りたいです。ここで動きを設定しましたが、オブジェクトに触れたときにプレーヤーを適切に停止させる方法が見つかりませんでした。

プレーヤーでのプレーヤーの移動コードClass:

これは、キーが押されたときのイベント リスナーです。Boolean押すと値が真になります。

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;;
    }

}

これはエンターフレームで、vx変数でvyありint、キーが押されていないときは 0 ですが、キーが押されると値が変わります。vxandはプレーヤーのandごとのフレームvyにも追加されますが、それらが 0 の場合、プレーヤーは動きません。xy

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;

}
4

3 に答える 3

1

別の条件を追加し、条件がonEnterFrameのキー状態をチェックした後、インクリメンター _vx または _vy (または両方) を 0 に設定します。

if(player.hitTestObject(object)){
        _vx = 0;
        _vy = 0;
}
于 2016-01-02T06:53:55.490 に答える
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 );

    }

}

AWDまたはキーを押すか放すとS、それぞれの _keysObjectプロパティが からtrueに変わりますfalse

さて、そのhitTest部分。この最後のメソッドは、両方のオブジェクトの境界が接触しているかどうかのみをチェックするため、hitTestPointメソッドよりもメソッドの方が優れている可能性があります。メソッドは、が のいずれかのピクセルに接触してhitestObjectいるhitTestPointかどうかをチェックします。pointObject

プレーヤーを 5 ピクセルごとに移動すると、オブジェクトに触れない正しい位置にプレーヤーを復元する必要があります (whileこの目的のためにサイクルを作成しました)。ゲームのデザインによっては、コードを変更する必要がありますが、これはあなたの目的をガイドします:

は触れられないmazeオブジェクトです。player

プレーヤーの getPoint メソッド

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;

}

HitTest コード (ゲームティック)

//---Move the player
private function gameTick(evt:Event):void{

    var hit:Boolean = false;

    //---Sum the vars horizontal
    if( _keys[Keyboard.D] ) _player.x += 5;
    if( _keys[Keyboard.A] ) _player.x -= 5;

    //---Check if the point is inside the scene in the horizontal
    if(_player.x < 0) _player.x = 0;
    if(_player.x > this.stage.stageWidth - _player.width) _player.x = this.stage.stageWidth - _player.width;            

    var TL:Point = _player.getPoint(0);
    var TR:Point = _player.getPoint(1);
    var BR:Point = _player.getPoint(2);
    var BL:Point = _player.getPoint(3);

    //---Hittest in the horizontal
    if(
        _maze.hitTestPoint(TL.x, TL.y, true)
        ||
        _maze.hitTestPoint(TR.x, TR.y, true)
        ||
        _maze.hitTestPoint(BR.x, BR.y, true)
        ||
        _maze.hitTestPoint(BL.x, BL.y, true)
    ){

        var sumX:int = 0;

        if( _keys[Keyboard.D] ) sumX = -1;
        if( _keys[Keyboard.A] ) sumX = 1;

        hit = true;

        while(hit){

            TL.x += sumX;
            TR.x += sumX;
            BR.x += sumX;
            BL.x += sumX;

            if(
                !_maze.hitTestPoint(TL.x, TL.y, true)
                &&
                !_maze.hitTestPoint(TR.x, TR.y, true)
                &&
                !_maze.hitTestPoint(BR.x, BR.y, true)
                &&
                !_maze.hitTestPoint(BL.x, BL.y, true)
            ){

                hit = false;

                _player.x = TL.x;

            }

        }

    }

    //---Sum the vars vertical
    if( _keys[Keyboard.S] ) _player.y += 5;
    if( _keys[Keyboard.W] ) _player.y -= 5;

    //---Check if the point is inside the scene in the vertical
    if(_player.y < 0) _player.y = 0;
    if(_player.y > this.stage.stageHeight - _player.height) _player.y = this.stage.stageHeight - _player.height;            

    TL = _player.getPoint(0);
    TR = _player.getPoint(1);
    BR = _player.getPoint(2);
    BL = _player.getPoint(3);

    if(
        _maze.hitTestPoint(TL.x, TL.y, true)
        ||
        _maze.hitTestPoint(TR.x, TR.y, true)
        ||
        _maze.hitTestPoint(BR.x, BR.y, true)
        ||
        _maze.hitTestPoint(BL.x, BL.y, true)
    ){

        var sumY:int = 0;

        if( _keys[Keyboard.S] ) sumY = -1;
        if( _keys[Keyboard.W] ) sumY = 1;

        hit = true;

        while(hit){

            TL.y += sumY;
            TR.y += sumY;
            BR.y += sumY;
            BL.y += sumY;

            if(
                !_maze.hitTestPoint(TL.x, TL.y, true)
                &&
                !_maze.hitTestPoint(TR.x, TR.y, true)
                &&
                !_maze.hitTestPoint(BR.x, BR.y, true)
                &&
                !_maze.hitTestPoint(BL.x, BL.y, true)
            ){

                hit = false;

                _player.y = TL.y;

            }

        }

    }

}

サンプルをダウンロード

于 2016-01-02T18:31:33.060 に答える