AS3/Flashdevelop - Управление 2D-персонажем для перемещения по планете с гравитацией

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

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

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

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

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

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!");
    }

}

1 ответ

Решение

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

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

Другие вопросы по тегам