Я пытаюсь анимировать 2-й спрайт в своей 2D-игре XNA силой силы тяжести. Я разработал очень простой класс для достижения имитационного эффекта. Это мой пример кода.Моделирование силы тяжести в XNA
namespace Capture
{
class PhysX
{
static Vector2 g = new Vector2(0.0f, 10.0f);
public Vector2 pos, vel, acc, accumForce;
public float mass;
public bool USE_GRAVITY = true;
/* Constructor */
public void Engage(ref GameTime gameTime, uint maxX, uint maxY)
{
Vector2 F = Vector2.Zero;
if (USE_GRAVITY)
{
F = accumForce + mass * g;
}
acc = F/mass;//This is the Net acceleration, Using Newtons 2nd Law
vel += acc * gameTime.TotalGameTime.Seconds;// v = u + a*t
pos += vel * gameTime.TotalGameTime.Seconds;// s = u*t + 0.5*a*t*t,
pos.X %= maxX;
pos.Y %= maxY;
}
public void ApplyForce(ref Vector2 f)
{
accumForce += f;
}
}
}
Я вызываю метод PhysX#Engage()
в Game#Update(GameTime gt)
методом. Проблема в том, что я не получаю гладкую анимацию. Это потому, что положение становится очень большим. Чтобы, преодолеть это, я попытался взять модуль, как показано в коде с Viewport.Width, Viewport.Height
, но все же координаты позиции не совсем гладкие. Что мне делать. Как сделать анимацию гладкой? Пожалуйста помоги.
Что такое ваш массовый набор? чем выше масса, тем медленнее ускорение. –
@SteveH массовый термин в силе и деление по массе компенсируют. Ускорение силы тяжести не зависит от массы. – CodesInChaos
@Anurag Ваша скорость увеличивается линейно со временем. Обычно вы вводите замедленный термин, линейный по скорости, чтобы имитировать трение и ограничивать конечную скорость. – CodesInChaos