【问题标题】:How to move buttons created during code with a timer如何使用计时器移动代码期间创建的按钮
【发布时间】:2017-05-27 01:53:45
【问题描述】:

对于我目前正在编写的代码,我有一个计时器,可以在表单边缘生成按钮。我希望按钮然后向屏幕中心移动——想想小行星——但不知道如何实现。提前感谢您的帮助! 到目前为止我的代码:

   private void timer1_Tick(object sender, EventArgs e)
    {
        Timer newtimer = new Timer();
        newtimer.Interval = 100;
        newtimer.Start();





        Button enemybutton = new Button();
        int sidepick = rnd.Next(1, 5);
        if(sidepick == 1)
        {
            enemybutton.Left = rnd.Next(1, 15);
            enemybutton.Top = rnd.Next(1, 700);
        }

      else  if (sidepick == 2)
        {
            enemybutton.Left = rnd.Next(1, 1000);
            enemybutton.Top = rnd.Next(1, 15);
        }

       else if (sidepick == 3)
        {
            enemybutton.Left = rnd.Next(1,1315);
            enemybutton.Top = rnd.Next(650,665);
        }
        if (sidepick == 4)
        {
            enemybutton.Left = rnd.Next(1300,1315);
            enemybutton.Top = rnd.Next(1,650);
        }
        enemiesSpawned++;
        if(enemiesSpawned == levelsBeat)
        {
            levelsBeat++;
            enemiesSpawned = 0;
            timer1.Stop();
        }


        enemybutton.Height = 64;
        enemybutton.Width = 64;
        Controls.Add(enemybutton);

    }

【问题讨论】:

  • 您的计时器不应该在滴答事件处理程序中创建/启动。您想在什么事件上移动控件?您希望以多快的速度移动控件?

标签: c# winforms button timer


【解决方案1】:

我建议将所有生成的按钮收集在List 中以供将来参考。

Random rnd = new Random();
List<Button> ButtonList = new List<Button>();
private void timer_spawn_Tick(object sender, EventArgs e)
{

    Button enemybutton = new Button();
    enemybutton.Click += Enemybutton_Click;

    int sidepick = rnd.Next(1, 5);

    switch (sidepick)
    {
        case 1:
            enemybutton.Left = rnd.Next(1, 15);
            enemybutton.Top = rnd.Next(1, 700);
            break;
        case 2:
            enemybutton.Left = rnd.Next(1, 1000);
            enemybutton.Top = rnd.Next(1, 15);
            break;
        case 3:
            enemybutton.Left = rnd.Next(1, 1315);
            enemybutton.Top = rnd.Next(650, 665);
            break;
        case 4:
            enemybutton.Left = rnd.Next(1300,1315);
            enemybutton.Top = rnd.Next(1, 650);
            break;
        default:
            break;
    }

    enemybutton.Height = 64;
    enemybutton.Width = 64;
    Controls.Add(enemybutton);

    ButtonList.Add(enemybutton);  

    enemiesSpawned++;
    if(enemiesSpawned == levelsBeat)
    {
        levelsBeat++;
        enemiesSpawned = 0;
        timer1.Stop();
    }

}

然后您可以使用第二个计时器作为移动部件并访问List 中的按钮来移动它们。只需为每个按钮计算一个新的Location:

private void timer_move_Tick(object sender, EventArgs e)
{            
    foreach (var button in ButtonList)
    {
        button.Location = CalculateMove(button.Location);
    }
}

private Point CalculateMove(Point currentLocation)
{
    Point center = new Point(this.Width / 2, this.Height / 2);
    Point moveDestination = new Point();
    int stepsize = 20;

    moveDestination.X = currentLocation.X < center.X ? currentLocation.X + stepsize : currentLocation.X - stepsize;
    moveDestination.Y = currentLocation.Y < center.Y ? currentLocation.Y + stepsize : currentLocation.Y - stepsize;

    return moveDestination;
}

这是一个非常简单的运动计算。但是为了简单地移动它是有效的。我猜你可以弄出一个更好的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-04
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    相关资源
    最近更新 更多