在C#中处理按键

时间:2010-11-23 11:44:19

标签: c# keypress keydown

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

然而,KeyDown事件的问题在于每次按下键时它都会触发,这意味着如果我按住箭头键使角色继续向一个方向移动,则会反复触发事件,这意味着角色像鱼雷一样在屏幕上运行,因为事件的发射速度和计算机一样快。

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

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

2 个答案:

答案 0 :(得分:0)

direction班级上创建MainCharacter变量。

左键的

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

答案 1 :(得分:0)

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