与 as3 平台游戏的左右碰撞问题



左右撞击碰撞有问题,它会检测到它,但是如果你按住例如右键,你可以穿过一堵墙,而没有任何真正的挣扎,无论是厚还是薄的

我知道我的碰撞检测不是很好,但这是我的第一个项目,因为我正在尝试一些简单的东西。

xFart是x方向上的速度,fart康斯坦特是你可以为更高或更低的速度而改变的常数,friksjons康斯坦特是游戏中的摩擦力。

希望得到一些帮助,而不仅仅是绷带:)

package AS
{
    import flash.display.MovieClip;
    import flash.events.KeyboardEvent;
    import flash.events.Event;
    import flash.geom.Point;
    public class Bane extends MovieClip
    {
        //Bevegelse variabler
        private var goUp:Boolean;
        private var goDown:Boolean;
        private var goLeft:Boolean;
        private var goRight:Boolean;
        //Fart variabler
        private var xScrollFart:Number = 10;
        private var yScrollFart:Number = 10;
        private var xFart:Number = 0;
        private var yFart:Number = 0;
        //Konstanter som kan endres
        private var minFart:Number = 0.5;
        private var maksFart:Number = 18;
        private var gravitasjonKonstant:Number = 1.8;
        private var hoppeKonstant:Number = 35;
        private var fartKonstant:uint = 4;
        private var friksjonKonstant:Number = 0.95;
        //Kollisjon
        private var upBumping:Boolean = false;  
        private var downBumping:Boolean = false;
        private var leftBumping:Boolean = false;
        private var rightBumping:Boolean = false
        //Kollisjonspunkter
        private var leftBumpPoint:Point = new Point(300 - 20, 300 - 40);
        private var rightBumpPoint:Point = new Point(300 + 20, 300 - 40);
        private var upBumpPoint:Point = new Point(300, 300 - 80);
        private var downBumpPoint:Point = new Point(300, 300);
        public function Bane()
        {
            goUp = false;
            goDown = false;
            goLeft = false;
            goRight = false;

            Constants.stageRef.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
            Constants.stageRef.addEventListener(KeyboardEvent.KEY_UP, keyUp);
            Constants.stageRef.addEventListener(Event.ENTER_FRAME, frameListener);
        }
        private function keyDown(evt:KeyboardEvent)
        {
            if(evt.keyCode==65) {goLeft=true} 
            if(evt.keyCode==68) {goRight=true} 
            if(evt.keyCode==87) {goUp=true} 
            if(evt.keyCode==83) {goDown=true} 
            if(evt.keyCode==37) {goLeft=true}
            if(evt.keyCode==38) {goUp=true}
            if(evt.keyCode==39) {goRight=true}
            if(evt.keyCode==40) {goDown=true}
        }

        private function keyUp(evt:KeyboardEvent)
        {
            if(evt.keyCode==65) {goLeft=false} 
            if(evt.keyCode==68) {goRight=false} 
            if(evt.keyCode==87) {goUp=false} 
            if(evt.keyCode==83) {goDown=false} 
            if(evt.keyCode==37) {goLeft=false}
            if(evt.keyCode==38) {goUp=false}
            if(evt.keyCode==39) {goRight=false}
            if(evt.keyCode==40) {goDown=false}
        }

        //Kjører koden 29 ganger i sekundet, hver frame
        private function frameListener(e:Event)
        {
            //Kollisjon
            if(this.hitTestPoint(upBumpPoint.x, upBumpPoint.y, true))
            {
                trace("upBumping");
                upBumping = true;
            } 
            else 
            {
                upBumping = false;
            }
            if(this.hitTestPoint(downBumpPoint.x, downBumpPoint.y, true))
            {
                trace("downBump");
                downBumping = true;
            }
            else
            {
                downBumping = false;
            }
            if(this.hitTestPoint(leftBumpPoint.x, leftBumpPoint.y, true))
            {
                trace("leftBump");
                leftBumping = true;
            }
            else
            {
                leftBumping = false;
            }
            if(this.hitTestPoint(rightBumpPoint.x, rightBumpPoint.y, true))
            {
                trace("rightBump");
                rightBumping = true;
            }
            else
            {
                rightBumping = false;
            }
            if(leftBumping)
            {
                if(xFart < 0)
                {
                    xFart *= -0.5;
                }
            }
            if(rightBumping)
            {
                if(xFart > 0)
                {
                    xFart *= -0.5;
                }
            }
            if(upBumping)
            {
                if(yFart < 0)
                {
                    yFart *= -0.5;
                }
            }
            if(downBumping)
            {
                if(yFart > 0)
                {
                    yFart *= 0;
                }
                goDown = false;
            }
            if(goLeft == true)
            {
                xFart -= fartKonstant
            }
            if(goRight == true)
            {
                xFart += fartKonstant
            }
            if(goDown == true)
            {
                yFart += fartKonstant
            }
            if(Math.abs(xFart) <= minFart)
            {
                xFart = 0
            }
            if(xFart >= maksFart)
            {
                xFart = maksFart;
            }
            if(xFart <= (maksFart * -1))
            {
                xFart = maksFart * -1;
            }
            xFart *= friksjonKonstant;
            yFart *= friksjonKonstant;
            xScrollFart -= xFart;
            yScrollFart -= yFart;
            this.x = xScrollFart;
            this.y = yScrollFart;
            if(downBumping == false)
            {
                goUp = false;
                yFart += gravitasjonKonstant;
            }
                else if(downBumping == true)
            {
                if(goUp)
                {
                    yFart = hoppeKonstant * -1;
                } 
            }
        }
    }
}

您没有解决冲突,这就是问题所在。除了检测碰撞的事实外,您还需要对碰撞对象执行一些操作,以便它们脱离碰撞。

每个模拟报价的当前逻辑如下:

  1. 检查与框边界的冲突。(顺便说一句,为什么要同时检查相反的边界?物体是否有可能同时与左右边界碰撞?
  2. 如果发生碰撞,请将速度减半,并沿 x/y 轴将方向更改为相反的方向。
  3. 根据一些规则更改速度。(顺便说一句,为什么要同时计算相反的运动?你的物体真的可以同时向左和向右移动吗?
  4. 以当前速度移动对象。

问题是,在整个计算完成后,对象可能仍然与边界发生冲突。您错过了该步骤,在该步骤中,您可以通过沿上一步后发生碰撞的路径向后移动对象来解决碰撞。

因此,要解决此问题,您需要首先在检测到物体时将物体移出碰撞。这应该是您计算的第二步。

  1. 检查冲突。
  2. 如果检测到,计算物体与障碍物的碰撞程度,并将其沿来时的路径移回,使其不再发生碰撞。
  3. 。你的其余逻辑...

以下链接可能很有用:

  • 碰撞检测和响应
  • 宽相碰撞

最新更新