拿着箭头键为字符运动C#.Net ISSUES

时间:2013-11-06 22:32:43

标签: c# .net wpf animation keypress

所以简而言之,我只是想在WPF应用程序中围绕Canvas对象移动一个矩形。我这里有我的KeyDown事件功能。问题是,当我长按一个键时,它会反复快速启动这个功能并拧紧我的矩形位置代码。

我背后的理论/逻辑:   因为当你按住键盘上的按钮时它没有平稳地移动(在浏览器的滚动条上测试,它开始,暂停,然后继续下去),我希望它启动一个窗体计时器来移动对象UI。然后当KeyUp事件发生时,计时器STOPS。

public void Window_KeyDown(object sender, KeyEventArgs e)
{
    string msg;
    string keystr = e.Key.ToString();
    Key keyval = e.Key;


    switch (keystr)
    {
        case "Down":
            Console.WriteLine("Case 1");
            Display.Content = "Down";
            foreach (Character character in creatures)
            {
                //character.buttondown = true;
                character.Position("Down");
            }
            break;
        case "Up":
            Console.WriteLine("Case 2");
            Display.Content = "Up";
            foreach (Character character in creatures)
            {
                //character.buttondown = true;
                character.Position("Up");
            }
            break;
        case "Left":
            Console.WriteLine("Case 3");
            Display.Content = "Left";
            foreach (Character character in creatures)
            {
                //character.buttondown = true;
                character.Position("Left");
            }
            break;
        case "Right":
            Display.Content = "Right";
            foreach (Character character in creatures)
            {

                //character.buttondown = true;
                character.Position("Right");
            }
            break;
    }
}

public void Window_KeyUp(object sender, KeyEventArgs e)
{
    Display.Content = "No key is pressed.";
    foreach (Character character in creatures)
    {
        if (e.Key == Key.Right)
        {
            character.StopIt();
        }
        if (e.Key == Key.Left)
        {
            character.StopIt();
        }
        if (e.Key == Key.Up)
        {
            character.StopIt();
        }
        if (e.Key == Key.Down)
        {
            character.StopIt();
        }

    }
}

仅供参考,如果您需要我的矩形类代码,我将发布如果按下右箭头键会发生什么:

  1. 名称为

    public void Position(String Direction)
    {
    
        if (Direction == "Right")
        {
            tmr = new System.Windows.Forms.Timer();
            tmr.Interval = this.waitTime;
            tmr.Tick += new EventHandler(GoRight);
            tmr.Start();
        }
     }
    
  2. 调用GoRight:

    public void GoRight(object sender, System.EventArgs e)
    {
        if (x < Background.ActualWidth - CharacterWidth)
        {
            if (goRight)
            {
                x += incrementSize;
                CharacterImage.SetValue(Canvas.LeftProperty, x);
    
            }
            if (x > Background.ActualWidth - CharacterWidth)
            {
                goRight = false;
                tmr.Stop();
            }
        }
    
    }
    
  3. 最后,在KeyUp事件中调用StopIt:

    public void StopIt()
    {
        tmr.Stop();
        goRight = true;
        goLeft = true;
        goUp = true;
        goDown = true;
    }
    

    我现在只学习了几个月的c#所以我想尽可能保持相对简单,只使用.net。

    任何帮助都将不胜感激!!

    编辑:: 我的解决方案:

    我只是在我的开关盒周围做了一个while(flag)循环。然后我在案例中设置了flag = false。按下Key UP时,我再次将flag设置为true。 YAY

2 个答案:

答案 0 :(得分:0)

我不太了解WPF告诉你发生了什么,尽管你可能对按钮/暂停的事情是正确的。这取决于WPF如何处理按键。我的猜测是,它与大多数Microsoft形式的工作方式相同;它有一个停顿,可以防止你一次输入多个字符。可能有办法解决这个问题,但我不确定。

我要说的是你应该使用专为游戏设计的东西。当我第一次尝试创建游戏时,我这样做的风格与你正在做的类似,但它不起作用。您使用的是专为办公软件设计的,无法访问您所需的内容;至少不是没有战斗和变通办法。正如Alex Beisley对XNA所建议的那样。不幸的是,这是一种死语,但它最近才消失。它使用的是c#,由微软制造,并且功能强大,可以在不打击你的情况下做你想做的事情,并且一旦掌握了它就很容易使用。看到它被杀掉是一种耻辱。

如果你想折磨自己,那么我建议走我一直在尝试的路线,学习C ++和DirectX。这并不容易,你需要耐心等待并经历多个教程(没有一个教程似乎可以很好地解释任何事情)。 DirectX和C ++不会很快出现,所以如果你想要用一种长期的语言,它们是一个安全的选择。

答案 1 :(得分:0)

我假设您希望角色在初始KeyDown事件上移动。然后,在获得KeyUp事件之前,您希望忽略任何后续的KeyDown事件。

因此,您可以通过检查e.IsRepeat例如

来忽略后续的KeyDown事件
public void Window_KeyDown(object sender, KeyEventArgs e)
{
    if (e.IsRepeat) return;

    // rest of your code...

顺便说一句,滚动应用程序时观察到的非平滑移动是由键盘重复延迟引起的。您可以在键盘属性中设置此项,或者通过http://msdn.microsoft.com/en-us/library/system.windows.systemparameters.keyboarddelay.aspx

进行设置