2017-07-27 4 views
0

Ich bin mein eigenes Eingabesystem in monogame Programm zu machen, und jetzt habe ich ein Problem mit, wenn hier statments:C# - nur zuerst, wenn wird ausgeführt (XNA/Keypress)

public static void Input() 
    { 
     if (IsKeyPressed(Keys.Space)) 
     { 
      Cursor.X += 25; 
     } 

     if (IsKeyPressed(Keys.Back)) 
     { 
      Words.Last().RemoveLetter(); 
      Cursor.X -= 25; 
     } 

     if (IsKeyPressed(Keys.A)) 
     { 
      Words.Last().AddLetter(new Letter(Letters.A, Cursor)); 
      Cursor.X += 25; 
     } 
    } 

static bool IsKeyPressed(Keys key) 
    { 
     keyState = Keyboard.GetState(); 

     if (keyState.IsKeyDown(key) && prevKeyState.IsKeyUp(key)) 
     { 
      prevKeyState = keyState; 
      return true; 
     } 
     else 
     { 
      prevKeyState = keyState; 
      return false; 
     } 
    } 

Okay, so in meinem Methode Input Ich überprüfe auf Tastendrücke, und das Ergebnis im Programm ist das, was auch immer ich in die erste IF-Anweisung einlege, dieser Schlüssel wird funktionieren. Wenn ich also 'A' ändere, wo der 'Space' jetzt ist, würde A funktionieren und Space würde nicht ' t ...

Warum sind andere Wenn immer falsch?

EDIT:

so eigentlich Okay, wenn meine isKeyPressed() -Methode wie folgt aussieht (ohne prevKeyState Variable):

static bool IsKeyPressed(Keys key) 
    { 
     keyState = Keyboard.GetState(); 

     if (keyState.IsKeyDown(key)) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

dann funktioniert es:/aber ich brauche, dass preKeyState variabel, da Ich möchte, egal wie lange ich zum Beispiel halte, einen Schlüssel, um nur einen Buchstaben zu drucken, bis ich diesen Schlüssel loslasse:/

+2

Nicht sicher, ob das irgendetwas repariert, aber Sie wollen wahrscheinlich, dass sich diese Schlüssel gegenseitig ausschließen, also wäre es das Beste Verwandle diese 'if's in' else if's. – stybl

+0

versuchte es, änderte nichts –

+0

Behalten Sie es so. Es löst andere Probleme, die Sie noch nicht erkannt haben (zum Beispiel, wenn jemand 'A' * und *' Space' gleichzeitig drückt) – stybl

Antwort

0

Hatte ein ähnliches Problem. Es wurde gelöst, indem der neue und alte KeyboardState an die Funktion übergeben wurde. Beendet mit so etwas, das gut funktioniert.

public void HandleKeyStroke(KeyboardState ks, KeyboardState oldks) 
{ 
    if (ks.IsKeyDown(GameplayButtons.ACTIONBAR_0) && oldks.IsKeyUp(GameplayButtons.ACTIONBAR_0)) 
     UIManager.actionToBeTriggered("actionbar_0"); 
    if (ks.IsKeyDown(GameplayButtons.ACTIONBAR_1) && oldks.IsKeyUp(GameplayButtons.ACTIONBAR_1)) 
     UIManager.actionToBeTriggered("actionbar_1"); 
    if (ks.IsKeyDown(GameplayButtons.ACTIONBAR_2) && oldks.IsKeyUp(GameplayButtons.ACTIONBAR_2)) 
     UIManager.actionToBeTriggered("actionbar_2"); 
    if (ks.IsKeyDown(GameplayButtons.ACTIONBAR_3) && oldks.IsKeyUp(GameplayButtons.ACTIONBAR_3)) 
     UIManager.actionToBeTriggered("actionbar_3"); 
    if (ks.IsKeyDown(GameplayButtons.CHARACTER) && oldks.IsKeyUp(GameplayButtons.CHARACTER)) 
     UIManager.ToggleWindowById("button_Character"); 
} 

Es gibt wahrscheinlich eine sauberere Lösung, vor allem, wenn Sie mehr Tasten zu bedienen haben.

0

Okay, so ist es nicht schwer war, dies zu beheben ich einfach nicht daran denken, aber Hetting KeyboardStates in Eingabemethode statt isKeyPressed Bool Methode behebt alles:

static bool IsKeyPressed(Keys key) 
    { 
     if (keyState.IsKeyDown(key) && prevKeyState.IsKeyUp(key)) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

    public static void Input() 
    { 
     keyState = Keyboard.GetState(); 

     if (IsKeyPressed(Keys.Space)) 
     { 
      Cursor.X += 25; 
     } 

     else if (IsKeyPressed(Keys.Back)) 
     { 
      Words.Last().RemoveLetter(); 
      Cursor.X -= 25; 
     } 

     else if (IsKeyPressed(Keys.A)) 
     { 
      Words.Last().AddLetter(new Letter(Letters.A, Cursor)); 
      Cursor.X += 25; 
     } 

     prevKeyState = keyState; 
    } 

Ich bin nicht ruhig Sicher, welchen Unterschied macht es, wenn jemand im Detail erklären kann, dass wäre fantastisch

PS. Ich kann niemanden wegen meines schlechten Rufs aufrütteln, aber ich danke allen, dass sie Ihre Gedanken geteilt haben.

Verwandte Themen