更新:我在这里上传了一段显示口吃的视频:http: //intninety.co.uk/xnastutter.mp4如果您不是在 1920x1080 观看视频,您可能需要仔细查看视频,但您会在那里看到每 2 秒左右移动时会出现相当明显的口吃,我建议在 Windows Media Player 而不是您的网络浏览器中查看它,以确保视频本身不会断断续续,从而防止您看到实际的口吃
我最近拿起了一个我不久前开始的项目,但是我仍然在努力解决我留下的问题!
目前我有一个非常简单的应用程序,它在屏幕上只有一个精灵,并使用方向键四处移动。问题是每两秒钟左右,游戏就会卡顿,并且精灵似乎会向后跳,然后非常快地向后跳。
精灵本身是一个 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);
上述更新方法中看到的“移动”方法
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