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);
}
}