2011-08-24 2 views
0

저는 우주 침략자와 같은 슈팅 게임을 만들고 있습니다. 내 PictureBox pb는 키를 사용하여 움직이지 않으며 PictureBox pb1에 문제가 있습니다. 잠시 후에 공간 디스크가 사라집니다. 좌우로 움직이지 않습니다.키와 타이머를 사용하여 PictureBox를 움직이는 데 도움이됩니다.

여기까지 내 코드가 있습니다.

namespace SpaceShoot 
{ 
class Shoot 
{ 

    private Form f; 
    private Button bLeft, bRight; 
    private PictureBox pb; 
    private PictureBox pb1; 
    private Boolean check = false; 
    private int X, Y; 
    Timer Clock = new Timer(); 
    private int k = 0; 
    int x = 0; 

    public Shoot() 
    { 
     f = new Form(); 

     bLeft = new Button(); 
     bRight = new Button(); 

     pb = new PictureBox(); //spaceship 
     pb1 = new PictureBox(); //spacedisc 

     Clock = new Timer(); 

    } 

    public void Launch() 
    { 

     pb1.Image = new Bitmap("spacedisc.png"); 
     pb1.SetBounds(20, 20, 120, 70); 

     pb1.SizeMode = PictureBoxSizeMode.StretchImage; 

     f.BackColor = System.Drawing.Color.Black; 
     f.Size = new Size(700, 700); 
     f.StartPosition = FormStartPosition.CenterScreen; 
     f.Controls.Add(pb); 
     f.Controls.Add(pb1); 

     bLeft.KeyDown += new KeyEventHandler(Space_KeyDown); 
     bRight.KeyDown += new KeyEventHandler(Space_KeyDown); 

     pb.SetBounds(300, 580, 60, 60); 
     pb.Image = new Bitmap("spaceship.png");   

     pb.SizeMode = PictureBoxSizeMode.StretchImage; 

     Clock = new Timer(); 
     Clock.Interval = 800; 
     Clock.Tick += new EventHandler(Clock_Tick); 
     Clock.Start(); 
     f.ShowDialog(); 
    } 

    public void Clock_Tick(object sender, EventArgs e) 
    { 

     for (x = 0; x >= 0; x += 2) 
     { 
      pb1.Location = new Point(0 + x, 20); 
     } 
     for (x = 500; x >= 500; x -= 2) 
     { 
      pb1.Location = new Point(500 - x, 20); 
     } 
     f.Invalidate();   
    } 

    public void Space_KeyDown(object sender, KeyEventArgs e) 
    { 
     int x = pb.Location.X; 
     if (e.KeyCode == Keys.Right) 
     { 
      x += 5; 
      pb.Location = new Point(300 + x, 580); 
     } 
     else if (e.KeyCode == Keys.Left) 
     { 
      x -= 5; 
      pb.Location = new Point(300 + x, 580); 
     } 

    } 
} 

}

답변

1

OOO .... 어디서부터 시작? 좋아, 한 번에 한 가지.

  for (x = 0; x >= 0; x += 2) 
      { 
       pb1.Location = new Point(0 + x, 20); 
      } 

그래서 앱을 결코 단일 틱 과거 실행하지 :

먼저 해제, 당신은 무한 루프가 있습니다.

두 번째로 당신은 대화 상자에서 실행 중입니다 .... 나는 정말로 권장하지 않습니다. 교체 :

f.ShowDialog(); 

로 : 당신의 program.cs와

Application.Run(f); 

을 아마 이런 식으로 뭔가를 찾고 :

 Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Shoot shoot = new Shoot(); 
     shoot.Launch(); 

당신이의 WinForm 응용 프로그램 그럼 그냥 .Show (내 이미 경우) 양식 및 .Hide() 이전 양식.

셋째로 ... 여기 재미있을 것입니다.하지만 어쨌든 : 이것은 WinForm을 사용하여 게임을 만드는 아주 나쁜 방법입니다. Windows 컨트롤은 이런 식으로 사용하도록 설계되지 않았으므로 클리핑, 투명도 및 기타 렌더링 문제로 인해 여러 가지 문제가 발생할 것입니다. 게임에서 전체 양식을 차지하는 컨트롤의 경계에 그려진 이미지를 업데이트하도록하는 것이 좋습니다. 이 방법을 사용하면 사용중인 각 컨트롤의 개별 페인트 메서드를 많이 사용하지 않고도 한 번의 렌더링으로 모든 렌더링을 수행 할 수 있습니다. 또한 컨트롤이 상대적으로 무거운 물체이기 때문에 화면에서 더 많은 스프라이트를 더 잘 스케일 할 수 있습니다.

GDI +에 대한 this FAQ를 읽기를 적극 권장합니다. 몇 년 전 WinForm에서 멋지게 그릴 수있는 방법을 고맙게 여기는 데 도움을 준 것과 같은 것입니다. : 한마디로

:

  • 는 사용자 지정 컨트롤 한 후 "현재"이미지를 렌더링 (Control에서 상속 객체)를 만들기 게임의 각 프레임에 대한 이미지를 생성하는 코드를 정리 컨트롤에 대한 그래픽 객체 (OnPaint 메서드를 오버라이드)에 추가합니다.
관련 문제