0

我之前制作了一个简单的球和桨程序,所有程序都以一种形式运行。现在我试图让球在单独的线程上运行,但在概念上不太了解如何让球在单独的线程上运行,同时保持我的程序的其余部分相同。

最初计时器会让球移动,所以我想我可以将移动线插入到我的 ballUpdate 类中。但现在我的问题是是否有办法让线程工作我当前的计时器实现。

这就是我的 form1 的样子

public partial class Form1 : Form
    {
        Graphics paper;
        Paddle paddle = new Paddle();
        Ball ball = new Ball();
        Thread myThread;
        BallUpdate ballUpdate = new BallUpdate();

        public Form1()
        {
            InitializeComponent();
            myThread = new Thread(() => ballUpdate.ballMotion(ball));
            myThread.Start();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            paper = e.Graphics;
            paddle.drawPaddle(paper);
            ball.drawBall(paper);

        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            //ball.moveBall();
            ball.collide();
            ball.hitPaddle(paddle.PaddleRec);
            this.Invalidate();
        }

我认为这可能会有所进展,但球根本不动。

class BallUpdate
{
    public BallUpdate(){}

    public void ballMotion(Ball x)
    {
        while(true)
        {
            x.moveBall();
            Thread.Sleep(30);
        }   
    }
}
4

2 回答 2

1

您需要初始化ballUpdate并启动myThread. 只有球的逻辑应该在单独的线程上。

public partial class Form1 : Form
    {
        Graphics paper;
        Paddle paddle = new Paddle();
        Ball ball = new Ball();
        Thread myThread;
        BallUpdate ballUpdate = new BallUpdate();

        public Form1()
        {
            InitializeComponent();
            myThread = new Thread(() => ballUpdate.ballMotion(ball));
            myThread.Start();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            paper = e.Graphics;
            paddle.drawPaddle(paper);
            ball.drawBall(paper);

        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            //ball.moveBall();
            ball.collide();
            ball.hitPaddle(paddle.PaddleRec);
            this.Invalidate();
        }

在 BallUpdate 中更改if(true)while(true)以防止线程退出。加入延迟,这样你的球就不会飞起来。

class BallUpdate
{
    public BallUpdate(){}

    public void ballMotion(Ball x)
    {
        while(true)
        {
            x.moveBall();
            Thread.Sleep(10000);
        }   
    }
}
于 2013-03-23T00:27:02.613 回答
0

我建议构建一个循环以下内容的线程方法:

  1. 计算自上次计算以来的时间跨度(以毫秒为单位)
  2. 相应地移动所有对象
  3. 碰撞检查和解决
  4. 调用 display 方法来渲染帧
  5. 返回步骤 1

请不要在每一帧中创建一个新线程,这将有糟糕的性能。此外,不要在线程中操作图形对象。

于 2013-03-23T00:11:23.480 回答