2012-06-20 64 views
2

我正在創建一個類似汽車遊戲的應用程序,它使用兩個鍵,即左鍵和右鍵。我正在使用一個橢圓並在兩個方向上移動它。當我啓動應用程序並將橢圓移動到右鍵時,按下左鍵時它會正常工作,並且我正在使用另一個必須不斷向下移動的橢圓。 下面是我用來移動橢圓的兩個函數。以及表單的key_down事件:C#GDI將橢圓從一個點移動到另一個並返回

public void MoveLeft() 
    { 

     if (startPoint.Y > 100) 
     { 
      startPoint.Y = 1; 
     } 
     while (startPoint.Y > 1) 
     { 


      graphics.Clear(BackColor); 
      if (startPoint.Y > this.ClientSize.Height) 
       startPoint.Y = 0; 
      startPoint.Y += 5; 
      graphics.DrawEllipse(Pens.Black, new Rectangle(carPoint, new Size(100, 100))); 
      graphics.FillEllipse(new SolidBrush(Color.Green), new Rectangle(carPoint, new Size(100, 100))); 
      Move(); 
      System.Threading.Thread.Sleep(50); 


     } 
    } 

    public void MoveRight() 
    { 
     while (startPoint.Y > 1) 
     { 
      if (startPoint.Y > this.ClientSize.Height) 
       startPoint.Y = 0; 
      startPoint.Y += 5; 
      carPoint = new Point(100, 250); 
      graphics.DrawEllipse(Pens.Black, new Rectangle(carPoint, new Size(100, 100))); 
      graphics.FillEllipse(new SolidBrush(Color.Green), new Rectangle(carPoint, new Size(100, 100))); 
      Move(); 
      System.Threading.Thread.Sleep(50); 
      graphics.Clear(BackColor); 
     } 
    } 

    public void Move() 
    { 
     graphics.DrawEllipse(Pens.Black, new Rectangle(startPoint, new Size(100, 100))); 
     graphics.FillEllipse(new TextureBrush(image), new Rectangle(startPoint, new Size(100, 100))); 
    } 

    private void Form1_KeyDown(object sender, KeyEventArgs e) 
    { 
     switch (e.KeyData) 
     { 
      case Keys.Right: 
       { 
        moveCar = new Thread(new ThreadStart(MoveRight)); 
        moveCar.Start(); 

       } 
       break; 
      case Keys.Left: 
       { 
        if (moveCar != null) 
        { 
         moveCar.Abort(); 
         moveCar = null; 
        } 
        moveCar = new Thread(new ThreadStart(MoveLeft)); 
        moveCar.Start(); 
       } 
       break; 

     } 
    } 
+0

我的第一感覺是你沒有使用正確的工具。當然你可以實現你的目標,但是XNA框架比老派的gdi繪圖更適合構建遊戲。即使WPF可以更好。你是否堅持使用windows form + gdi,或者你可以使用其他技術? –

+0

我確實有使用其他技術的選擇,但我試圖儘可能多地學習GDI – user1407955

+0

gdi是一項衰退的技術。不知道你的動機和/或要求,但我建議轉向更新的技術。 –

回答

0

有一些代碼問題。

首先,您可能只想繪製On_Paint事件。當這個事件被解僱時,你可以簡單地將你的車漆在它應該在的地方。有一個PaintEventArgs傳遞給On_Paint事件,並且包含一個Graphics對象。

在您的移動功能中,創建用於移動汽車的線程是一件好事,但每次按下某個鍵時都不想重新創建線程。相反,您可以在表單上保留方向狀態,如bool IsMovingLeftint Velocity。然後創建一個線程,根據該變量的狀態更新位置。

一旦你更新了汽車的位置,強制Form/Control重繪自己也很好。您可以使用this.Refresh()來完成此操作。

相關問題