2012-06-20 2 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가 더 좋을 수 있습니다. 당신은 창문 형태 + gdi에 집착합니까, 아니면 다른 기술을 사용할 수 있습니까? –

+0

다른 기술을 사용할 수있는 옵션이 있지만 최대한 GDI를 배우려고 노력하고 있습니다. – user1407955

+0

gdi는 감소하는 기술입니다. 당신의 동기 및/또는 요구 사항을 모르겠지만 새로운 기술로 이동하는 것이 좋습니다. –

답변

0

코드와 관련된 몇 가지 문제가 있습니다.

먼저, On_Paint 이벤트에서만 그리기를 원할 것입니다. 그 사건이 해고되면, 당신은 그저 있어야 할 곳에 차를 칠할 수 있습니다. OnPaint 이벤트에 전달되고 Graphics 개체를 포함하는 PaintEventArgs이 있습니다.

이동 기능에서는 차를 움직일 스레드를 만드는 것이 좋지만 키를 누를 때마다 스레드를 다시 만들고 싶지는 않습니다. 대신 양식에 방향 상태를 bool IsMovingLeft 또는 int Velocity과 같이 유지할 수 있습니다. 그런 다음 해당 변수의 상태를 기반으로 위치를 업데이트하는 하나의 스레드를 만듭니다.

자동차의 위치를 ​​업데이트 한 후에는 양식/컨트롤이 다시 그려 지도록하는 것이 좋습니다. 이를 수행하려면 this.Refresh()을 사용할 수 있습니다.

관련 문제