XNA 2D Точка объекта на курсор во времени - PullRequest
1 голос
/ 21 декабря 2011

В настоящий момент я правильно нахожу расстояние и вращение объекта и курсора на экране.

Vector2 direction = podType[podIndex]._Position - MouseCursorInWorld; 
mousePoint = (float)(Math.Atan2(-direction.X, direction.Y));

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

        percent = mousePoint / mousePoint * increment;
        if(percent < mousePoint)increment += 0.01f;
        if (percent > mousePoint) increment -= 0.01f;

Как вы можете видеть здесь, процент - это процент от общего поворота ккурсор, и если вращение меньше или больше, чем процент, который он перемещает к этому приращению, пока он не достигнет 100%, что означает, что он правильно направлен на курсор.

Проблема в том, что левая сторона отрицательна, а правая сторонаположительно, мое полное вращение достигает 3,1 и -3,1, поэтому, когда я перемещаю курсор внизу куда-то и двигаюсь из крайнего правого положения в крайнее левое, вместо продолжения своего пути влево к курсору, он вращается вправо, потому что текущая мышьзначение точки отрицательное 2,2, которое в настоящее время было положительным 1,5

здесь каким-то образом я могу обернуть вращение, чтобы оно не имело отрицательного и положительного угла?Или есть лучшая техника, которую я могу использовать, чем та, которой я сейчас занимаюсь?Спасибо за ваше время:)

1 Ответ

3 голосов
/ 21 декабря 2011

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

Попробуйте обернуть целевую величину вращения между Piи -Pi, вы можете сделать что-то вроде следующего:

           Vector2 dist = podType[podIndex]._Position - MouseCursorInWorld; 
           float angleTo = (float)Math.Atan2(dist.Y, dist.X); //angle you want to get to

           rotation = MathHelper.WrapAngle(rotation); // keeps angle between pi and -pi

            if (angleTo > rotation)
                while (angleTo - rotation > MathHelper.Pi)
                    angleTo -= MathHelper.TwoPi;
            else
                while (angleTo - rotation < -MathHelper.Pi)
                    angleTo += MathHelper.TwoPi;


            if (rotation < angleTo) rotation += 0.01f;
            if (rotation > angleTo) rotation -= 0.01f;

rotation будет вашим текущим вращением.Кроме того, я бы посмотрел на MathHelper.Lerp (линейная интерполяция), если вы хотите получить значение в процентах между двумя числами.

В конце, вместо + или - 0,01f, вы можете получить что-токак

rotation = MathHelper.Lerp(rotation, angleTo, 0.01f);

, который будет увеличивать значение вашего поворота в направлении вашего целевого угла на 1% каждый кадр.

...