Animation eines Bildes

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Animation eines Bildes

    Moin moin zusammen,

    Ich hoffe dieses Thema gibt es nicht schon bereits, gefunden hab ich es nicht.
    Also ich möchte gern folgendes:

    Ich habe drei einzelne Animationen (Gif oder einzel Bilder, je nachdem was gebraucht wird) und die sollen dann per Knopfdruck anspringen und sich auch frei auf der Form verschieben lassen.
    Die Animationen und der Knopf sind weniger das Problem, denn die sind folgende:

    1. Eine PixtureBox kann zwar eine Gif animation als Image oder Hintergrund habe, hat aber nur zum Parent eine Transparenz, nicht auch zu anderen PictureBoxen, dh. die Transparenz überschreibt die anderen Animationen. Eine Eigenschaft, wie ich das verhindern kann, hab ich nicht gefunden.

    2. Ein gemaltes Image behebt zwar das Problem mit der Transparenz, aber es kann keine Gifs abspielen und lässt sich alles andere als leicht durch den Raum bewegen und Einzelbilder Animationen hinterlassen einen hässlichen Hintergrund.

    3. Wenn ich die gemalten Images mit Form1.Invalidate() und einem Paint handler abfange und immer neu malen lasse, verlier ich sehr viel Performence.

    4. Mit DirectX 9 hab ich keine Erfahrung und finde auch keine Hilfreiche Anleitung dazu, wie man dieses Problem lösen könnte.

    Also wende ich mich an euch, habt ihr eine Idee wie ich das Problem lösen kann? :huh:

    Danke,

    Klopfer
    Also ich habe die letzten Tage ein wenig das Forum durchstöbert, aber bei meinem Problem hat es mir nicht geholfen.

    zu 1. finde ich nicht das was ich suche
    aus 2. bin ich nicht schlau geworden
    und bei 3. findet man hier keinen Eintrag ;)

    Vielleicht sollte ich mein Problem nochmal genau schildern:

    Ich habe zwei Gif-animationen, die ich auf dem bildschirm unabhängig voneinander bewegen will.
    Sie haben beide einen Alphakanal und sollen beim überschneiden nicht von der transparenz des anderen übermalt werden.
    Wie jetzt?!
    Du hast nichts gefunden 8|

    Google = Ungefähr 3.290.000 Ergebnisse (0,15 Sekunden) "GDI+"
    Google = Ungefähr 510.000 Ergebnisse (0,24 Sekunden) "Vb.Net GDI+"
    Google = Ungefähr 225.000 Ergebnisse (0,24 Sekunden) "Vb.Net GDI+ Tutorial"


    Ich habe zwei Gif-animationen, die ich auf dem bildschirm unabhängig voneinander bewegen will.
    Sie haben beide einen Alphakanal und sollen beim überschneiden nicht von der transparenz des anderen übermalt werden.


    Dies kannst du mit GDI+ erreichen.
    Du zeichnest beide Bilder auf ein Control im Paint Event.
    Und die transparente Fläche des einen Bildes wird nicht mehr das zweite Bild überzeichen.

    VB.NET-Quellcode

    1. e.Graphics.DrawImage(DEIN PFAD ZUM BILD, New Point(100, 100)) ' Zeichnet ein Bild auf X100 Y100


    Wenn du jetzt zwei Bilder zeichnen lässt:

    VB.NET-Quellcode

    1. e.Graphics.DrawImage(DEIN PFAD ZUM BILD, New Point(100, 100)) ' Zeichnet Bild 1 auf X100 Y100
    2. e.Graphics.DrawImage(DEIN PFAD ZUM BILD, New Point(200, 200)) ' Zeichnet Bild 2 auf X200 Y200


    Und dessen Transparenz sich mit dem anderen Bild schneidet sollte es nicht überzeichnet werden.

    Gruß Eistee
    Wie jetzt?!
    Du hast nichts gefunden 8|
    Laut Valeriam sollte ich das Tool "Suche" benutzen, bin davon ausgegangen dass er damit nicht die GoogleSuche meinte ;)
    Google = Ungefähr 3.290.000 Ergebnisse (0,15 Sekunden) "GDI+"
    Google = Ungefähr 510.000 Ergebnisse (0,24 Sekunden) "Vb.Net GDI+"
    Google = Ungefähr 225.000 Ergebnisse (0,24 Sekunden) "Vb.Net GDI+ Tutorial"
    Und deine antwort knüpfte an die von Valeriam an, also dachte ich, ich solle immernoch die Suche hier im Forum benutzen ;)
    Natürlich ist mit klar, dass ich auch Google nutzen kann, aber hier im Forum sollte doch auch ein nützliches TUtorial sein.
    Dies kannst du mit GDI+ erreichen.
    Du zeichnest beide Bilder auf ein Control im Paint Event.
    Und die transparente Fläche des einen Bildes wird nicht mehr das zweite Bild überzeichen.
    Funktioniert das auch mit Animationen? Vergiss nicht, ich will die Bilder auch bewegen lassen, nicht nur aufs Control malen!
    Bei dir klingt der Quellcode nach, ich mals aufs Control und dann bleibts da für immer.

    Gruß,
    Klopfer91
    das ganze wird auch wieder überzeichnet(andere Form darübergezogen usw.)beim nächsten mal wird einfach wieder das Paint Event aufgerufen, damit das überzeichnete wieder gezeichnet wird, dabei kannst du eine Beliebige Position auf dem Control angeben und somit diese auch verändern...durch Controlname.Invalidate erreichst du, dass das gesamte Control neu gezeichnet wird, dadurch lassen sich auch Animationen abspielen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    Klopfer91 schrieb:

    3. Wenn ich die gemalten Images mit Form1.Invalidate() und einem Paint handler abfange und immer neu malen lasse, verlier ich sehr viel Performence.
    Ich glaube irgendwie, dass sich hier niemand meine Beschreibung durchgelesen hat.

    Mit zB Form1.Invalidate() erreich ich zwar, dass meine Images sich bewegen, aber die animationen sollen sich quer über 1280*800 pixel bewegen können.
    Wenn ich dabei jedes mal das Control neu zeichnen lasse stockt es und ich komm nicht voran im Programm!

    Also bitte, lest euch endlich mal durch was ich da oben schon alles stehen hatte, weil ich das schon alles bisher genannte ausprobiert hatte
    Hier ist eine Beispiel Gif.

    Um das Projekt genauer zu beschreiben:

    Es handelt sich hier um eine Art Tamagotchi, von denen 1-3 in einem Raum rumhüpfen, fressen, schlafen und sonstige Dinge tun können.
    Klappt auch soweit alles, nur das mit den Transparenzen ist ein Problem.
    Bilder
    • Pet001-jump.gif

      9,71 kB, 500×500, 305 mal angesehen
    wie lässt du es denn neu zeichnen, in einem Timer? (40 als Intervall wäre meiner Meinung nach richtig...)
    Me.SetStyle(OptimezedDoubleBuffer Or UserPaint Or AllPaintingInWMPaint, True)
    wenn das nicht genügt BufferedGraphics verwenden...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    ebrithil schrieb:


    du hast ja geschrieben dass du das gif auch in einzelbilder hast, warum lässt du dann nicht einfach jedes bild der Reihe nach Zeichnen???

    mfg Ebrithil

    Wie genau meinst du das?
    In einer PictureBox ist es egal ob ich ein Gif abbilde oder ein Einzelbild, der Transparenz-"bug" tritt immer auf.
    Wenn du meinst ich soll das Bild per GDI draufzeichnen, dann sag ich es jetzt noch einmal:
    Sobald es gezeichnet ist, ist es fest auf der fläche drauf und nicht als Objekt. Heißt ich kann es nicht bewegen, sondern müsste die Fläche sich erst neu zeichnen lassen.
    Das Neuzeichnen lässt das Programm harken, weil die animation öfter auftritt.

    Nur um das Thema mal zu lösen

    Auch wenn unser gute Klopfer1 mittlerweile ne andere Umgebung benutzt wollte ich das Thema doch ganz gerne mal lösen. Ich würde für das ganze eine Animations klassen erstellen mit folgendem Code:


    VB.NET-Quellcode

    1. Public Class Animation
    2. 'Ich schreib bei Variablen immer ein V davor damit es übersichtlicher wird
    3. Private VImage(0) As System.Drawing.Image 'Darin sind alle Einzelbilder der Animation
    4. Public VPosition As System.Drawing.Point 'Da ist die Position der Animation
    5. Public VGröße As System.Drawing.Point 'Da ein Point nur ein geordnetes Paar von Zahlenwerten ist kann man auch eine Größe als Point speichern
    6. Private VBildAnzahl As Integer 'Gibt an wieviele Bilder die Animation hat zu beachten ist das die Anzahl der Bilder = VBildAnzahl -1 ist
    7. 'da das letzte Bild immer = Nothing sein wird.
    8. Private VAktuellesBild As Integer 'Hiermit legen wir fest welches Bild gerade gezeichnet werden soll
    9. 'Als erstes laden wir die Bilder ins Array in dem wir einen Pfad als String angeben (man könnte auch gleich ein Image nehmen)
    10. Public Sub BildLaden(ByVal Pfad As String)
    11. VImage(VBildAnzahl) = Image.FromFile(Pfad) 'Wir legen das letzte Image in dem Array fest
    12. VBildAnzahl = VBildAnzahl + 1 'Zählen mit dem Zähler eins weiter
    13. ReDim Preserve VImage(VBildAnzahl) 'Und erweitern das Array um 1 wichtig dabei ist das "Preserve" Dadurch wird der bisherige Inhalt
    14. 'des Array nicht gelöscht.
    15. End Sub
    16. 'Hier nun der Code wie ihr die Bilder nachher ladet
    17. Animation.BildLaden("C:\Bilder\Test1.jpg")
    18. Animation.BildLaden("C:\Bilder\Test2.jpg")
    19. 'usw. usw.
    20. 'Dieser Code muss natürlich am besten mit in euer Form1Load Event
    21. 'Als nächstes zeichnen wir eine der Geladenen Grafiken dafür brauchen wir zunächst eine PictureBox oder Form auf die wir zeichnen wollen
    22. Dim WithEvents GrundFläche As PictureBox = Form1.PictureBox1 'Hier legen wir die PictureBox oder Form fest wichtig ist das WithEvents
    23. Private Sub GrundFläche_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles GrundFläche.Paint 'Das ist das Paint Event der Festgelegten Form
    24. e.Graphics.DrawImage(VImage(VAktuellesBild), VPosition.X, VPosition.Y, VGröße.X, VGröße.Y) 'So zeichnen wir ein Bild aus dem Array
    25. End Sub
    26. 'Bis jetzt erscheint immer nur das Bild das wir als erstes geladen haben das ändert man wie folgt
    27. Dim WithEvents Taktgeber As Timer = Form1.Timer1 'Wir legen jetzt einen Timer fest nachdem sich die Animation richtet.
    28. Private Sub NächstesBild(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Taktgeber.Tick 'Bei jedem Timer Tick wird folgendes gemacht
    29. VAktuellesBild = VAktuellesBild + 1 'Man geht ein Bild weiter
    30. If VAktuellesBild = VBildAnzahl Then 'Falls man beim letzten Bild angekommen ist
    31. VAktuellesBild = 0 'Geht man wieder zum Bild 0
    32. End If
    33. GrundFläche.Refresh() 'Sorgt dafür das die Grafik neu gezeichnet wird
    34. End Sub
    35. End Class

    Ich hab das ganze bei mir getestet und es funktioniert super. Man kann es natürlich noch ein bisschen hübscher programmieren und evtl. auch so das es noch weniger Leistung beansprucht aber ich wollte das ganze so einfach wie möglich halten.

    MFG: CapsE