2016-09-02 8 views
0

В настоящее время я работаю над 2D-скроллером и реализовал методы, используемые в статье для захвата захвата, и он работает очень хорошо. Моя проблема заключается в том, что я хочу, чтобы мой игрок мог немного размахивать веревкой, чтобы набрать немного импульса, но в настоящее время я не могу остановить игрока от движения до 90 градусов с каждой стороны. Какие методы могут быть применены для ограничения этого предела?Java libgdx: предельная круговая скорость (качающаяся сущность)

Я попытался использовать отдельную скорость игрока для размаха, но это только замедляет процесс. Я все еще могу размахивать до 90 градусов с каждой стороны.

Вот моя функция обновления в проигрывателе

public void update(float dt){ 
    //handle friction and air resistance 
    if(dx !=0){ 
     if(touchingGround) { 
      // apply friction 
      if (dx > 0) { 
       dx -= retardation; 
      } else { 
       dx += retardation; 
      } 
     } else { 
      //applied air resistance 
      if (dx > 0) { 
       dx -= airResistance; 
      } else { 
       dx += airResistance; 
      } 
     } 
    } 
    // handle gravity 
    dy -= Constants.GRAVITY * dt; 
    if(dy < -terminalVelocity){ 
     dy = -terminalVelocity; 
    } 

    /* 
     Handle Player movement 
    */ 

    if(right){ 
     if(dx <= maxSpeed){ 
      dx += acceleration; 
     } 
     dx = maxSpeed; 
    } 

    if(left){ 
     if(dx <= -maxSpeed){ 
      dx -= acceleration; 
     } 
     dx = -maxSpeed; 
    } 

    if(isGrappling){ 

     //If we collide with something we need to stop grappling 
     if(hasCollided){ 
      isGrappling = false; 
     } else { 

      // This algorithm from here: 
      // http://gamedev.stackexchange.com/questions/61596/player-rope-swing 

      float currentD = (float) Math.sqrt(((grappleX - x) * (grappleX - x)) + ((grappleY - y) * (grappleY - y))); 
      float prevX = getX(), prevY = getY(); 

      if (currentD > grappleRadius) { 
       Vector2 hookPos = new Vector2(grappleX, grappleY); 
       Vector2 testPos = (new Vector2(x, y).sub(hookPos)).nor(); 

       y = (hookPos.y + testPos.y * grappleRadius); 
       x = (hookPos.x + testPos.x * grappleRadius); 

       // s = d/t 
       dx += (x - prevX)/dt; 
       dy += (y - prevY)/dt; 
      } 
     } 
    } 

    /* 
     Collision Detection, handle last always! 
    */ 

    float oldX = getX(), oldY = getY(); 
    boolean collisionX = false, collisionY = false; 

    // move on x 
    x += dx * dt; 

    // calculate the increment for step in #collidesLeft() and #collidesRight() 
    increment = collisionLayer.getTileWidth(); 
    increment = getWidth() < increment ? getWidth()/2 : increment/2; 

    if(dx < 0) // going left 
     collisionX = collidesLeft(); 
    else if(dx > 0) // going right 
     collisionX = collidesRight(); 

    // react to x collision 
    if(collisionX) { 
     setX(oldX); 
     dx = 0; 
    } 

    // move on y 
    y += dy * dt; 

    // calculate the increment for step in #collidesBottom() and #collidesTop() 
    increment = collisionLayer.getTileHeight(); 
    increment = getHeight() < increment ? getHeight()/2 : increment/2; 

    if(dy < 0) { 
     touchingGround = collisionY = collidesBottom(); 
     // we can only jump 2 times before we have to touch the floor again 
     if(collisionY){ 
      numberOfJumps = 2; 
     } 
    } else if(dy > 0) { 
     collisionY = collidesTop(); 
    } 

    // react to y collision 
    if(collisionY) { 
     setY(oldY); 
     dy = 0; 
    } 

    hasCollided = collisionX || collisionY; 
} 

ответ

0

Как я не использую любой физический движок я выбрал просто эмулировать физику, ограничивая угол, при котором игрок может применить силу для качелей.

  // check if angle permits movement 
      if(grappleAngle < Math.PI/9 && grappleAngle > -Math.PI/9) { 
       // handle momentum gaining on rope 
       if (right) { 
        dx += swingAcceleration * dt; 
       } 

       if (left) { 
        dx -= swingAcceleration * dt; 
       } 
      }