Mehrere Layer mit System.Drawing

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Mehrere Layer mit System.Drawing

    wie kann ich mit system.drawing auf verschiedenen layern zeichnen??

    also ich möchte eine map mit images machen aber wenn ich das ganze spielfeld bei jedem durchlauf der speilroutine neu zeichne laggt das zeimlich

    hat da jemand eine tipp odr eine idee wie ich nur einzelne bereiche neu zeichne
    Hi
    wenn du nur Bereiche neuzeichnen willst, unterteile dir deine Karte in Teilbereiche mit den jeweils zu rendernden Elementen, statt sie von einer Liste herunterzurendern (was du vmtl. machst). Danach nimmst du nur Elemente, die sich mit dem neuzuzeichnenden Bereich überschneiden. Per Invalidate zeichnest du anschließend nur einen Ausschnitt neu (e.ClipRectangle im Paint-Eventhandler gibt dir dann den Bereich, der neuzuzeichnen ist, an).

    Gruß
    ~blaze~
    Setz' lieber ein anständiges Konzept um. Man geht normalerweise nie davon aus, dass man einfach mal so auf gut Glück was umsetzt, das bereut man später meistens. Invalidate "zwingt" das Control dazu, einen Bereich für ungültig zu erklären und dieser wird später eben neugezeichnet. D.h. du musst nichts übermalen, sondern einfach nur ein sauberes Konzept verfolgen. Normalerweise hat man bei einem solchen Spiel ja eh eine Tilemap in Form eines Arrays, das durch Indices angesteuert werden kann, einen Offset und eine Tile-Größe in Form eines Vektors oder so und eine darübergelegte Map mit dynamischen Objekten. Wenn man dann noch abhängig von der Sichtbarkeit des Objekts arbeitet und die Resourcen dynamisch freigibt oder anfordert, sollt' das ja kein Problem mehr sein.

    Gruß
    ~blaze~
    Vielleicht noch'n Versuch.
    Denk mal über WPF nach.
    Da kannst Du eine DrawingGroup aufmachen und dieser kannst Du (beliebig) viele Overlays zuordnen und gemeinsam darstellen.
    Und Du musst Dich um nichts weiter kümmern.

    VB.NET-Quellcode

    1. ' halt ein Overlay erzeugen, benötigt eine transparente Farbe
    2. Dim bms As BitmapSource = CreateOverlay(e.Image.PixelWidth, e.Image.PixelHeight, e.Regions)
    3. DrawingGroup group = New DrawingGroup()
    4. group.Opacity = 1 ' Transparent zulassen
    5. group.Children.Add(New ImageDrawing(e.Image, New Rect(0, 0, e.Image.PixelWidth, e.Image.PixelHeight))) ' Das Bild
    6. group.Children.Add(New ImageDrawing(bms, New Rect(0, 0, e.Image.PixelWidth, e.Image.PixelHeight))) ' sein Overlay
    7. myImage.Source = New DrawingImage(group) ' darstellen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!