Actionscript 3 AS3字符仅在一个方向的墙上停止

Actionscript 3 AS3字符仅在一个方向的墙上停止,actionscript-3,actionscript,game-physics,Actionscript 3,Actionscript,Game Physics,当我的角色发现一堵墙时,我几乎用尽了一切办法让它停下来。 它只适用于向上和向右或向下和向左,但不适用于所有4个方向,因此只有一个y移动和一个x移动。 所以我决定做4个函数,每个方向一个。 但它只有在按下左键并碰到墙时才起作用 我的问题是;我必须做什么才能使碰撞检测停止角色在所有4个方向上移动? 提前谢谢 var leftArrow:Boolean; var upArrow:Boolean; var rightArrow:Boolean; var downArrow:Boolean; var sp

当我的角色发现一堵墙时,我几乎用尽了一切办法让它停下来。 它只适用于向上和向右或向下和向左,但不适用于所有4个方向,因此只有一个y移动和一个x移动。 所以我决定做4个函数,每个方向一个。 但它只有在按下左键并碰到墙时才起作用

我的问题是;我必须做什么才能使碰撞检测停止角色在所有4个方向上移动? 提前谢谢

var leftArrow:Boolean;
var upArrow:Boolean;
var rightArrow:Boolean;
var downArrow:Boolean;
var speed:int = 10;
var hitting:Boolean;
var ismoving:Boolean;
var wallsRect:Rectangle = bounds.getBounds(this);
var charRect:Rectangle = char.getBounds(this);

var boundsBmpData = new BitmapData(wallsRect.width, wallsRect.height, true, 0);
var charBmpData = new BitmapData(charRect.width, charRect.height, true, 0);

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
stage.addEventListener(Event.ENTER_FRAME, detectHit2);
stage.addEventListener(Event.ENTER_FRAME, walkingLEFT);
stage.addEventListener(Event.ENTER_FRAME, walkingUP);
stage.addEventListener(Event.ENTER_FRAME, walkingDOWN);
stage.addEventListener(Event.ENTER_FRAME, walkingRIGHT);

boundsBmpData.draw(bounds);
charBmpData.draw(char);

function keyPressed(event:KeyboardEvent):void 
    {
        if (event.keyCode == Keyboard.LEFT) 
            {
                leftArrow = true;

            }
        if (event.keyCode == Keyboard.UP) 
            {
                upArrow = true;
            }
        if (event.keyCode == Keyboard.RIGHT) 
            {
                rightArrow = true;
            }
        if (event.keyCode == Keyboard.DOWN) 
            {
                downArrow = true;
            }


    }





function keyReleased(event:KeyboardEvent):void
    {
        if (event.keyCode == Keyboard.LEFT) 
            {
                leftArrow = false;

            }
        if (event.keyCode == Keyboard.UP) 
            {
                upArrow = false;
            }
        if (event.keyCode == Keyboard.RIGHT) 
            {
                rightArrow = false;

            }
        if (event.keyCode == Keyboard.DOWN) 
            {
                downArrow = false;
            }
    }


function walkingLEFT(event:Event):void 
{
    if (leftArrow && ! hitting) 
        {
            char.x -= speed;

        }else
                                {
                                    hitting = false;
                                    ismoving = false;

                                }
}

function walkingRIGHT(event:Event):void 
{
    if (rightArrow && ! hitting) 
        {
            char.x += speed;

        }else
                                {
                                    hitting = false;
                                    ismoving = false;

                                }
}


function walkingUP(event:Event):void
{

                    if (upArrow && ! hitting)
                        {
                            char.y -= speed;

                        }
                            else
                                {
                                    hitting = false;
                                    ismoving = false;

                                }
                }

function walkingDOWN(event:Event):void
{

                    if (downArrow && ! hitting)
                        {
                            char.y += speed;

                        }
                            else
                                {
                                    hitting = false;
                                    ismoving = false;

                                }
                }




function detectHit2(e:Event):void
{
    if(boundsBmpData.hitTest(new Point(bounds.x, bounds.y),
                                255,
                                charBmpData,
                                new Point(char.x, char.y),
                                255))
        {

            hitting = true;
            ismoving = false;

        }
            else 
                { 

                      hitting = false;

                      bounds.filters = [];
                }
        }

您的代码有点多余,因此很难理解,但我会尝试将所有ENTER_帧代码移到一个函数中,而不是移到5个函数中。这将消除以您不期望的顺序调用函数的任何可能性。

上述代码确实不适用于所有其他方向,然后离开

侦听器调用的顺序与您添加它们的顺序相同

因此,首先执行DetectThit2(),如果存在重叠,则会将命中设置为true

通过walkingLEFT()选中Next left;如果用户未按left键,则变量HITCH再次设置为false

使用附加的walkingXXXX()方法,命中将为false,并且如果按下特定键,坐标将始终进行调整

正如前面的回答所说,尝试使用一个单一事件侦听器

大概是这样的:

this.addEventListener(Event.ENTER_FRAME, handleEnterFrame);

function handleEnterFrame(anEvent: Event): void
{
  var newx: Number = char.x - (leftArrow ? speed : 0) + (rightArrow ? speed : 0);
  var newy: Number = char.y - (upArrow ? speed : 0) + (downArrow ? speed : 0);
  if(!boundsBmpData.hitTest(new Point(bounds.x, bounds.y),
                            255,
                            charBmpData,
                            new Point(newx, newy),
                            255))
  {
     char.x = newx;
     char.y = newy;
  }
}

如果您允许播放器按多个方向键,则可能需要先调整X坐标,然后调整Y坐标,从而优化上述代码(因此需要两次hitTest调用)。因此,当用户按下两个方向键时,字符会滑过墙壁,其中一个方向键会不断将字符撞到墙上。

感谢您的回答,您的回答是正确的,关于混乱的代码,我在您的另一个问题()中提供的代码应该可以做到这一点:)