Заикание при перемещении одного спрайта в приложении XNA

Обновление :Я загрузил видео, показывающее заикание здесь:http://intninety.co.uk/xnastutter.mp4вам, возможно, придется внимательно посмотреть на видео, если вы не просматриваете его в 1920x1080, но вы видите, что при перемещении каждые 2 секунды или около того наблюдается довольно отчетливое заикание, я бы рекомендовал просматривать его в проигрывателе Windows Media, а не в веб-браузере, чтобы убедиться, что само видео не прерывистое и, таким образом, вы не увидите фактическое заикание

. ] Недавно я взялся за проект, который начал некоторое время назад, однако я все еще пытаюсь решить проблему, на которой остановился!

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

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

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

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

Спасибо:)

Конструктор игры Настройка диспетчера графических устройств

graphics = new GraphicsDeviceManager(this);
graphics.IsFullScreen = true;
graphics.SynchronizeWithVerticalRetrace = false;
graphics.PreferredBackBufferWidth = 1920;
graphics.PreferredBackBufferHeight = 1080;
Content.RootDirectory = "Content";
this.IsFixedTimeStep = false;

Код из метода обновления игры

KeyboardState keyboard = Keyboard.GetState();
GamePadState gamePad = GamePad.GetState(PlayerIndex.One);

if (keyboard.IsKeyDown(Keys.Escape)) {
    this.Exit();
}

if ((keyboard.IsKeyDown(Keys.Left)) || (gamePad.DPad.Left == ButtonState.Pressed))
{
    this.player.MoveLeft((float)gameTime.ElapsedGameTime.TotalMilliseconds); 
} else if ((keyboard.IsKeyDown(Keys.Right)) || (gamePad.DPad.Right == ButtonState.Pressed))
{
    this.player.MoveRight((float)gameTime.ElapsedGameTime.TotalMilliseconds);
}

if ((keyboard.IsKeyDown(Keys.Up)) || (gamePad.DPad.Up == ButtonState.Pressed))
{
    this.player.MoveUp((float)gameTime.ElapsedGameTime.TotalMilliseconds);
} else if ((keyboard.IsKeyDown(Keys.Down)) || (gamePad.DPad.Down == ButtonState.Pressed))
{
    this.player.MoveDown((float)gameTime.ElapsedGameTime.TotalMilliseconds);
}

base.Update(gameTime);

Методы «Move», показанные в приведенном выше методе обновления

public void MoveLeft(float moveBy)
{
    this.position.X -= (moveBy * this.velocity.X);
}
public void MoveRight(float moveBy)
{
    this.position.X += (moveBy * this.velocity.X);
}

public void MoveUp(float moveBy)
{
    this.position.Y -= (moveBy * this.velocity.Y);
}

public void MoveDown(float moveBy)
{
    this.position.Y += (moveBy * this.velocity.Y);
}

Метод рисования игры

GraphicsDevice.Clear(Color.CornflowerBlue);

spriteBatch.Begin();

spriteBatch.Draw(this.player.Texture, this.player.Position, null, Color.White, this.player.Rotation, this.player.Origin, 1.0f, SpriteEffects.None, 0.0f);

spriteBatch.End();

base.Draw(gameTime);

Редактировать :забыл упомянуть, объект скорости, используемый в методах Move, представляет собой Vector2

6
задан Bhargav Rao 29 July 2018 в 01:17
поделиться