【问题标题】:Character delay c#字符延迟 c#
【发布时间】:2013-10-18 08:40:39
【问题描述】:

我正在尝试制作一个移动图片框(带有我的“播放器”的图像),这一切都很好,但我遇到了 windows 字符延迟的问题。
对于不知道这是什么的你:如果你按住一个键,windows 会打印它,稍等片刻,然后发送垃圾邮件。

所以发生的情况是我的玩家移动了 10px 等待,然后按应有的方式移动。

搬家代码:

if (e.KeyCode == Keys.Left)
{
    if (shipBox.Left >= 7)
    {
        shipBox.Left -= 10;
    }
}
if (e.KeyCode == Keys.Right)
{
    if (shipBox.Left <= 375)
    {
        shipBox.Left += 10;
    }
}
if (e.KeyCode == Keys.Up)
{
    if (shipBox.Top >= 120)
    {
        shipBox.Top -= 10;
    }
}
if (e.KeyCode == Keys.Down)
{
    if (shipBox.Top <= 520)
    {
        shipBox.Top += 10;
    }
}

【问题讨论】:

    标签: c# windows character delay picturebox


    【解决方案1】:

    有一种解决方法

    基本上你有一个计时器,它会以你选择的固定间隔移动图片

    打开计时器以继续 OnKeyDown,然后将其关闭 OnKeyUp。确保OnKeyDown 提供一个可以移动的 X/Y 坐标。并在 OnKeyUp 事件上重置该值。

    public class MyForm : Form
    {
        private int deltaX;
        private int deltaY;
    
        private const int movementAmount = 10;
    
        private Timer movementTimer = new Timer();
    
        public MyForm()
        {
            movementTimer.Interval = 100; // make this whatever interval you'd like there to be in between movements
    
            movementTimer.Tick += new EventHandler(movementTimer_Tick);
        }
    
        void movementTimer_Tick(object sender, EventArgs e)
        {
            myMonster.Location = new Point(myMonster.X + deltaX, myMonster.Y + deltaY);
        }
    
        protected override void OnKeyDown(KeyEventArgs e)
        {
            base.OnKeyDown(e);
    
            switch (e.KeyCode)
            {
                case Keys.Left:
                    {
                        deltaX -=movementAmount;
                    } break;
                case Keys.Right:
                    {
                        deltaX += movementAmount;
                    } break;
                case Keys.Up:
                    {
                        deltaY -= movementAmount;
                    } break;
                case Keys.Down:
                    {
                        deltaY += movementAmount;
                    } break;
            }
    
            UpdateTimer();
        }
    
        protected override void OnKeyUp(KeyEventArgs e)
        {
            base.OnKeyUp(e);
    
            switch (e.KeyCode)
            {
                case Keys.Left:
                    {
                        deltaX += movementAmount;
                    } break;
                case Keys.Right:
                    {
                        deltaX -= movementAmount;
                    } break;
                case Keys.Up:
                    {
                        deltaY += movementAmount;
                    } break;
                case Keys.Down:
                    {
                        deltaY -= movementAmount;
                    } break;
            }
    
            UpdateTimer();
        }
    
        private void UpdateTimer()
        {
            movementTimer.Enabled = deltaX != 0 || deltaY != 0;
        }
    }
    

    注意:当你有很多条件时尝试Switch..Case

    【讨论】:

    • 谢谢!很有帮助
    【解决方案2】:

    我想您正在尝试创建某种游戏。如果您希望播放器的移动平滑,则不应更新播放器图像的位置,或在键盘/鼠标事件处理程序中重绘其图像。相反,您应该实现某种主循环(在单独的线程中,计时器回调函数,或者可能在主窗口循环中),它将根据当前按下的键和自上次更新以来经过的时间更新播放器的屏幕位置和重绘它。

    【讨论】:

    • 啊,这很有意义。将来会尝试实现这一点:)
    猜你喜欢
    • 2023-03-04
    • 2010-09-30
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    相关资源
    最近更新 更多