WPF暂停按键以进行较慢的移动

时间:2014-11-20 15:15:31

标签: c# wpf

在我的游戏中,我的角色正在移动,但我的问题是,如果我一直按下按钮,他会达到超音速并且跑得非常快。这不好。

你有什么建议如何在代码中设置“等待”以模拟更逼真的移动?

我试过System.Threading.Thread.Sleep,但这是一个死胡同。它暂停了整个计划。敌人停了下来。

我在程序中使用DispatcherTemer来移动敌人也许这是解决方案,但我无法弄明白。

我有这个keydown事件:

private void Window_KeyDown_1(object sender, KeyEventArgs e)
{
    if (e.Key == Key.H)
    {
        //Jatek.Player.Hack();
    }
    else if (e.Key == Key.Up)
    {
        jatek.PlayerMovement(MozgasIrany.Up,Field);

    }
    else if (e.Key == Key.Down)
    {
        jatek.PlayerMovement(MozgasIrany.Down,Field);
    }
    else if (e.Key == Key.Left)
    {
        jatek.PlayerMovement(MozgasIrany.Left,Field);
    }
    else if (e.Key == Key.Right)
    {
        jatek.PlayerMovement(MozgasIrany.Right,Field);
    }
}

这就是我移动角色的方式:

public void PlayerMovement(MozgasIrany irany, Canvas Aktual)
{
    switch (irany)
    {
        case MozgasIrany.Up:
            player.Move(0, -10, MozgasIrany.Up);
            break;
        case MozgasIrany.Down:
            player.Move(0, 10, MozgasIrany.Down);
            break;
        case MozgasIrany.Left:
            player.Move(-10, 0, MozgasIrany.Left);
            break;
        case MozgasIrany.Right:
            player.Move(10, 0, MozgasIrany.Right);
            break;
        default:
            break;
    }
}

public void Move(int x, int y, MozgasIrany irany)
{
    switch (irany)
    {
        case MozgasIrany.Up:
            if (alakzatTerulet.Y > 0)
            {

                alakzatTerulet.Y += y;
            }
            else
            {
                alakzatTerulet.Y = 0;
            }
            break;
        case MozgasIrany.Down:
            if (alakzatTerulet.Y < 420)
            {

                alakzatTerulet.Y += y;
            }
            else
            {
                alakzatTerulet.Y = 420;
            }
            break;
        case MozgasIrany.Left:
            if (alakzatTerulet.X > 0)
            {
                alakzatTerulet.X += x;
            }
            else
            {
                alakzatTerulet.X = 0;
            }
            break;
        case MozgasIrany.Right:
            if (alakzatTerulet.X < 610)
            {
                alakzatTerulet.X += x;
            }
            else
            {
                alakzatTerulet.X  = 610;
            }
            break;

    }
}

1 个答案:

答案 0 :(得分:1)

Rx是要走的路

>         var keypress =
>                 Observable.FromEventPattern<KeyEventArgs>(this, "KeyDown")
>                     .Sample(TimeSpan.FromMilliseconds(100))
>                     .Subscribe(
>                         args =>
>                         {
>                             if (args.EventArgs.Key == Key.H)
>                             {
>                                 //Jatek.Player.Hack();
>                             }
>                             else if (args.EventArgs.Key == Key.Up)
>                             {
>                                 jatek.PlayerMovement(MozgasIrany.Up, Field);
> 
>                             }
>                             else if (args.EventArgs.Key == Key.Down)
>                             {
>                                 jatek.PlayerMovement(MozgasIrany.Down, Field);
>                             }
>                             else if (args.EventArgs.Key == Key.Left)
>                             {
>                                 jatek.PlayerMovement(MozgasIrany.Left, Field);
>                             }
>                             else if (args.EventArgs.Key == Key.Right)
>                             {
>                                 jatek.PlayerMovement(MozgasIrany.Right, Field);
>                             }
>                         });

我使用Sample作为驯服按键的方法,这将每100毫秒采取最后一个事件,但你可以使用其他例子看到这里

http://www.introtorx.com/content/v1.0.10621.0/13_TimeShiftedSequences.html