2016-04-12 10 views
0

С небольшой помощью мне удалось создать 2D-планету с рабочей гравитацией, которая постоянно тянет персонажа к его центру. Единственная проблема теперь в том, что я полностью зациклен на том, как сделать так, чтобы пользователь мог заставить этого персонажа пересекать планету, как можно было бы ожидать, а не просто вверх/вниз/влево/вправо, к которой мы привыкли в естественных платформерах.AS3/Flashdevelop - управление двумерным персонажем для перемещения по планете с гравитацией

Следует отметить, что пройденная планета будет иметь платформы/слои, чтобы прыгать и падать, поэтому движение и прыжки должны быть связаны с центром планеты, где центр планеты действует как «вниз», будет в традиционном платформере (вот почему я, кажется, считаю, что мне нужен сложный способ создания такого рода естественного движения).

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

Это единственный способ пойти или я должен попытаться решить проблему по-другому? Надеюсь, не потому, что я не думаю, что смогу добиться этого иначе.

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

public function moveChar(event:Event):void 
    { 
      if (leftPressed) 
      { 
       character.x -= mainSpeed; 
      } 
      if (rightPressed) 
      { 
       character.x += mainSpeed; 
      } 
      if (upPressed) 
      { 
       character.y -= mainSpeed; 
      } 
      if (downPressed) 
      { 
       character.y += mainSpeed; 
      } 
     } 

public function gravity():void 
{ 
    //tan2(planet.y - player.y, planet.x - player.x) 
    angle = Math.atan2((planet1.y + 2245) - (character.y+5), (planet1.x+2245) - (character.x+5)); 
    gravityX = Math.cos(angle) * gravitationalAcceleration; 
    gravityY = Math.sin(angle) * gravitationalAcceleration; 

    //distance = Math2.Pythagoras(planet1.x + 50, planet1.y + 50, character1.x + 5, character1.y + 5); 
    distance = Math.sqrt((yDistance * yDistance) + (xDistance * xDistance)); 

    //Calculate the distance between the character and the planet in terms of x and y coordinate 
    xDistance = (character.x + 5) - (planet1.x + 2245);//320 to 50 
    yDistance = (character.y + 5) - (planet1.y + 2245);//320 to 50 

    //Make sure this distance is a positive value 
    if (xDistance < 0) { 
     xDistance = -xDistance; 
    } 
    if (yDistance < 0) { 
     yDistance = -yDistance; 
    } 

    //Update the current velocity before new velocity is calculated 
    initialXVelocity = finalXVelocity; 
    initialYVelocity = finalYVelocity; 

    //Send the character into the correct direction 
    character.x += gravityX; 
    character.y += gravityY; 

    //Basic collision detection of the surface, basic stop of gravity 
    if (distance <= planet1Radius) { 
    trace("hit!"); 

    if (planet1.x - 2180 < character.x - 5) { //320 to 50 
     character.x -= gravityX*1.025; 
    } 
    else { 
     character.x += gravityX*1.025; 
    } 
    if (planet1.y - 2180 < character.y - 5) { //320 to 50 
     character.y -= gravityY*1.025; 
    } 
    else { 
     character.y += gravityY*1.025; 
    } 
    } else { 
    trace(" no hit!"); 
    } 

}

ответ

0

Одна из идей - заставить мир (кроме игрока) вращаться вокруг центра планеты, когда вы нажимаете влево/вправо, а не перемещаете персонажа.

Если вы не хотите этого делать, вы можете использовать raycasts, как указано в ответе here.