2017-03-22 2 views
0

Nur ein kleines Spiel machen und wollen mein Pausenmenü überlagern.Layering Grafiken mit Transparenz

Ein Timer ist für die Spielschleife verantwortlich. Wenn es angehalten wird, ruft es eine separate Funktion auf, die das Pause-Menü zeichnet. Jetzt zeichne ich ein kleines zentriertes Rechteck. Das Rechteck ist jedoch nicht transparent, obwohl ich es transparent mache.

Gibt es eine Möglichkeit, dass ich das tun kann?

Hier ist der Code für meine Spielschleife, die die Zustände und Züge basierend auf ihnen aktualisiert. Wie Sie sehen können, ruft das Spiel beim Pausieren eine separate Methode auf.

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(); 
       } 
      } 
     } 
    } 

Dies ist Pause(). Es zieht wie erwartet über den Rand, aber da es ein separates Grafikobjekt ist, zieht es sich über und ist nicht transparent, wie ich es erwartet hatte.

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(); 
       } 
      } 
     } 
    } 

Gibt es eine Möglichkeit, dies zu tun, damit es transparent ist?

+0

Zeigen Sie den Code haben! – TaW

+0

Ich habe den Code ohne alle Bits von dem, was ich zeichne, hinzugefügt, weil das irrelevant ist. Ich habe versucht, das Grafikobjekt auf verschiedene Arten zu übergeben, aber ohne Glück. – MattyMatt

+1

Also, zeichnest du nur auf die Von? Gibt es keine anderen Kontrollen darauf? Sie wissen, dass Sie __never__ CreateGrpahics als Ergebnis verwenden sollten, das nicht gültig ist, dann sind die Grafiken, die es zeichnet, nicht persistent !? – TaW

Antwort

1

Sie scheinen zu glauben, dass Graphics.Clear(Color.Transparent) eine transparente Leinwand erstellen würde.

Nun, das gilt nur, wenn Sie es auf eine Bitmap anwenden. Für controls lässt es die BackColor der Parent durchscheinen und für Forms, die keine Parent haben, macht es die Form aussehen schwarz.

Es ist auch setzt das Graphics Objekt, das auch nicht sein kann, was Sie wollen ..

Hier ist, wie ein halbtransparentes Overlay über eine Form zeichnen:

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); 

Ergebnis:

enter image description here

Verwenden Sie Ihre Zahlen für die Alpha-Werte der Überlagerung und (vielleicht) der Text!

Normalerweise ist das Graphics Objekt zu verwenden, sollte die e.Graphics aus den Form ‚s Paint Veranstaltung.

Aber da Sie scheinen Ihre Zeichnung aus einem Timer.Tick zu tun, um Sie mit der Erstellung es CreateGraphics mit wegkommen, die in der Regel nicht zu empfehlen, da das Ergebnis non-persistent ist ..

+0

Vielen Dank für Ihre Antwort. – MattyMatt