2017-07-20 36 views
-1

我正在AS3制作平台成型器的过程中。然而,我正在努力的一件事是如何管理斜率检测。最好是类似于像这样的游戏,类似花式裤子冒险,但id真的不喜欢使用外部的东西,如Box2D或CDK,因为这两者都让我非常困惑,而id通常更喜欢只是没有一个。我所有的尝试都存在这样的问题,即我可以使用它来处理一些斜坡,但不是所有的(例如,角色管理一个斜坡,但通过另一个斜坡下降),然后当我改变它以适应另一个斜坡时,它不适合第一个(例如,玩家管理第二斜率,但反弹并在第二下疯狂...... 因此,任何帮助,将不胜感激...... 感谢。 代码如下。AS3平台成形器坡度检测

//var setup 
var leftPressed: Boolean = false; 
var rightPressed: Boolean = false; 
var upPressed: Boolean = false; 
var downPressed: Boolean = false; 
var leftBumping: Boolean = false; 
var rightBumping: Boolean = false; 
var upBumping: Boolean = false; 
var downBumping: Boolean = false; 
var lowerleftBumping: Boolean = false; 
var lowerrightBumping: Boolean = false; 
var leftBumpPoint: Point = new Point(-30, -87); 
var rightBumpPoint: Point = new Point(30, -87); 
var lowerleftBumpPoint: Point = new Point(-32, -2); 
var lowerrightBumpPoint: Point = new Point(32, -2); 
var upBumpPoint: Point = new Point(0, -174); 
var downBumpPoint: Point = new Point(0, 0); 
var scrollX: Number = -4; 
var scrollY: Number = -68; 
var ySpeed: Number = 0; 
var xSpeed: Number = 0; 
var speedConstant: int = 5; 
var maxSpeedConstant: Number = 30; 
var frictionConstant: Number = 0.9; 
var gravityConstant: Number = 2; 
var jumpConstant: Number = -45; 
//game 
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); 
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler); 
stage.addEventListener(Event.ENTER_FRAME, loop); 
function keyDownHandler(e: KeyboardEvent): void { 
    if (e.keyCode == Keyboard.LEFT) { 
     leftPressed = true; 

    } else if (e.keyCode == Keyboard.RIGHT) { 
     rightPressed = true; 

    } else if (e.keyCode == Keyboard.UP) { 
     upPressed = true; 

    } else if (e.keyCode == Keyboard.DOWN) { 
     downPressed = true; 
    } 
} 

function keyUpHandler(e: KeyboardEvent): void { 
    if (e.keyCode == Keyboard.LEFT) { 
     leftPressed = false; 

    } else if (e.keyCode == Keyboard.RIGHT) { 
     rightPressed = false; 

    } else if (e.keyCode == Keyboard.UP) { 
     upPressed = false; 

    } else if (e.keyCode == Keyboard.DOWN) { 
     downPressed = false; 
    } 
} 

function loop(e: Event): void { 
    if (back.hitTestPoint(player.x + leftBumpPoint.x, player.y + leftBumpPoint.y, true)) { 
     trace("leftBumping"); 
     leftBumping = true; 
    } else { 
     leftBumping = false; 
    } 

    if (back.hitTestPoint(player.x + rightBumpPoint.x, player.y + rightBumpPoint.y, true)) { 
     trace("rightBumping"); 
     rightBumping = true; 
    } else { 
     rightBumping = false; 
    } 

    if (back.hitTestPoint(player.x + upBumpPoint.x, player.y + upBumpPoint.y, true)) { 
     trace("upBumping"); 
     upBumping = true; 
    } else { 
     upBumping = false; 
    } 

    if (back.hitTestPoint(player.x + downBumpPoint.x, player.y + downBumpPoint.y, true)) { 
     trace("downBumping"); 
     downBumping = true; 
    } else { 
     downBumping = false; 
    } 
      if (back.hitTestPoint(player.x + lowerleftBumpPoint.x, player.y + lowerleftBumpPoint.y, true)) { 
      trace("lowerrightBumping"); 
      lowerleftBumping = true; 
     } else { 
      lowerleftBumping = false; 
     } 
     if (back.hitTestPoint(player.x + lowerrightBumpPoint.x, player.y + lowerrightBumpPoint.y, true)) { 
      trace("lowerrightBumping"); 
      lowerrightBumping = true; 
     } else { 
      lowerrightBumping = false; 
     } 
    if (leftPressed) { 
     xSpeed -= speedConstant; 

    } else if (rightPressed) { 
     xSpeed += speedConstant; 

    } 
    if (leftBumping) { 
     if (xSpeed < 0) { 
      xSpeed *= -0.5; 
     } 
    } 

    if (rightBumping) { 
     if (xSpeed > 0) { 
      xSpeed *= -0.5; 
     } 
    } 

    if (upBumping) { 
     if (ySpeed < 0) { 
      ySpeed *= -0.5; 
     } 
    } 

    if (downBumping) { 
     if (ySpeed > 0) { 
      ySpeed = 0; //set the y speed to zero 
     } 
     if (upPressed) { 
      ySpeed = jumpConstant; 
     } 
    } else { 
     ySpeed += gravityConstant; 
    } 
    if (xSpeed > maxSpeedConstant) { //moving right 
     xSpeed = maxSpeedConstant; 
    } else if (xSpeed < (maxSpeedConstant * -1)) { //moving left 
     xSpeed = (maxSpeedConstant * -1); 
    } 
    xSpeed *= frictionConstant; 
    ySpeed *= frictionConstant; 
    if (Math.abs(xSpeed) < 0.5) { 
     xSpeed = 0; 
    } 

    scrollX -= xSpeed; 
    scrollY -= ySpeed; 

    back.x = scrollX; 
    back.y = scrollY; 
    if (scrollY < -770) { 
     scrollX = -4; 
     scrollY = -68; 
     ySpeed=0 
     xSpeed=0 
    } 
} 
+0

这没有意义。您应该表达您确切的问题并显示导致问题的代码片段。 – HITMAN

+0

有在线教程(是的,有很多)如何制作平台游戏,即使是一步一步的教程,你应该从第一位开始。如果Box2D正是为了让事情变得更加简单,并且将令人困惑的碰撞和反向运动学部分混淆,那么您是否真的希望通过不使用它而以更简单更简单的解决方案摆脱困境? – Organis

回答

1

如果我被迫不使用我生命中的爱(Box2D),那么我想我会玩hitTestObject,并对我的任何斜坡的角度做一些数学运算,以产生他们开始移动的速度。有点宽泛,我认为这里的社区更适合r具体问题而不是架构头脑风暴。

+0

嗨,我完全理解你在这里说的话,我的问题有点宽泛,而且我知道他们在这里工作不好。我很乐意使用Box2D,但在互联网上找不到任何东西,似乎解释了如何在游戏未包含在课堂中时使用它。这很让人烦恼,因为我一直有这个问题阻碍了项目。但是,如果你愿意解释/告诉我这一点,那么我会非常感激。谢谢 –

+0

框架代码效率不高。我会认真地建议你跳出你的设计,因为使用这种方法构建大型应用程序会让你花费更多的时间,而不是使用类的普通项目。这真的不那么辛苦,学习会让你在Flash/AIR中获得更多......我能说得最好的方法是,如果你只有一个框架,并把所有的代码放在那里没有孩子有任何框架代码,并建立这样的..但这是一个可怕的做法,你应该*认真*考虑另一种方式。 – quantomworks

+0

好吧,我不知道该怎么做,因为那仅仅是我的知识中的100%......就像之前我曾经使用过类,但那些都很困难,我遇到了几十个问题,导入大量的东西...我会尽力。如果我得到它的工作,我可以依靠关于Box2D的建议吗? –