2013-03-22 15 views
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); 
     } 
    } 
} 
+1

您需要一個循環來保持線程運行。 – Romoku 2013-03-22 23:59:58

+1

...和Thread.Sleep以毫秒爲單位接受整數時間間隔(1/10 == 0) – 2013-03-23 00:01:49

+0

@Romoku好的我剛剛爲x.moveball添加了一個循環,並將Thread.Sleep更改爲1.球仍然沒有移動。 – krikara 2013-03-23 00:07:09

回答

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); 
     } 
    } 
} 
0

我建議構建循環在接下來的一個線程方法:自上次計算

  1. 計算時間跨度以毫秒爲單位
  2. 移動的所有對象相應
  3. 碰撞檢測和解析
  4. 調用顯示方法渲染幀
  5. 返回步驟1

請不要在每一幀中創建一個新的線程,那將會有糟糕的表現。另外,不要在一個線程中操作圖形對象。