我该如何检查键盘状态?而不是使用事件处理程序

我正在创建一个Galaga类型的游戏,我将重点放在船的移动上。我有这个代码:我该如何检查键盘状态?而不是使用事件处理程序

public partial class MainWindow : Window 

{

public MainWindow()

{

InitializeComponent();

}

private void Window_KeyDown(object sender, KeyEventArgs e)

{

if (e.Key == Key.Left)

{

moveLeft();

}

else if (e.Key == Key.Right)

{

moveRight();

}

else if (e.Key == Key.Space)

{

bullet();

}

}

private async void bullet()

{

Line bullet = new Line();

bullet.X1 = Canvas.GetLeft(testMovement) + (testMovement.Width/2);

bullet.Y1 = Canvas.GetTop(testMovement);

bullet.X2 = bullet.X1;

bullet.Y2 = bullet.Y1 + 3;

bullet.Stroke = new SolidColorBrush(Color.FromRgb(255,255,255));

bullet.StrokeThickness = 3;

horizontalMove.Children.Add(bullet);

for (int i = 0; i < 50; i++)

{

await Task.Delay(20);

shoot(bullet);

}

horizontalMove.Children.Remove(bullet);

}

private void shoot(Line bullet)

{

bullet.Y2 = bullet.Y1;

bullet.Y1 -= 5;

}

int x = 0;

private void moveRight()

{

if (x>=0 && x <= 370)

{

if(x == 370)

{

x -= 10;

}

Canvas.SetLeft(testMovement, x += 10);

}

else

{

if (x < 0)

x = 0;

else

x = 370;

}

label.Content = x ;

}

private void moveLeft()

{

if (x>=0 && x <= 370)

{

if (x == 0)

{

x += 10;

}

Canvas.SetLeft(testMovement, x -= 10);

}

else

{

if (x < 0)

x = 0;

else

x = 370;

}

label.Content = x;

}

private void Window_KeyUp(object sender, KeyEventArgs e) {}

}

这个代码的问题是,当我改变方向时,它有一定的延迟,动画不是那么平滑。

因此,如果我不想使用事件处理程序来不断检查键盘的状态(例如,是否单击左键,右键或空格),应如何继续?

回答:

使用您的代码,您在等待移动播放器之前发生的事件。这是游戏开发中常被误解的一个方面。 SDL库的手册有a great explaination:

键盘事件仅发生在被 未按到按下按键的状态变化,反之亦然。

int alien_x=0, alien_y=0; 

/* Main game loop */

/* Check for events */

while(SDL_PollEvent(&event)){

switch(event.type){

/* Look for a keypress */

case SDL_KEYDOWN:

/* Check the SDLKey values and move change the coords */

switch(event.key.keysym.sym){

case SDLK_LEFT:

alien_x -= 1;

break;

case SDLK_RIGHT:

alien_x += 1;

break;

case SDLK_UP:

alien_y -= 1;

break;

case SDLK_DOWN:

alien_y += 1;

break;

default:

break;

}

}

}

}

乍一看,你可能会认为这是一个完全合理的一块为任务 代码,但事实并非如此。就像我说的键盘事件只有当一个按键发生改变时才会出现 状态,所以用户将不得不按下和 释放左侧光标键100次,将外部100个像素移动到 的左侧。为了解决这个问题,我们不能使用事件来改变外星人的位置,我们使用事件来设置标志,然后在代码的单独部分中使用 来移动外星人。 事情是这样的:

int alien_x=0, alien_y=0; 

int alien_xvel=0, alien_yvel=0;

/* Main game loop */

/* Check for events */

while(SDL_PollEvent(&event)){

switch(event.type){

/* Look for a keypress */

case SDL_KEYDOWN:

/* Check the SDLKey values and move change the coords */

switch(event.key.keysym.sym){

case SDLK_LEFT:

alien_xvel = -1;

break;

case SDLK_RIGHT:

alien_xvel = 1;

break;

case SDLK_UP:

alien_yvel = -1;

break;

case SDLK_DOWN:

alien_yvel = 1;

break;

default:

break;

}

break;

/* We must also use the SDL_KEYUP events to zero the x */

/* and y velocity variables. But we must also be */

/* careful not to zero the velocities when we shouldn't*/

case SDL_KEYUP:

switch(event.key.keysym.sym){

case SDLK_LEFT:

/* We check to make sure the alien is moving */

/* to the left. If it is then we zero the */

/* velocity. If the alien is moving to the */

/* right then the right key is still press */

/* so we don't tocuh the velocity */

if(alien_xvel < 0)

alien_xvel = 0;

break;

case SDLK_RIGHT:

if(alien_xvel > 0)

alien_xvel = 0;

break;

case SDLK_UP:

if(alien_yvel < 0)

alien_yvel = 0;

break;

case SDLK_DOWN:

if(alien_yvel > 0)

alien_yvel = 0;

break;

default:

break;

}

break;

default:

break;

}

}

/* Update the alien position */

alien_x += alien_xvel;

alien_y += alien_yvel;

以上是 我该如何检查键盘状态?而不是使用事件处理程序 的全部内容, 来源链接: utcz.com/qa/258399.html

回到顶部