XNA простой конечный автомат ничего не делает - PullRequest
0 голосов
/ 07 февраля 2019

Я работаю над проектом для моего класса Video Game Design, в котором мне нужно было найти некоторые ошибки в некотором коде, исправить их, а затем преобразовать все в конечный автомат, используя перечисление.Я вставил ниже методы инициализации, обновления и рисования, и, как вы можете видеть, я закомментировал старый код перед его преобразованием в конечный автомат.Раньше все работало нормально со всеми операторами if / else, но теперь, когда я его преобразовал, он на самом деле ничего не делает.Он отображает стоящий спрайт в исходном положении, но нажатие клавиш абсолютно ничего не делает.

УСТАНОВКА ПЕРЕМЕННЫХ

    Texture2D heroineTexture, dive, duck, jump, stand;
    int yVelocity, jumpVelocity, diveVelocity;
    Rectangle player;
    enum State
    {
        Standing,
        Jumping,
        Ducking,
        Diving
    };
    State state;

    KeyboardState kb, oldkb;

ИНИЦИАЛИЗАЦИЯ

        oldkb = Keyboard.GetState();
        jumpVelocity = -10;
        diveVelocity = 15;
        yVelocity = 0;
        heroineTexture = stand;
        state = State.Standing;
        player = new Rectangle(0, 430, 50, 40);
        base.Initialize();

ОБНОВЛЕНИЕ

        kb = Keyboard.GetState();
        // Allows the game to exit
        if (kb.IsKeyDown(Keys.Escape))
            this.Exit();

        // TODO: Add your update logic here

        player.Y += yVelocity;

        switch (state)
        {
            case State.Standing:
                if (kb.IsKeyDown(Keys.J))
                {
                    state = State.Jumping;
                    yVelocity = jumpVelocity;
                    heroineTexture = jump;
                }
                else if (kb.IsKeyDown(Keys.Down))
                {
                    state = State.Ducking;
                    heroineTexture = duck;
                }
                break;
            case State.Jumping:
                if (kb.IsKeyDown(Keys.Down))
                {
                    state = State.Diving;
                    heroineTexture = dive;
                    yVelocity = diveVelocity;
                }
                break;
            case State.Ducking:
                if (!kb.IsKeyDown(Keys.Down))
                {
                    state = State.Standing;
                    heroineTexture = stand;
                }
                break;
        }


        if (player.Y >= 430)
        {
            state = State.Standing;
            player.Y = 430;
            yVelocity = 0;
            heroineTexture = stand;
        }

        //if (kb.IsKeyDown(Keys.J) && oldkb.IsKeyUp(Keys.J))
        //{
        //    if (!isJumping && !isDucking)
        //    {
        //        isJumping = true;
        //        yVelocity = jumpVelocity;
        //        heroineTexture = jump;
        //    }
        //}
        //else if(kb.IsKeyDown(Keys.Down))
        //{
        //    if(!isJumping)
        //    {
        //        if(isDiving)
        //        {
        //            yVelocity = diveVelocity;
        //        }
        //        else if(!isJumping && !isDiving)
        //        {
        //            isDucking = true;
        //            heroineTexture = duck;
        //        }
        //    }
        //    else
        //    {
        //        isJumping = false;
        //        heroineTexture = dive;
        //        isDiving = true;
        //    }
        //}
        //else if(!kb.IsKeyDown(Keys.Down))
        //{
        //    if(isDucking)
        //    {
        //        isDucking = false;
        //        heroineTexture = stand;
        //    }
        //}

        oldkb = kb;
        base.Update(gameTime);

1 Ответ

0 голосов
/ 23 марта 2019

обычно: установите точку останова на каждой строке, в которой вы устанавливаете состояние, начните отладку, и вы найдете виновника.

В любом случае.В своем закомментированном коде вы выполнили проверку player.y> = 430 ПЕРЕД обработкой состояний, но теперь вы делаете это позже.

Вы в основном устанавливаете состояние, но не меняете позицию, поэтому, если я предполагаю,правильно, ваш игрок стоял (> = 430), вы устанавливаете состояние и сразу после этого (до фактического изменения player.y) игрок все еще стоит, и вы устанавливаете состояние обратно в положение.

Этопросто догадываясь из своего фрагмента кода, потому что местоположение "if player.y> = 430" фактически вызывается в другое время сейчас

, вам нужно сделать это:

player.Y + = yVelocity;

ПОСЛЕ ЗАКЛЮЧЕНИЯ переключателя / кейса, но ДО

if (player.y> = 430)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...