2013-12-12 3 views
0

Здесь мой метод получить состояние клавиатуры и изменить текстуру, на основе которой нажата клавиша.Изменить текстуру на ключе вниз

private void CheckKeyboardAndUpdateMovement() 
{ 
    KeyboardState keyboardState = Keyboard.GetState(); 
    if (keyboardState.IsKeyUp(Keys.Left)) { ChangeTexture(1); } 
    if (keyboardState.IsKeyUp(Keys.Right)) { ChangeTexture(2); } 
    if (keyboardState.IsKeyDown(Keys.Left)) 
    { 
     Movement -= Vector2.UnitX; 
     ChangeTexture(3); 
    } 
    if (keyboardState.IsKeyDown(Keys.Right)) 
    { 
     Movement += Vector2.UnitX; 
     ChangeTexture(4); 
    } 
    if ((keyboardState.IsKeyDown(Keys.Space) || keyboardState.IsKeyDown(Keys.Up)) && IsOnFirmGround()) 
    { 
     Movement = -Vector2.UnitY * JumpHeight; 
    } 
} 

Это работает, если направление нажимаются, но не делает свою собственную работу, когда не нажата ничего (просто потому, что оба IsKeyUp истинны). Только порядок дел предотвращает показ статической текстуры при перемещении спрайта ... Вопрос в том, как я могу решить проблему? У меня уже есть идея, но мне она совсем не нравится ...

+0

Что это за четыре текстуры? И, что более важно, что должна делать ваша игра, когда ничего не нажимается? Я не понимаю. – pinckerman

+0

Это текстура для (1) «спрайта стоять неподвижно слева», (2) «спрайт стоять вправо», (3) «спрайт идет влево», (4) «спрайт идет вправо» ». Когда ничего не нажимается, оно должно стоять неподвижно, но в последнем направлении. – SubjectDelta

+0

Yap, определенно лучше, и ваше решение не так уж плохо. – pinckerman

ответ

0

Если вы хотите другое решение, но по-прежнему похоже на ваше.

enum Direction { Left = 1, Right = 2} 
Direction dir = Direction.Left; //or whatever 

private void CheckKeyboardAndUpdateMovement() 
{ 
    KeyboardState keyboardState = Keyboard.GetState(); 

    ChangeTexture((int)dir); 
    if (keyboardState.IsKeyDown(Keys.Left)) 
    { 
     Movement -= Vector2.UnitX; 
     ChangeTexture(3); 
     dir = Direction.Left; 
    } 
    if (keyboardState.IsKeyDown(Keys.Right)) 
    { 
     Movement += Vector2.UnitX; 
     ChangeTexture(4); 
     dir = Direction.Right; 
    } 
    if ((keyboardState.IsKeyDown(Keys.Space) || keyboardState.IsKeyDown(Keys.Up)) && IsOnFirmGround()) 
    { 
     Movement = -Vector2.UnitY * JumpHeight; 
    } 
} 

Вы можете сделать что-то подобное с ходячим спрайтом.

+0

Мне это нравится больше, чем мое, спасибо ... – SubjectDelta

0

Худшее решение, о котором я думал, это сохранение направления спрайтов при нажатии последнего ключа и проверка следующего обновления , но это будет бардак еще ключи и текстуры я буду контролировать ...

// Having a "bool leftDirectionOnLastMovement;" (worst name ever seen) 
private void CheckKeyboardAndUpdateMovement() 
{ 
    KeyboardState keyboardState = Keyboard.GetState(); 
    if (keyboardState.IsKeyUp(Keys.Left) && leftDirectionOnLastMovement) 
     ChangeTexture(1); 
    if (keyboardState.IsKeyUp(Keys.Right) && !leftDirectionOnLastMovement) 
     ChangeTexture(2); 
    if (keyboardState.IsKeyDown(Keys.Left)) 
    { 
     Movement -= Vector2.UnitX; 
     ChangeTexture(3); 
     leftDirectionOnLastMovement = true; 
    } 
    } 
    if (keyboardState.IsKeyDown(Keys.Right)) 
    { 
     Movement += Vector2.UnitX; 
     ChangeTexture(4); 
     leftDirectionOnLastMovement = false; 
    } 
    } 
    if ((keyboardState.IsKeyDown(Keys.Space) || keyboardState.IsKeyDown(Keys.Up)) && IsOnFirmGround()) 
    { 
     Movement = -Vector2.UnitY * JumpHeight; 
    } 
} 

Я действительно надеюсь, что кто-то предложит мне лучший способ сделать это ...

Смежные вопросы