【问题标题】:Processing key presses in C#在 C# 中处理按键
【发布时间】:2010-11-23 11:44:18
【问题描述】:

我正在制作一个游戏,我有一个名为 MainCharacter 的类,它首先初始化主角(在图片框中),然后我有一个 KeyDown 事件来处理移动。在那个事件中,如果我按下箭头键,我就能够处理角色的移动,我什至做了一个基于计时器的移动动画,让它看起来更流畅。

然而,KeyDown 事件的问题是每次我按下键时它都会触发,这意味着如果我按住箭头键以使角色继续向一个方向移动,则该事件会重复触发,这意味着角色像鱼雷一样在屏幕上飞来飞去,因为事件的触发速度与计算机可以处理的一样快。

这就是我决定使用 KeyPress 事件的原因,这样当我按住键时,角色会以稳定的速度向指定方向移动。但是,KeyPress 事件无法处理箭头键,这就是为什么我必须在主窗体中重写 ProcessDialogKey 方法。但是如果我在主窗体中覆盖它,那么每次我按下箭头键时都会触发该事件,即使我不在游戏中,但例如在主菜单或其他任何地方。此外,我认为那将是一个不好的做法,如果我试图通过跨类来编程东西这么多。

那么,我有没有其他方法可以在不影响其他类的情况下处理 inside MainCharacter 类的箭头上的 KeyPress 事件?或者我是否有机会继续使用我已经工作的 KeyDown 事件,并使其在按住键时不会重复触发?请记住,我想要实现的是当我按住我的键时我的角色可以流畅地移动。到目前为止,如果我只按一次它就可以正常工作,但通常人们在朝一个方向行走时会按住键。

【问题讨论】:

    标签: c# keypress keydown


    【解决方案1】:

    在您的 MainCharacter 类上创建一个 direction 变量。

    左键OnKeyDown,方向为-1,右键OnKeyDown,方向为1。

    然后左右键的OnKeyUp,设置方向为0。

    然后你可以根据direction设置的值移动你的角色,而不是每次按下物理键时移动他。

    非常伪代码: // 这个例子只关心左右移动。

    void Update(){
        // Update position due to current key state.
        this.position.X += this.direction * this.speed;
    }
    
    void OnKeyDown(KeyEventArgs e) {
        if(e.Key == Key.Left) {
            player.direction = -1;
        }
        else if(e.Key == Key.Right) {
            player.direction = 1;
        }
    }
    
    void OnKeyUp(KeyEventArgs e) {
        if(e.Key == Key.Left || e.Key == Key.Right) {
            player.direction = 0;
        }
    }
    

    【讨论】:

    • 但是 Update 方法将处于无限循环中并且一直无效,对吗?我该怎么做才能一直根据方向参数改变位置?
    • 我不知道你说的无限循环是什么意思……我以为所有的更新函数都在无限循环中?
    • 是的,我现在已经完成了,当我按下键时角色会移动,当我停止按下键时会停止。但是,因为我有一个移动动画,所以角色会移动每 30 毫秒左右一个像素一个像素,我想要做到这一点,如果我只是短暂地点击键,角色将向侧面移动至少 15 个像素,而不仅仅是 1 个像素,因为这甚至不明显。我试图加入一个 if 子句,以防事件之间的时间小于 120 毫秒,但我并没有真正做到正确..
    【解决方案2】:

    this.position.X += (this.direction * (this.speed+10));

    【讨论】:

      猜你喜欢
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 2017-03-14
      • 2015-08-08
      • 2012-02-15
      相关资源
      最近更新 更多