Mathhelper.Clamp не точно? - PullRequest
       23

Mathhelper.Clamp не точно?

2 голосов
/ 31 января 2012

Я столкнулся с проблемой при использовании Mathhelper.Clamp в игре, над которой я работаю.Вот фрагмент кода, который вызывает у меня проблемы:

if (background.position.Y == 0) 
{
    player.position.Y = MathHelper.Clamp(player.position.Y, 0, viewport.Height / 2);
}
if (Math.Abs(background.position.Y) == background.sprite.Height - viewport.Height / 2)
{
    player.position.Y = MathHelper.Clamp(player.position.Y, viewport.Height / 2, viewport.Height - player.sprite.Height);
}
if (player.position.Y == viewport.Height / 2) 
{
    background.position.Y = MathHelper.Clamp(background.position.Y, -(background.sprite.Height - viewport.Height / 2), 0);
}

По сути, я надеюсь достичь (начиная с x, 0) позволить спрайту игрока двигаться вниз, пока он не достигнет серединыэкран, затем фон будет перемещаться вместо этого, пока он не достигнет нижней части фона минус половина высоты экрана, затем спрайт игрока снова будет двигаться, пока не достигнет нижней части экрана.(У меня есть код, чтобы это произошло) - Мне кажется, это довольно типичная функциональность камеры для 2D бокового скроллера.

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

Может кто-нибудь сказать мне, если есть причина, почему это не должно работать, или что я могу сделать, чтобы сделатьэто работает?Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 31 января 2012

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

Примерно так:

// Difference less than one tenthousandth should be considered equal
private const float Epsilon = 0.0001;

public static bool FloatEquals(float f1, float f2)
{
    return Math.Abs(f1 - f2) < Epsilon;
}
0 голосов
/ 01 февраля 2012

Я понял, что сделал неправильно, когда позиция игрока переместилась за пределы моего зажима ... Я поставил код зажима перед кодом движения.Переставив их, все прояснилось!

...