Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C语言处理按键#_C#_Keypress_Keydown - Fatal编程技术网

C# 用C语言处理按键#

C# 用C语言处理按键#,c#,keypress,keydown,C#,Keypress,Keydown,我正在制作一个游戏,我有一个名为MainCharacter的类,它首先初始化主要角色(在一个pictureBox中),然后我有一个按键事件来处理移动。在那个事件中,如果我按下箭头键,我能够处理角色的移动,我甚至做了一个基于计时器的移动动画,使它看起来更平滑 但是,KeyDown事件的问题是,每当我按下该键时,它都会触发,这意味着如果我按住箭头键,角色将继续朝一个方向移动,则该事件会重复触发,这意味着角色会像鱼雷一样在屏幕上运行,因为事件是以计算机能够处理的速度触发的 这就是为什么我决定使用按键事

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

但是,KeyDown事件的问题是,每当我按下该键时,它都会触发,这意味着如果我按住箭头键,角色将继续朝一个方向移动,则该事件会重复触发,这意味着角色会像鱼雷一样在屏幕上运行,因为事件是以计算机能够处理的速度触发的

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


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

MainCharacter
类上创建一个
direction
变量

左键的
OnKeyDown
将方向设置为-1,右键的
OnKeyDown
将方向设置为1

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

然后,您可以根据
方向
设置的值移动角色,而不是每次物理按键时移动角色

非常伪代码: //本例仅涉及左/右移动

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

这个.position.X+=(这个方向*(这个速度+10))

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