在我的游戏中,我的角色正在移动,但我的问题是,如果我一直按下按钮,他会达到超音速并且跑得非常快。这不好。
你有什么建议如何在代码中设置“等待”以模拟更逼真的移动?
我试过System.Threading.Thread.Sleep,但这是一个死胡同。它暂停了整个计划。敌人停了下来。
我在程序中使用DispatcherTemer来移动敌人也许这是解决方案,但我无法弄明白。
我有这个keydown事件:
private void Window_KeyDown_1(object sender, KeyEventArgs e)
{
if (e.Key == Key.H)
{
//Jatek.Player.Hack();
}
else if (e.Key == Key.Up)
{
jatek.PlayerMovement(MozgasIrany.Up,Field);
}
else if (e.Key == Key.Down)
{
jatek.PlayerMovement(MozgasIrany.Down,Field);
}
else if (e.Key == Key.Left)
{
jatek.PlayerMovement(MozgasIrany.Left,Field);
}
else if (e.Key == Key.Right)
{
jatek.PlayerMovement(MozgasIrany.Right,Field);
}
}
这就是我移动角色的方式:
public void PlayerMovement(MozgasIrany irany, Canvas Aktual)
{
switch (irany)
{
case MozgasIrany.Up:
player.Move(0, -10, MozgasIrany.Up);
break;
case MozgasIrany.Down:
player.Move(0, 10, MozgasIrany.Down);
break;
case MozgasIrany.Left:
player.Move(-10, 0, MozgasIrany.Left);
break;
case MozgasIrany.Right:
player.Move(10, 0, MozgasIrany.Right);
break;
default:
break;
}
}
public void Move(int x, int y, MozgasIrany irany)
{
switch (irany)
{
case MozgasIrany.Up:
if (alakzatTerulet.Y > 0)
{
alakzatTerulet.Y += y;
}
else
{
alakzatTerulet.Y = 0;
}
break;
case MozgasIrany.Down:
if (alakzatTerulet.Y < 420)
{
alakzatTerulet.Y += y;
}
else
{
alakzatTerulet.Y = 420;
}
break;
case MozgasIrany.Left:
if (alakzatTerulet.X > 0)
{
alakzatTerulet.X += x;
}
else
{
alakzatTerulet.X = 0;
}
break;
case MozgasIrany.Right:
if (alakzatTerulet.X < 610)
{
alakzatTerulet.X += x;
}
else
{
alakzatTerulet.X = 610;
}
break;
}
}
答案 0 :(得分:1)
Rx是要走的路
> var keypress =
> Observable.FromEventPattern<KeyEventArgs>(this, "KeyDown")
> .Sample(TimeSpan.FromMilliseconds(100))
> .Subscribe(
> args =>
> {
> if (args.EventArgs.Key == Key.H)
> {
> //Jatek.Player.Hack();
> }
> else if (args.EventArgs.Key == Key.Up)
> {
> jatek.PlayerMovement(MozgasIrany.Up, Field);
>
> }
> else if (args.EventArgs.Key == Key.Down)
> {
> jatek.PlayerMovement(MozgasIrany.Down, Field);
> }
> else if (args.EventArgs.Key == Key.Left)
> {
> jatek.PlayerMovement(MozgasIrany.Left, Field);
> }
> else if (args.EventArgs.Key == Key.Right)
> {
> jatek.PlayerMovement(MozgasIrany.Right, Field);
> }
> });
我使用Sample作为驯服按键的方法,这将每100毫秒采取最后一个事件,但你可以使用其他例子看到这里
http://www.introtorx.com/content/v1.0.10621.0/13_TimeShiftedSequences.html