Im используя технику для управления спрайтом, поворачивая влево/вправо, а затем ускоряясь вперед. У меня есть 2 вопроса. (Код она склеена из разных классов из-за полиморфизм. Если это не имеет смысла, дайте мне знать. Движение хорошо работает и обнаружение экрана выключены, а.)Держите Вращающийся спрайт от выхода с экрана, но возвращайтесь назад.
Когда игрок перемещает выключение экрана я вызываю метод Bounce. Я хочу, чтобы игрок не мог передвигаться с экрана, но чтобы изменить направление и вернуться. Это работает сверху и снизу, но левый и правый края очень редко. Главным образом он делает wierd отскок и оставляет экран.
Я хотел бы изменить алгоритм ускорения, чтобы установить максимальную скорость и скорость ускорения. Atm TangentalVelocity делает оба.
float TangentalVelocity = 8f;
//Called when up arrow is down
private void Accelerate()
{
Velocity.X = (float)Math.Cos(Rotation) * TangentalVelocity;
Velocity.Y = (float)Math.Sin(Rotation) * TangentalVelocity;
}
//Called once per update
private void Deccelerate()
{
Velocity.X = Velocity.X -= Friction * Velocity.X;
Velocity.Y = Velocity.Y -= Friction * Velocity.Y;
}
// Called when player hits screen edge
private void Bounce()
{
Rotation = Rotation * -1;
Velocity = Velocity * -1;
SoundManager.Vulture.Play();
}
//screen edge detection
public void CheckForOutOfScreen()
{
//Check if ABOVE screen
if (Position.Y - Origin.Y/2 < GameEngine.Viewport.Y) { OnExitScreen(); }
else
//Check if BELOW screen
if (Position.Y + Origin.Y/2 > GameEngine.Viewport.Height) { OnExitScreen(); }
else
//Check if RIGHT of screen
if (this.Position.X + Origin.X/2 > GameEngine.Viewport.Width) { OnExitScreen(); }
else
//Check if LEFT of screen
if (this.Position.X - Origin.X/2 < GameEngine.Viewport.X) { OnExitScreen(); }
else
{
if (OnScreen == false)
OnScreen = true;
}
}
virtual public void OnExitScreen()
{
OnScreen = false;
Bounce();
}