【问题标题】:Severe Movement Lag - C#, XNA严重的运动滞后 - C#、XNA
【发布时间】:2013-04-26 20:19:51
【问题描述】:

我对 C# 编程非常陌生,而且,任何东西都可以编程。这是我的第三个 2D 游戏,我遇到了一个问题。出于某种原因,当我试图移动我的精灵时,游戏变得非常缓慢,我不知道为什么。

这是 Sheep 类:

using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace IdeaLess
{
class Sheep
{
    //-//-//-//-//-//
    public Texture2D SheepTexture;
    public const float SheepSpeed = 0.5f;
    public Vector2 SheepPosition;
    public int Width
    {
        get { return SheepTexture.Width; }
    }
    public int Height
    {
        get { return SheepTexture.Height; }
    }
    //-//-//-//-//-//
    public void Initialize(Texture2D texture, Vector2 position)
    {
        SheepTexture = texture;
        SheepPosition = position;
    }

    public void Update()
    {
    }

    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(SheepTexture, SheepPosition, null, Color.White, 0f,      Vector2.Zero, 1f, SpriteEffects.None, 0f);
    }
}
}

还有 Game1.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace IdeaLess
{
public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;

    //CLASS OBJECTS
    Sheep sheep;
    Pig pig;

    //SHEEP
    float SheepMoveSpeed;
    //PIG
    float PigMoveSpeed;

    //KEYBOARDSTATES
    KeyboardState currentKeyboardState;
    KeyboardState previousKeyboardState;

    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
    }

    protected override void Initialize()
    {
        sheep = new Sheep();
        pig = new Pig();
        SheepMoveSpeed = 5f;
        PigMoveSpeed = 4f;
        base.Initialize();
    }
    protected override void LoadContent()
    {
        spriteBatch = new SpriteBatch(GraphicsDevice);
        Vector2 sheepPosition = new Vector2(20, 30);
        Vector2 pigPosition = new Vector2(20, 400);
        sheep.Initialize(Content.Load<Texture2D>("Sheep"), sheepPosition);
        pig.Initialize(Content.Load<Texture2D>("Pig"), pigPosition);
    }
    protected override void UnloadContent()
    {
    }
    protected override void Update(GameTime gameTime)
    {
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();

        previousKeyboardState = currentKeyboardState;
        currentKeyboardState = Keyboard.GetState();
        UpdateSheep(gameTime);
        UpdatePig(gameTime);

        base.Update(gameTime);
    }
    private void UpdateSheep(GameTime gameTime)
    {
        if (currentKeyboardState.IsKeyDown(Keys.Left))
            sheep.SheepPosition.X -= SheepMoveSpeed;
        if (currentKeyboardState.IsKeyDown(Keys.Right))
            sheep.SheepPosition.X += SheepMoveSpeed;
    }
    private void UpdatePig(GameTime gameTime)
    {
        if (currentKeyboardState.IsKeyDown(Keys.A))
            pig.PigPosition.X -= PigMoveSpeed;
        if (currentKeyboardState.IsKeyDown(Keys.D))
            pig.PigPosition.X += PigMoveSpeed;
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.White);

        spriteBatch.Begin();

        sheep.Draw(spriteBatch);
        pig.Draw(spriteBatch);

        spriteBatch.End();

        base.Draw(gameTime);
    }
}
}

到目前为止,游戏仅由玩家类(Sheep)和 Game1.cs 组成。还有猪班;和羊一模一样。

基本上,每当我按住“右箭头”时,精灵移动不平稳且不平稳,有时会减速到几乎静止,有时它会正常移动片刻,然后再次滞后。

这不仅仅是精灵的运动,还有 FPS。我知道这一点是因为我在之前的游戏中遇到过这种延迟,它导致背景音乐停止并且计时器停止计时。

任何想法可能导致这种情况?

【问题讨论】:

  • 你确定是 FPS 吗?你能加一个fps counter吗?

标签: c# xna sprite game-physics


【解决方案1】:

好消息,看起来没什么大不了的!我一直鼓励新 XNA 程序员做的一件事是添加 Elapsed time!基本上,取决于您的系统在给定时间运行的速度,可能会影响您的精灵移动的速度,具体取决于您拥有的每秒帧数。如果您在另一台计算机上尝试此操作,它可能会以完全不同的速度运行。

要更正此问题,您需要修改您的 UpdateAnimal() 方法

private void UpdateSheep(GameTime gameTime)
{
        //How much time has passed since the last frame, incase we lag and skip a frame, or take too long, we can process accordingly
        float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;

        if (currentKeyboardState.IsKeyDown(Keys.Left))
            sheep.SheepPosition.X -= SheepMoveSpeed * elapsed; // Multiply by elapsed!
        if (currentKeyboardState.IsKeyDown(Keys.Right))
            sheep.SheepPosition.X += SheepMoveSpeed * elapsed;
}

现在,根据您的计算机规格,elapsed 将是 1(秒)的一小部分,因此您需要增加您的 SheepMoveSpeed 直到您的精灵开始移动。

如果这不起作用,您可以尝试使用分析器来查看导致延迟的原因,或者添加一个 fps 计时器来查看它是否真的“laggy”或者只是一个问题移动正常。

我还鼓励您创建一个 Animal 类,并创建其他继承自它的类。

【讨论】:

  • 哦,非常感谢。这似乎解决了我的问题,尽管羊有时仍然会在一瞬间“反弹”一毫米,这让我的眼睛有些恼火。还是顺滑多了!只是想知道,如果我创建一个 Animal 类并将 Sheep 设置为一个孩子,以及其他动物,例如,所有动物不会获得相同的位置吗?还是 Animal 类只有全局变量和赋予所有孩子的方法?
  • 只要您的Sheep sheep; 不是静态的(即Static Sheep sheep),它将是该类的一个实例,这样您就可以拥有多只羊,或多只羊同类动物。
  • 啊,好吧。现在将其标记为已回答。感谢您抽出宝贵时间帮助我,我自己可能想不通。
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
  • 1970-01-01
  • 2022-07-29
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
相关资源
最近更新 更多