2017-02-04 8 views
1

Ich versuche, ein kleines Spiel in C# mit wpf zu machen. Ich habe mein Rechteck bewegt, das Problem, das ich versuche zu beheben, ist, wenn Sie eine andere Taste drücken, die den ursprünglichen Schlüssel hält, dann einen von ihnen freigibt, wird es in die Richtung gehen, die gehalten wird. Der Code, den ich habe, funktioniert, aber wenn einmal ausgeführt, wenn eine Taste freigegeben wird, gibt es eine Verzögerung, dann wird das Rechteck weiter bewegt.C# WPF Tastatur Bewegung für Spiel

enum Direction { left, right, up, down, none}; 
    Direction _direction = Direction.none; 
    bool _directionIsPressed = false; 
    bool _directionIsReleased = false; 
    double x = 0; 
    double y = 0; 

    public MainWindow() 
    { 
     InitializeComponent(); 



     DispatcherTimer timer = new DispatcherTimer(); 
     timer.Tick += new EventHandler(MovePlayer); 
     timer.Start(); 

     this.KeyDown += new KeyEventHandler(OnButtonKeyDown); 
     this.KeyUp += new KeyEventHandler(OnButtonKeyRelease); 

    } 

    private void MovePlayer(object sender, EventArgs e) 
    { 
     switch (_direction) 
     { 
      case Direction.down: 
       y += .05; 
       Canvas.SetTop(Player, y); 
       break; 
      case Direction.up: 
       y -= .05; 
       Canvas.SetTop(Player, y); 
       break; 
      case Direction.left: 
       x -= .05; 
       Canvas.SetLeft(Player, x); 
       break; 
      case Direction.right: 
       x += .05; 
       Canvas.SetLeft(Player, x); 
       break; 
     } 
    } 

    private void OnButtonKeyDown(object sender, KeyEventArgs e) 
    { 
     switch (e.Key) 
     { 
      case Key.Down: 
       _direction = Direction.down; 
       _directionIsPressed = true; 
       break; 
      case Key.Up: 
       _direction = Direction.up; 
       _directionIsPressed = true; 
       break; 
      case Key.Left: 
       _direction = Direction.left; 
       _directionIsPressed = true; 
       break; 
      case Key.Right: 
       _direction = Direction.right; 
       _directionIsPressed = true; 
       break; 
      default: 
       _direction = Direction.none; 
       break; 
     } 
    } 

    //When a key is released it will set the direction to none then 
    //reset the direction but there is about a half second delay in 
    //setting the direction again 
    private void OnButtonKeyRelease(Object sender, KeyEventArgs e) 
    { 
     _direction = Direction.none; 
     this.KeyDown += new KeyEventHandler(OnButtonKeyDown); 
    } 

Edit: Wenn jemand will glatte Tastatur Bewegung in C# wpf hier verwendet, ist, wie ich es behoben. Danke Stefan für die Hilfe.

 public MainWindow() 
    { 
     InitializeComponent(); 
     DispatcherTimer timer = new DispatcherTimer(); 
     timer.Tick += new EventHandler(MovePlayer); 
     timer.Start(); 
    } 

    private void MovePlayer(object sender, EventArgs e) 
    { 
     if(Keyboard.IsKeyDown(Key.Left)) 
     { 
      x -= .05; 
      Canvas.SetLeft(Player, x); 
     } 
     if(Keyboard.IsKeyDown(Key.Up)) 
     { 
      y -= .05; 
      Canvas.SetTop(Player, y); 
     } 
     if(Keyboard.IsKeyDown(Key.Down)) 
     { 
      y += .05; 
      Canvas.SetTop(Player, y); 
     } 
     if(Keyboard.IsKeyDown(Key.Right)) 
     { 
      x += .05; 
      Canvas.SetLeft(Player, x); 
     } 
    } 

Antwort

1

, wenn Sie Bewegung zu kombinieren, ermöglichen möchten, zum Beispiel bis + zusammen dann links i können Sie es nur mit dem Timer und Keyboard.IsKeyDown (key) Verifikation

private void MovePlayer(object sender, EventArgs e) 
{ 
    if (Keyboard.IsKeyDown(Key.Down)) 
    { 
     y += .05; 
     Canvas.SetTop(Player, y); 
    } 
    if(Keyboard.IsKeyDown(Key.Up)) 
    { 
     y -= .05; 
     Canvas.SetTop(Player, y); 
    } 
    if (Keyboard.IsKeyDown(Key.Left)) 
    { 
     x -= .05; 
     Canvas.SetLeft(Player, x); 
    } 
    if (Keyboard.IsKeyDown(Key.Right)) 
    { 
     x += .05; 
     Canvas.SetLeft(Player, x); 
    } 
} 

anderen Fall Wenn die Bewegung zu diesem Zeitpunkt nur in einer einfachen Richtung ausgeführt werden kann, können Sie die Anweisungen in Ihrer KeyReleased-Routine überprüfen.

private void OnButtonKeyRelease(Object sender, KeyEventArgs e) 
{ 
    if (Keyboard.IsKeyDown(Key.Down)) 
     _direction = Direction.down; 
    else if(Keyboard.IsKeyDown(Key.Up)) 
     _direction = Direction.up; 
    else if (Keyboard.IsKeyDown(Key.Left)) 
     _direction = Direction.left; 
    else if (Keyboard.IsKeyDown(Key.Right)) 
     _direction = Direction.right; 
    else 
     _direction = Direction.none; 
} 

Aber wenn Sie mehr als 2 Bewegungstasten zur gleichen Zeit Sie es in einigen Array speichern drücken müssen und überprüfen Hexe später wurde gedrückt, und stellen Sie die Bewegung von dieser Taste abhing.

1

Anstatt zwei Schaltanweisungen in verschiedenen Funktionen zu verwenden, versuchen Sie, sie in eine zusammenzufassen. Der Grund für die Verzögerung könnte der Overhead sein, der erforderlich ist, um von einer Funktion zu einer anderen zu springen.

Anstatt MovePlayer() separat aufzurufen, können Sie versuchen, den Player zu bewegen, wenn Sie die Taste drücken.

private void OnButtonKeyDown(object sender, KeyEventArgs e) 
{ 
    switch (e.Key) 
    { 
     case Key.Down: 
      y += .05; 
      Canvas.SetTop(Player, y); 
      break; 
     case Key.Up: 
      y -= .05; 
      Canvas.SetTop(Player, y); 
      break; 
     case Key.Left: 
      x -= .05; 
      Canvas.SetLeft(Player, x); 
      break; 
     case Key.Right: 
      x += .05; 
      Canvas.SetLeft(Player, x); 
      break; 
     default: 
      _direction = Direction.none; 
      break; 
    } 
}