2017-03-22 4 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(); 
       } 
      } 
     } 
    } 

これはPause()です。期待どおりに上に描画されますが、それは別のグラフィックスオブジェクトなので、描画され、透明ではありません。

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

だから、あなたは「From」の上に描いていますか?他のコントロールはありませんか?あなたは__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である必要があります。

しかし、あなたがTimer.Tickから、すべての描画を行うように見えるので、あなたは結果が非永続あるとして、通常は、推奨されませんCreateGraphicsを使用して作成して逃げるかもしれません。..

+0

あなたの答えをありがとう。 – MattyMatt

関連する問題