0

私は以前、単純なボールとパドルのプログラムをすべて1つの形式で実行するように作成しました。今、私はボールを別のスレッドで実行しようとしていますが、プログラムの残りの部分を同じに保ちながら、ボールを別のスレッドで実行する方法を概念的に完全に理解していません。

もともとタイマーがボールを動かすので、その移動ラインを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 に答える