2017-03-22 22 views
0

게임을 조금만 만들고 위에 일시 중지 메뉴를 놓기를 원합니다.투명도가 적용된 그래픽 겹침 내기

타이머가 게임 루프를 담당합니다. 일시 중지되면 일시 중지 메뉴를 그리는 별도의 기능을 호출합니다. 지금은 작은 중심의 사각형을 그립니다. 그러나 투명하게 지우지 만 사각형은 투명하지 않습니다.

내가 할 수있는 방법이 있습니까?

다음은 상태를 업데이트하고이를 기반으로 한 내 게임 루프 코드입니다. 보시다시피 게임이 일시 중지되면 별도의 메소드가 호출됩니다.

private void tmrGameLoop_Tick(object sender, EventArgs e) 
    { 

     if (Paused) 
     { 
      Pause(); 
      return; 
     } 

     using (Graphics gr = CreateGraphics()) 
     { 
      using (BufferedGraphicsContext bgc = new BufferedGraphicsContext()) 
      { 
       using (BufferedGraphics bg = bgc.Allocate(gr, DisplayRectangle)) 
       { 
        bg.Graphics.SmoothingMode = SmoothingMode.AntiAlias; 
        bg.Graphics.Clear(Color.Transparent); 
        // draw the stuff 
        bg.Render(); 
       } 
      } 
     } 
    } 

이것은 일시 중지()입니다. 예상대로 위쪽으로 그려지지만 별도의 그래픽 개체이기 때문에 예상대로 투명도가 떨어집니다.

private void Pause() 
    { 
     using (Graphics gr = CreateGraphics()) 
     { 
      using (BufferedGraphicsContext bgc = new BufferedGraphicsContext()) 
      { 
       using (BufferedGraphics bg = bgc.Allocate(gr, m_menu)) 
       { 
        bg.Graphics.Clear(Color.Transparent); 
        // draw pause menu 
        bg.Render(); 
       } 
      } 
     } 
    } 

투명하게하려면 어떤 방법이 있습니까?

+0

코드를보기 있다! – TaW

+0

필자가 실제로 그리는 것의 모든 비트가없는 코드를 추가했습니다. 그 이유는 관련이 없기 때문입니다. 나는 다양한 방법으로 그래픽 객체를 전달하려고했지만 운이 없었습니다. – MattyMatt

+1

그럼, 보낸 사람을 그리는거야? 다른 컨트롤이 없습니까? __never__가 CreateGrpahics를 사용하면 결과가 유효하지 않은 것을 알 수 있습니다. 그러면 그리기 할 그래픽이 비 영구적입니다! – TaW

답변

1

Graphics.Clear(Color.Transparent)은 투명 캔버스를 만들 것이라고 생각됩니다.

글쎄, Bitmap에 적용하는 경우에만 해당됩니다. controls의 경우 ParentBackColor이 표시되고 Parent이없는 Forms의 경우 Form의 모양이 이됩니다.

그것은 또한 재설정 또한 당신이 원하는하지 않을 수 Graphics 객체 ..

다음

반투명 오버레이를 그리는 방법입니다 Form 이상 :

using (SolidBrush br = new SolidBrush(Color.FromArgb(192, Color.Silver))) 
    g.FillRectangle(br, ClientRectangle); 

StringFormat fmt = new StringFormat() 
    { Alignment = StringAlignment.Center, 
     LineAlignment = StringAlignment.Center }; 

using (SolidBrush br = new SolidBrush(Color.FromArgb(128, Color.Tomato))) 
using (Font f = new Font("Consolas", 40f)) 
    g.DrawString("PAUSED",f, br, ClientRectangle, fmt); 

결과 :

enter image description here

에 대한 귀하의 번호를 사용 오버레이의 알파 값과 (아마도) 텍스트!

일반적으로 Graphics 개체는 FormPaint 이벤트의 e.Graphics이어야합니다. 당신이 .. 결과가 비 영구적 인입니다 당신이 일반적으로 권장되지 않습니다 CreateGraphics를 사용하여 생성 넘어갈 수있는 Timer.Tick에서 모든 드로잉을 할 것으로 보인다 이후

는 그러나

+0

답장을 보내 주셔서 감사합니다. – MattyMatt