正确使用定时器

时间:2015-02-20 17:02:50

标签: c# timer

这里很新...... 我正在制作一个程序,允许用户控制精灵(在水面上行走/跳跃/下降 - 通常......我知道非常基本)

为了让精灵以这样的方式跳跃,以便人眼实际上可以看到表格的上升和下降,我需要减慢程序向上翻译精灵的过程。

我决定使用计时器,而不是SLEEP因为我不希望整个程序冻结。

这是我想出的:

private void jump()
{
    global.CharacterY = global.CharacterY - 1;
    framer_Tick(null, new EventArgs()); //pause program without freezing
}

private void framer_Tick(object sender, EventArgs e)
{
    sprite.Location = new Point(global.CharacterX, global.CharacterY);
}

由此调用:

private void Stage_KeyDown(object sender, KeyEventArgs e)
{
    if (global.counter >= 1 & e.KeyCode.ToString() == "D")
    {
        global.CharacterX = global.CharacterX + 1;
        jump();
    }

    if (e.KeyCode.ToString() == "W")
    {
        while (global.counter < 50)
        {
            jump();
            global.counter = global.counter + 1;
        }
        global.counter = 0;

    }
    if (e.KeyCode.ToString() == "D")
    {
        global.CharacterX = global.CharacterX + 1;
        sprite.Location = 
            new Point(global.CharacterX, global.CharacterY);
    }
    if (e.KeyCode.ToString() == "A")
    {
        global.CharacterX = global.CharacterX - 1;
        sprite.Location = 
            new Point(global.CharacterX, global.CharacterY);
    }
}

现在,计时器似乎没有任何效果。我假设放置代码以在定时器内转换精灵会使每次定时器勾选时触发一次。 - 不幸的是,我没有经验让计时器暂停程序(最好每秒30次,间隔33(ish)) -

2 个答案:

答案 0 :(得分:0)

简单地更改精灵的位置不会做任何事情。你必须在绘制精灵的任何控件上调用Invalidate()才能看到效果。

此外,您不会调用framer_tick来启动该过程。你必须call Start and Stop methods on the timer object。当你调用Start时,tick处理程序将开始被调用。当你致电Stop时,它会停止。

为了让你的所有动画更流畅,逻辑更少问题,你的刻度计时器应该一直关闭,因为你应该一直重绘屏幕。通过屏幕刷新本身,您只需更改精灵的位置,动画将按预期运行。

答案 1 :(得分:-1)

简单地更改精灵的位置不会做任何事情。您必须在绘制精灵的任何控件上调用Invalidate()以查看效果。此外,您不会调用framer_tick来启动进程。您必须在计时器对象上调用start / stop。当你调用start时,tick处理程序将开始被调用。当你拨打停止时,它会停止。但我同意@Chris。您的计时器应该一直在关闭,因为您应该一直重新绘制屏幕。之后你只需要改变精灵的位置,一切都会好的。 - 保罗萨西克