Почему дельта время не работает?(MonoGame, C #) - PullRequest
0 голосов
/ 12 июня 2018

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

https://youtu.be/XYC-AZbk0JE

Но игрок на 144fps один по-прежнему идет быстрее.Мой код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

namespace _2D_Game_Test.GameStates
{
public class TestState : GameState
{
    Vector2 velocity;
    Vector2 position;

    double change = 0;

    KeyboardState keyboardState;

    public override void Initialize()
    {
        velocity = new Vector2(0, 0);
        position = new Vector2((1280 / 2) - (Game.Bob.Width / 2), (720 / 2) - (Game.Bob.Height / 2));
    }

    public override void Update(GameTime gameTime)
    {
        if (Mouse.GetState().LeftButton == ButtonState.Pressed)
        {
            change = 0;
            velocity = new Vector2(0, 0);
            position = new Vector2((1280 / 2) - (Game.Bob.Width / 2), (720 / 2) - (Game.Bob.Height / 2));
        }

        double delta = gameTime.ElapsedGameTime.TotalSeconds;

        keyboardState = Keyboard.GetState();

        if (keyboardState.IsKeyDown(Keys.A))
        {
            if (change > 0)
            {
                change -= (10 * delta);
            }
            else if (change > -5f)
            {
                if (change - (5 * delta) < -5f)
                {
                    change = -5f;
                }
                else
                {
                    change -= (5 * delta);
                }
            }
        }
        else if (keyboardState.IsKeyDown(Keys.D))
        {
            if (change < 0)
            {
                change += (10 * delta);
            }
            else if (change < 5f)
            {
                if (change + (5 * delta) > 5f)
                {
                    change = 5f;
                }
                else
                {
                    change += (5 * delta);
                }
            }
        }

        if (keyboardState.IsKeyUp(Keys.A) && keyboardState.IsKeyUp(Keys.D))
        {
            if (change > 0)
            {
                if ((change -= (2 * delta)) < 0)
                {
                    change = 0;
                }
                else
                {
                    change -= (2 * delta);
                }
            }
            else if (change < 0)
            {
                if ((change += (2 * delta)) > 0)
                {
                    change = 0;
                }
                else
                {
                    change += (2 * delta);
                }
            }
        }

        velocity.X = (float)change;
        position += velocity;
    }

    public override void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(Game.Bob, position, Color.White);
        spriteBatch.DrawString(Game.Debug, "A and D up: " + (keyboardState.IsKeyUp(Keys.A) && keyboardState.IsKeyUp(Keys.D)), new Vector2(10, 10), Color.Black);
        spriteBatch.DrawString(Game.Debug, "A down: " + (keyboardState.IsKeyDown(Keys.A)), new Vector2(10, 30), Color.Black);
        spriteBatch.DrawString(Game.Debug, "D down: " + (keyboardState.IsKeyDown(Keys.D)), new Vector2(10, 50), Color.Black);
        spriteBatch.DrawString(Game.Debug, "Velocity modifier: " + velocity, new Vector2(10, 70), Color.Black);
        spriteBatch.DrawString(Game.Debug, "Current velocity: " + velocity.X, new Vector2(10, 90), Color.Black);
    }
}
}

Что я сделал не так?

PS: Я уверен, что не только мои глаза играют со мной.Я вижу, что игрок на 144 к / с движется быстрее, чем на 60 к / с.

1 Ответ

0 голосов
/ 13 июня 2018

Проблема здесь не в самом дельта-времени.

Когда вы вычисляете изменение скорости, вы идеально применяете дельта-время.

Проблема возникает, когда вы фактически применяете скоростьигроку самого себя.Допустим, вы находитесь на максимальной скорости (5).Поскольку вы не учитываете дельта-время при применении скорости к позиции, вы будете применять скорость намного чаще при 144 кадрах в секунду, чем при 60 кадрах в секунду.Вот почему персонаж, кажется, идет быстрее.

Вы, вероятно, хотите сделать что-то вроде:

position += velocity * delta;

Это должно решить вашу проблему.

...