Keyboard.GetState().IskeyDown() не работи според очакванията

Ето метода за актуализиране на моя клас Player:

timer += (float)gameTime.ElapsedGameTime.TotalMilliseconds;
KeyboardState state = Keyboard.GetState();
if (state.IsKeyDown(Keys.Up)) {
    if (currentFrame < 7) currentFrame = 7;
    if (timer >= delay) {
        if (currentFrame < 13) {
            currentFrame++;
        }
        else if (currentFrame == 13) {
            currentFrame = 7;
        }
        timer = 0;
    }
}
else {
    if (currentFrame > 7) currentFrame = 1;
    if (timer >= delay) {
        if (currentFrame < 6) {
            currentFrame++;
        }
        else if (currentFrame == 6) {
            currentFrame = 1;
        }
        timer = 0;
    }
}
sourceRect.X = currentFrame * 48 - 48; //I subtract 48 here to make the first frame 1 not 0.

А ето и метода на теглене:

spriteBatch.Draw(texture, position, sourceRect, Color.White);

Това, което се опитвам да направя, е, че когато клавишът за нагоре е надолу, се показва анимацията от кадър 7 до 13 (от лист със спрайтове). Когато клавишът за нагоре не е надолу, се рисува анимация от кадър 1 до 6.
Проблем: Когато продължавам да натискам клавиша за нагоре, той работи добре, но когато натисна клавиша за нагоре само веднъж , анимацията засяда на 7-ия кадър.


person wingerse    schedule 14.02.2015    source източник
comment
Стойността на променливата timer е borken, тя винаги има голяма стойност. Винаги по-голямо от закъснение.   -  person Hans Passant    schedule 14.02.2015
comment
@HansPassant Защо е така? Задавам стойността на таймера на 0, ако е по-голяма от забавянето   -  person wingerse    schedule 14.02.2015
comment
0 е времето, когато потребителят е стартирал играта, а не когато е натиснал клавиша.   -  person Hans Passant    schedule 14.02.2015
comment
Мислех, че е времето от последния кадър.   -  person wingerse    schedule 14.02.2015


Отговори (2)


if (currentFrame > 7) currentFrame = 1;

опитайте да промените на

if (currentFrame >= 7) currentFrame = 1;
person Community    schedule 14.02.2015

За да уточним отговора от @Silveor: Първият път през цикъла, нека приемем, че currentFrame е 1 и timer е по-малко от delay.

  1. Натиснахте клавиша нагоре, Keys.Up е клавишът надолу.
  2. currentFrame е по-малко от 7 (е 1), така че го настройте на 7.
  3. timer е по-малко от delay, така че пропуснете кода, който увеличава currentFrame
  4. Следващият път чрез този код: Натиснахте само клавиша нагоре (не го задържахте), така че Keys.Up не е клавишът надолу.
  5. currentFrame не е по-малко от 7 (то е 7), така че не го задавайте на 1
  6. Да приемем, че timer е по-голямо от delay. Все пак currentFrame няма да бъде увеличено или зададено на 1, защото currentFrame не е по-малко от 6 или равно на 6
  7. Няма код за промяна на currentFrame с нещо друго, така че се забива на 7-ия кадър.

Така че, ако проверите за стойност 7 в стъпка (5) по-горе, можете да я зададете на 1. Ето защо отговорът на @Silveor е правилен. :)

person ama1111    schedule 14.02.2015
comment
Можете ли да обясните 3? Ако таймерът е по-малък от забавянето, защо пропускате тази част? трябва да се изпълни вместо това. - person wingerse; 14.02.2015
comment
Разбира се: Да речем, че натиснете и отпуснете клавиша нагоре много бързо. Изминалото време (т.е. timer) ще бъде много малко число. В пътя на кода, който очертах по-горе, приемам, че стойността на delay е по-голяма от тази малка стойност на timer. - person ama1111; 14.02.2015
comment
таймерът не е времето, изминало от натискането на клавиша нагоре. Това е времето, изминало от последния кадър. P.S. Можете ли да проверите този въпрос? Изпитвам трудности с него:stackoverflow.com/questions/28517999 /cannot-load-music-file - person wingerse; 14.02.2015
comment
Добре, мога да кажа това, без да правя никакви претенции относно това, което timer измерва: може да изпитате симптома във вашия въпрос (заседнал на 7-ия кадър) в сценария, който очертах по-горе. Вероятно ще ви помогне да го визуализирате, ако добавите Debug.WriteLine() извиквания, за да регистрирате стойностите на timer, delay и currentFrame в различни части на този метод. - person ama1111; 14.02.2015