1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Andy

Beiträge von Andy

  • Text Verschlüsselung

    • Andy
    • 31. Dezember 2009 um 14:25

    Hi,
    Das RC4-Verfahren ist relativ simpel, googeln hilft^^.

    Zitat

    Verschlüsselt er es sozusagen nach der Verschlüsselung nochmal, je nachdem wie hoch das Level ist oder wie habe ich das zu verstehen?

    So ähnlich funktioniert das. Im Prinzip gehts nur um vertauschen von Bytes und anschließendem XOR. Da ein zweimaliges XOR wieder zu den Ursprungsdaten führt, geht das sehr fix.

    Als sehr einfaches Verschlüsselungsverfahren könnte man einen Text mit einem genau so langen Schlüssel per Byteweise XOR verschlüsseln. Bei einem zufälligen Schlüssel ist der Text nicht mehr zu dechiffrieren. Allerdings braucht man zum Entschlüsseln auch wieder den Schlüssel, bei langen Dokumenten oder großen Bildern bedeutet das die doppelte Datenmenge. Heutzutage ist das eigentlich Schnurz, aber genau wegen der gigantischen Datenmengen (die damals nicht verarbeitet werden konnten) wurden diese komplizierten Verfahren entwickelt. Man sollte mit kleinen Schlüsseln große Mengen an Daten ver- und entschlüsseln können.
    Simples Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $Form1 = GUICreate("Verschlüsseln / Entschlüsseln per XOR", 633, 453, 192, 114)
    $Button = GUICtrlCreateButton("Verschlüsseln / Entschlüsseln", 200, 184, 233, 57, $WS_GROUP)
    $Label1 = GUICtrlCreateLabel("Text eingeben, der Verschlüsselt oder entschlüsselt werden soll:", 16, 16, 305, 17)
    $Edit1 = GUICtrlCreateEdit("Das ist ein Geheimtext", 16, 40, 601, 129)

    [/autoit] [autoit][/autoit] [autoit]

    $Edit2 = GUICtrlCreateEdit("", 16, 288, 601, 153)

    [/autoit] [autoit][/autoit] [autoit]

    $Label2 = GUICtrlCreateLabel("Hier den Schlüssel zum Entschlüsseln eingeben oder den beim Verschlüsseln ermittelten zufälligen Schlüssel übernehmen!", 16, 256, 574, 17)
    GUISetState(@SW_SHOW)
    if guictrlread($edit1)<>"" Then GUICtrlSetData($edit2, _generatekey(guictrlread($edit1))) ;aus dem Edit1 einen Key generieren

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    case $Button
    $text=guictrlread($edit1) ;text auslesen
    $Key=guictrlread($edit2) ;schlüssel auslesen
    GUICtrlSetData($edit1, _encrypt_decrypt($text,$key)) ;verschlüsseln/entschlüsseln
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    func _generatekey($text)
    $key=""
    for $i=1 to stringlen($text)
    do
    $zeichen=random(32,255,1) ;zufallszeichen
    until $zeichen<>stringmid($text,$i,1) ;falls beide zeichen gleich sind, wird das ergebnis des XOR =0 und ist nicht darstellbar
    $key &= chr($zeichen) ;Zeichen unterhalb 32 sind steuerzeichen und werden in EDIT/MSGBOX/CONSOLE nicht dargestellt
    Next
    return $key
    endfunc

    [/autoit] [autoit][/autoit] [autoit]

    func _encrypt_decrypt($text,$key) ;text ver- bzw. entschlüsseln
    $encrypt_decrypt=""
    if guictrlread($edit2)="" Then ;falls edit2 leer, key generieren
    GUICtrlSetData($edit2, _generatekey(guictrlread($edit1))) ;aus dem Edit1 einen Key generieren
    endif

    [/autoit] [autoit][/autoit] [autoit]

    for $i=1 to stringlen($text) ;alle zeichen durchgehen
    $encrypt_decrypt&=chr(BitXOR(asc(stringmid($text,$i,1)),asc(stringmid($key,$i,1))));XOR -Verknüpfung des textzeichens mit dem Keyzeichen
    Next
    return $encrypt_decrypt
    endfunc

    [/autoit]

    Man könnte den Schlüssel verkürzen, indem man ihn für die einzelnen Textabschnitte mehrfach benutzt. Das ist aber ein risiko, daher werden Verfahren zum Bit- oder Bytetauschen, Rotieren usw eingesetzt um die Schlüssellänge möglichst kurz zu halten.

  • GDIPlus Digitaluhr

    • Andy
    • 31. Dezember 2009 um 04:29

    Hi,
    habe die Uhr mal auf 50 Zeilen zusammengekürzt :D
    Geht bestimmt NOCH kürzer, aber dafür hatte ich keinen Nerv...wenn man für die 4 "Trennpunkte" 6 Zeilen opfern muss, hört der Spass auf :P
    Kommentare sind reichlich vorhanden, kann sein, daß die Logik für Anfänger etwas schwer verständlich ist, aber für Erklärungen sind wir ja da!

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Dim $ws[12] = [0, 0, 10, -7, 50, -7, 60, 0, 50, 7, 10, 7] ;Koordinaten Polygonzug: von links nach rechts WAAGRECHTER Balken, von rechts nach links SENKRECHTER Balken
    Dim $ziffer[10] = [239, 10, 118, 94, 154, 220, 253, 14, 254, 222] ;alle gesetzten bits des Indexes in der 7-segmentanzeige ergeben die Ziffer
    Dim $balkenpos[8] = [0, "60.0", "0.0", "60.60", "0.60", "0.60", "0.120", "0.0"] ;position der Leuchtbalken der 7-Segmentanzeige innerhalb der Ziffer
    Dim $p[7][2] ;nimmt die polygonzug-koordinaten zum Zeichnen auf
    $p[0][0] = 6 ;6 Punkte im Polygonzug

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    Global $hgui = GUICreate('Uhr', 620, 175, -1, -1, $WS_POPUP) ;GUI erstellen ohne Rahmen
    Global $hWnd = WinGetHandle($hgui) ;Handle holen
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd) ;"Leinwand" erstellen, auf der gezeichnet werden kann
    GUICtrlCreateLabel("", 0, 0, 620, 175, Default, $GUI_WS_EX_PARENTDRAG) ;verschieben des Fensters möglich machen durch 2. Fenster
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) ;das 2. Fenster transparent machen
    GUISetBkColor(0x000000) ;Hintergrund der GUI schwarz
    GUISetState() ;GUI anzeigen
    AdlibRegister("_time", 1000) ;jede Zehntelsekunde ein Refresh der Zeitanzeige
    Do ;Endlosschleife, solange bis..
    until GUIGetMsg()=-3 ;..ESC gedrückt wird
    _GDIPlus_GraphicsDispose($hGraphic) ;freigeben
    _GDIPlus_Shutdown()

    [/autoit] [autoit][/autoit] [autoit]

    Func _time() ;Uhrzeit anzeigen :o)
    For $k = 1 To 6 ;die 6 Ziffern der Uhrzeit
    $setbits = $ziffer[StringMid(String(@HOUR & @MIN & @SEC), $k, 1)] ;gesetzte Bits in der siebensegmentanzeige anhand der Ziffer in der Uhrzeit holen
    For $bitnr = 7 To 1 Step -1 ;alle Bits durchlaufen
    _drawpolygon(BitAND($setbits, 128), $k * 100 - 80+($k=1 or $k=3 or $k=5)*20, $bitnr) ;parameter: bit gesetzt ja/nein, position der gesamten ziffer,nummer des bits(gerade=waagrechter balken, ungerade=senkrechter balken)
    $setbits = BitShift($setbits, -1) ;nächstes Bit holen
    Next
    Next
    $brush = _GDIPlus_BrushCreateSolid(0xFF440000 + (@sec/2=int(@sec/2)) * 0xBB0000) ;Pinsel erstellen, wenn Ziffer gerade, dann farbig, ansonsten schwarz
    _GDIPlus_GraphicsfillEllipse($hGraphic,202,55, 15,15,$brush) ;Punkte zeichnen
    _GDIPlus_GraphicsfillEllipse($hGraphic,402,55, 15,15,$brush)
    _GDIPlus_GraphicsfillEllipse($hGraphic,202,105,15,15,$brush)
    _GDIPlus_GraphicsfillEllipse($hGraphic,402,105,15,15,$brush)
    _GDIPlus_BrushDispose($brush) ;Pinsel auflösen
    EndFunc ;==>_time

    [/autoit] [autoit][/autoit] [autoit]

    Func _drawpolygon($bit, $xpos, $bitnr) ;zeichnet einen polygonzug ("Balken") an die entsprechende Position
    $split = StringSplit($balkenpos[$bitnr], ".", 3) ;x- und y-koordinaten des Balkens innerhalb der Ziffer holen
    $b = (($bitnr / 2) = Int($bitnr / 2)) ;$bit gerade => $b = true => Balken waagrecht, ansonsten Balken senkrecht
    $step = -1 + 2 * $b ;schrittweite durch das $WS-Array
    For $i = 11 - 11 * $b To 11 * $b Step 2 * $step ;array mit waagrechten (bit=gerade) oder (Bit=ungerade) senkrechten Balken füllen
    $r = Int(Abs((11 * (Not ($b))) - $i) / 2) + 1 ;abhängig von der Reihenfolge, egal ob $i von 0 bis 11 oder von 11 bis 0, $r muss immer 1,2,3,4,5,6
    $p[$r][0] = $ws[$i] + $split[0] + $xpos ;x- und
    $p[$r][1] = $ws[$i + $step] + $split[1] + 30 ;y-position in das polygonarray schreiben
    Next
    $brush = _GDIPlus_BrushCreateSolid(0xFF440000 + ($bit <> 0) * 0xBB0000) ;wenn bit gesetzt, dann farbig, ansonsten schwarz
    _GDIPlus_GraphicsFillPolygon($hGraphic, $p, $brush) ;Balken zeichnen
    _GDIPlus_BrushDispose($brush)
    EndFunc ;==>_drawpolygon

    [/autoit]
  • Denkfehler oder Logikproblem mit Array

    • Andy
    • 30. Dezember 2009 um 10:21

    Hi,
    als "Denkfehler" würde ich das nicht bezeichnen.
    Deklarierte Variablen werden, soweit kein Wert zugewiesen wird, als String behandelt.

    [autoit]

    Global $b[5]
    if isstring($b[1]) then consolewrite("string"& @CRLF)
    local $i
    if isstring($i) then consolewrite("string" & @CRLF)

    [/autoit]
  • Problem mit Sqrt

    • Andy
    • 29. Dezember 2009 um 15:24

    Hier gibts die Erklärung der handschriftlichen Methode, welche auch sehr einfach in ein AutoIt-Script umzuwandeln sein sollte. Für die Multiplikation und Division großer Zahlen bietet sich die schon angesprochene BIGINT-UDF an.

  • GDIPlus Viereck löschen

    • Andy
    • 29. Dezember 2009 um 14:42
    Zitat

    Dabei wir ja auch nur übermalt.

    Deshalb in meinem vorigen Post der Nebensatz....
    "Löschen" heisst in der "Computersprache", daß Bits mit einem Wert von 1 durch einen Wert von 0 ersetzt werden. Übertragen auf eine Computergrafik heisst das, alles "gelöschte" ist nachher schwarz. Sinn beim Topic bzw der dortigen Frage?! Keiner....

    "Wasch mich, aber mach mich nicht nass!" Übertragen auf das Topic, es soll etwas gemacht werden ohne etwas zu machen....aha....

  • GDIPlus Viereck löschen

    • Andy
    • 29. Dezember 2009 um 10:44

    Natürlich ist das Möglich! Wobei ich mit jetzt verkneife, die Sinnhaftigkeit von "richtig zu löschen, ohne es zu übermalen" im Bezug auf jegliches Verständnis für grafisches Arbeiten am PC zu erörtern...

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GDIPlus.au3>

    [/autoit] [autoit][/autoit] [autoit]

    _Main()

    [/autoit] [autoit][/autoit] [autoit]

    Func _Main()
    Local $hGUI, $hWnd, $hGraphic, $hPen, $Graphic

    [/autoit] [autoit][/autoit] [autoit]

    $hGUI = GUICreate("GDI+", 320, 320)
    $hWnd = WinGetHandle("GDI+")
    $btn_del = GUICtrlCreateButton("Löschen",130,120,60,30)
    $btn_draw= GUICtrlCreateButton("Zeichnen",130,170,60,30)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hPen = _GDIPlus_PenCreate(0xFFFF0000)
    _GDIPlus_PenSetWidth($hPen, 7)

    [/autoit] [autoit][/autoit] [autoit]

    While True
    Switch GUIGetMsg()
    Case -3
    Exitloop
    Case $btn_draw
    $Graphic = _GDIPlus_GraphicsDrawRect($hGraphic, 20, 20, 280, 280, $hPen)
    Case $btn_del
    _WinAPI_RedrawWindow($hgui)
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_Main

    [/autoit]

    "

  • GDIPlus 7-Segment-Anzeige

    • Andy
    • 24. Dezember 2009 um 17:57

    Hallo,
    du hast dir viel Mühe gegeben! :thumbup:
    Einige Tips habe ich, die du umsetzen solltest/könntest:

    • eigentlich brauchst du nur 2 Segmente, ein waagrechtes und ein senkrechtes. Diese Segmente könntest du dann an ihre jeweilige Position kopieren.
    • Beim Anzeigen der Ziffern würde ich (aufgrund des starken Kontrastes zwischen den "schwarzen" Segmenten und dem Hintergrund) die schwarzen Segmentteile eher in einem dunklen Grau anzeigen
    • um den LCD (Langsames Cristall Display ^^) - Effekt zu verstärken, wäre eine Überblendung (Schwarz/Grau nach Rot) klasse!
  • Bild im Bild suchen

    • Andy
    • 21. Dezember 2009 um 22:29

    ja, ein "Bild im Bild finden" ist sehr einfach, bspw. hier oder auch div. dll´s sind da behilflich.

    Allerdings hat das NICHTS mit OCR zu tun, da helfen die Hinweise von AspirinJunkie weiter.
    Für tesseract gibt es auch AutoIt-umsetzungen bzw UDFs im engl. Forum

  • 2 Bilder Vergleichen und Gleiche Pixel vom 2 Bild wegschneiden

    • Andy
    • 21. Dezember 2009 um 11:33

    Hallo, habe dafür ein fertiges Script, was auch sehr schnell ist^^. Bin aber mit den Kiddies Schlittenfahren, daher in ca 1-2h

  • Neuer Stil

    • Andy
    • 20. Dezember 2009 um 19:54

    Der Style ist gut gelungen. Bis auf die runden Ecken, die (was ein Glück weil ich finde sie nicht so schön) in Opera nicht angezeigt werden.
    Allerdings bleibe ich bei dem "Standardstil" Blau/Orange/Weiß, das kommt mir wesentlich "ruhiger" vor...

  • Prospeed.dll Sprite erstellen

    • Andy
    • 19. Dezember 2009 um 15:08

    Hallo,
    schau mal hier, http://www.autoitscript.com/forum/index.php?showtopic=58665&st=0
    dort gibts eine Demo, die alle Fragen beantworten dürfte
    Öffnen mit 7-zip

  • Datei binär einlesen

    • Andy
    • 19. Dezember 2009 um 11:47
    Zitat

    benutze kommt bei mir auch nur das raus:
    ‰PNG

    lesen hilft^^, ich zitiere mich mal selbst

    Zitat

    Was NICHT geht ist die Bearbeitung mit RegExp, da evtl. im String enthaltene Nullbytes als endofstring behandelt werden. Das gilt übrigens auch für die Darstellung mit Msgbox oder Consolewrite

  • Passend zum Wetter.....

    • Andy
    • 19. Dezember 2009 um 11:42

    Lappenwitz:

    Es wird kälter...

    + 10° C
    Die Bewohner von Mietwohnungen in Helsinki drehen die Heizung auf.
    Die Lappen (Bewohner Lapplands) pflanzen Blumen.

    + 5° C
    Die Lappen nehmen ein Sonnenbad, falls die Sonne noch über den Horizont steigt.

    + 2° C
    Italienische Autos springen nicht mehr an.

    0° C
    Destilliertes Wasser gefriert.

    - 1° C
    Der Atem wird sichtbar. Zeit, einen Mittelmeerurlaub zu planen.
    Die Lappen essen Eis und trinken kaltes Bier.

    - 4° C
    Die Katze will mit ins Bett.

    - 10° C
    Zeit, einen Afrikaurlaub zu planen.
    Die Lappen gehen zum Schwimmen.

    - 12° C
    Zu kalt zum Schneien.

    - 15° C
    Amerikanische Autos springen nicht mehr an.

    - 18° C
    Die Helsinkier Hausbesitzer drehen die Heizung auf.

    - 20° C
    Der Atem wird hörbar.

    - 22° C
    Französische Autos springen nicht mehr an.
    Zu kalt zum Schlittschuhlaufen.

    - 23° C
    Politiker beginnen, die Obdachlosen zu bemitleiden.

    - 24° C
    Japanische Autos springen nicht mehr an.

    - 26° C
    Aus dem Atem kann Baumaterial für Iglus geschnitten werden.

    - 29° C
    Die Katze will unter den Schlafanzug.

    - 30° C
    Deutsche Autos springen nicht mehr an.
    Der Lappe flucht, tritt gegen den Reifen und startet seinen Lada.

    - 31° C
    Zu kalt zum Küssen, die Lippen frieren zusammen.
    Lapplands Fußballmannschaft beginnt mit dem Training für den Frühling.

    - 35° C
    Zeit, ein zweiwöchiges heißes Bad zu planen.
    Die Lappen schaufeln Schnee vom Dach und stellen den Elch in die Garage.

    - 39° C
    Quecksilber gefriert. Zu kalt zum Denken.
    Die Lappen schließen den obersten Hemdknopf.

    - 40° C
    Das Auto will mit ins Bett. Die Lappen ziehen einen Pullover an.

    - 45° C
    Die Lappen schließen das Klofenster.

    - 50° C
    Die Seelöwen verlassen Grönland.
    Die Lappen tauschen die Fingerhandschuhe gegen Fäustlinge und legen dem Elch in der Garage ein Handtuch übers Geweih.

    - 70° C
    Die Eisbären verlassen den Nordpol.
    An der Universität Rovaniemi wird ein Lappen-Skilanglauf-Ausflug organisiert.

    - 75° C
    Der Weihnachtsmann verlässt den Polarkreis.
    Die Lappen klappen die Ohrenklappen der Mütze runter und stellen eine Kerze unter den Elch.

    - 250° C
    Alkohol gefriert.
    Der Lappe ist sauer.

    - 268° C
    Helium wird flüssig.

    - 270° C
    Die Hölle friert.

    - 273,15° C
    Absoluter Nullpunkt. Keine Bewegung der Elementarteilchen.
    Die Lappen geben zu: "Ja, es ist etwas kühl, gib' mir noch einen Schnaps und deck den Elch zu..."

  • Video-Stream

    • Andy
    • 19. Dezember 2009 um 10:12

    Das Problem ist nicht AutoIt, sondern die Bandbreite des Senders! Selbst auf einem langsamen Rechner sind 15-20 Screenshots die Minute kein Ding, aber wenn man mal nachrechnet wirds eng....
    20x1680x1050x32Bit = rund 1GBit/Sekunde , da braucht man ne FETTE Leitung. Bissl komprimieren geht ja immer, aber das löst das Problem nicht. Die Datenmenge ist einfach zu hoch, daher nutzen die meisten Remote-Desktop-Programme eine niedrigere Auflösung und Farbtiefe.
    20x1024x768x16Bit = 200 MBit/Sekunde, sieht schon besser aus....aber immer noch zu viel.
    Daher verwendet man keine Screenshots sondern streamt "echtes" Video und überträgt nur das, was sich im Bild gerade geändert hat. Aber wer sagt denn, daß das nicht auch mit AutoIt und den Screenshots funktioniert^^

  • Unterschiedliches Maximum von TCP

    • Andy
    • 19. Dezember 2009 um 09:49
    Zitat

    Kann das daran liegeh das er internet viva Satelit hat?

    Ja, das könnte sein! Ich vermute daß mit dem Satelliten nicht uber das "normale" Protokoll gesprochen wird, sondern daß die Übertragungsrate je nach Anzahl der Anwender angepasst wird. D.h. wenn sehr viele User die Satellitenleitung nutzen, dann bekommen zwar alle etwas, aber dafür etwas weniger. Und hier auf der Erde wird dann wieder "normal" in Pakete umgesetzt.

  • Verschiedene GDI+ Grafiken zeichnen und verschieben

    • Andy
    • 19. Dezember 2009 um 09:36
    Zitat

    in Abhängigkeit der Größe der Sprites, der Zeitgewinn sich gegenüber der Buffer Methode ammortisiert.

    ja, das vermute ich auch. Wenn man mal sieht, wie ein einzelnes IF in so einer Schleife zeitmäßig reinhaut, wird es einem anders. Hehe, wie in alten Turbo-Basic-Tagen....die "Gui" in Basic und den Rest in Assembler...bin eh die nächsten Monate ausser Gefecht gesetzt, wg einer oder mehrerer heftiger Hand-OP´s, da hab ich Zeit mir mal was zurechtzulegen. Das eigentlich aufwendige ist ja nur die Berechnung der Positionen der Sprites und das Schreiben in den Buffer, blitten geht ja relativ fix. Aber da Rad jedesmal neu erfinden bringt ja auch nix, die prospeed.dll hat ja eigentlich so gut wie alles erforderliche an Bord.

  • Datei binär einlesen

    • Andy
    • 18. Dezember 2009 um 21:00

    Hi,
    mittels

    [autoit]

    binarytostring()

    [/autoit]

    bekommt man den "hex" in stringform, dort kann man auch ohne weiteres mit den (ziemlich schnellen) gängigen AutoIt-Stringfunktionen arbeiten, diese lassen sich von im String enthaltenen Nullbytes nicht stören.
    Was NICHT geht ist die Bearbeitung mit RegExp, da evtl. im String enthaltene Nullbytes als endofstring behandelt werden. Das gilt übrigens auch für die Darstellung mit Msgbox oder Consolewrite

  • Verschiedene GDI+ Grafiken zeichnen und verschieben

    • Andy
    • 18. Dezember 2009 um 20:55

    Update des Scripts im vorherigen Post, ohne backbuffer und ohne Flimmern extrem schnell....

    UEZ, ist das noch zu toppen? (Das ist weder überheblich noch rethorisch gemeint, mich interessiert einfach, was "noch geht" und da bin ich bei dir an der richtigen Adresse :thumbup: )

  • Verschiedene GDI+ Grafiken zeichnen und verschieben

    • Andy
    • 18. Dezember 2009 um 19:50
    Zitat

    Und ohne Backbuffer flackern die Objekte!

    das lag an meinem "refresh", bei dem Objekte übereinander gemalt werden, richtigerweise geht das so:

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>
    #include <GDIPlus.au3>
    #include <ScreenCapture.au3>
    Local $hGUI1, $hGUI2, $hHintergrund, $hGraphic1, $hGraphic2, $hSprite, $backbuffer, $bitmap
    Local $dll = DllOpen("user32.dll")
    Global $milliseconds = 10
    ; Capture top left corner of the screen
    _ScreenCapture_Capture(@MyDocumentsDir & "\Hintergrund.jpg", 0, 0, 800, 600) ;hintergrund erstellen
    _ScreenCapture_Capture(@MyDocumentsDir & "\Sprite.jpg", 0, 0, 20, 20) ;Sprite erstellen
    ; Create a GUI for the original image
    $hGUI1 = GUICreate("", 800, 600, 0, 0)
    WinSetTitle($hGUI1, "", "mit + und - die Geschwindigkeit ändern, Delay = " & $milliseconds & " Millisekunden")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    ; Initialize GDI+ library and load image
    _GDIPlus_Startup()
    $hHintergrund = _GDIPlus_ImageLoadFromFile(@MyDocumentsDir & "\Hintergrund.jpg") ;das ist der Hintergrund
    $hSprite = _GDIPlus_BitmapCreateFromFile(@MyDocumentsDir & "\Sprite.jpg") ;das ist das Sprite
    ; Draw original image
    $hGraphic1 = _GDIPlus_GraphicsCreateFromHWND($hGUI1) ;"Leinwand" erstellen auf der gemalt werden kann
    _GDIPlus_GraphicsDrawImage($hGraphic1, $hHintergrund, 0, 0) ;hintergrund auf diese Leinwand malen

    [/autoit] [autoit][/autoit] [autoit]

    $x = 754 ;startposition
    $y = 220
    $sx = 1 ;richtung
    $sy = -1
    While 1
    If $y > 555 Then $sy = -1
    If $y < 2 Then $sy = 1
    If $x > 755 Then $sx = -1
    If $x < 2 Then $sx = 1
    $x += $sx
    $y += $sy
    _GDIPlus_GraphicsDrawImageRectRect($hGraphic1, $hHintergrund, $x - 1, $y - 1, 1, 42, $x - 1, $y - 1, 1, 42) ;obere seite des sprites wiederherstellen (1 Pixel breit)
    ;sleep(1000) ;sleeps einschalten um das löschen der zeile/spalte zu sehen
    _GDIPlus_GraphicsDrawImageRectRect($hGraphic1, $hHintergrund, $x - 1, $y - 1, 42, 1, $x - 1, $y - 1, 42, 1) ;linke seite des sprites wiederherstellen (1 Pixel breit)
    ;sleep(1000) ;sleeps einschalten um das löschen der zeile/spalte zu sehen
    _GDIPlus_GraphicsDrawImageRectRect($hGraphic1, $hHintergrund, $x + 41, $y - 1, 1, 43, $x + 41, $y - 1, 1, 43) ;untere seite des sprites wiederherstellen (1 Pixel breit)
    ;sleep(1000) ;sleeps einschalten um das löschen der zeile/spalte zu sehen
    _GDIPlus_GraphicsDrawImageRectRect($hGraphic1, $hHintergrund, $x - 1, $y + 41, 43, 1, $x - 1, $y + 41, 43, 1) ;rechte seite des sprites wiederherstellen (1 Pixel breit)
    ;sleep(1000) ;sleeps einschalten um das löschen der zeile/spalte zu sehen
    ;sleep(1000)
    _GDIPlus_GraphicsDrawImageRectRect($hGraphic1, $hSprite, 0, 0, 20, 20, $x, $y, 40, 40)
    ;sleep(1000)
    delay($milliseconds) ;wartezeit
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ; Release resources
    _GDIPlus_GraphicsDispose($hGraphic1)
    _GDIPlus_GraphicsDispose($backbuffer)
    _GDIPlus_ImageDispose($hHintergrund)
    _GDIPlus_Shutdown()

    [/autoit] [autoit][/autoit] [autoit]

    ; Clean up screen shot file
    FileDelete(@MyDocumentsDir & "\Hintergrund.jpg")
    FileDelete(@MyDocumentsDir & "\sprite.jpg")
    ; Loop until user exits

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func delay(ByRef $milliseconds)
    If _IsPressed("1B", $dll) Then Exit ;ESC
    If _IsPressed("6B", $dll) Then ;numpad +
    $milliseconds += 1
    Sleep(50)
    WinSetTitle($hGUI1, "", "mit + und - die Geschwindigkeit ändern, Delay = " & $milliseconds & " Millisekunden")
    EndIf
    If _IsPressed("6D", $dll) Then ;numpad -
    $milliseconds -= 1
    Sleep(50)
    WinSetTitle($hGUI1, "", "mit + und - die Geschwindigkeit ändern, Delay = " & $milliseconds & " Millisekunden")
    EndIf
    $t = TimerInit()
    Do
    Until TimerDiff($t) > $milliseconds
    EndFunc ;==>delay

    [/autoit]

    mit Numpad + und - kann man die Wartezeit zwischen der Darstellung der Sprites einstellen. Kein Flimmern.
    "Früher" wurde überhaupt kein delay in Millisekunden eingesetzt, da waren Prozessoren und Grafikkarten so langsam, da richtete man sich nach dem Prozessortakt^^. Das heisst, es wurden einfach "Warteschleifen" eingesetzt.
    Das führte dann dazu, daß Spiele auf der nächstschnelleren Prozessorgeneration völlig unspielbar, weil viel zu schnell, wurden

    /EDIT/ habe mal eine "schönere" Animation eingebaut, mit den numpad + und - Tasten kann man das Delay einstellen. Richtig optimal wird es, wenn je nach Richtung des Sprites nur die Stellen auf dem Hintergrund restauriert werden, die "hinter" dem sprite liegen, aber sollen die anderen doch auch was machen^^

  • Verschiedene GDI+ Grafiken zeichnen und verschieben

    • Andy
    • 18. Dezember 2009 um 15:53
    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GDIPlus.au3>
    #include <ScreenCapture.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('MustDeclareVars', 1)

    [/autoit] [autoit][/autoit] [autoit]

    _Main()

    [/autoit] [autoit][/autoit] [autoit]

    Func _Main()
    Local $hGUI1, $hGUI2, $hHintergrund, $hGraphic1, $hGraphic2, $hSprite, $backbuffer, $bitmap

    [/autoit] [autoit][/autoit] [autoit]

    ; Capture top left corner of the screen
    _ScreenCapture_Capture(@MyDocumentsDir & "\Hintergrund.jpg", 0, 0, 800, 600) ;hintergrund erstellen
    _ScreenCapture_Capture(@MyDocumentsDir & "\Sprite.jpg", 0, 0, 20, 20) ;Sprite erstellen
    ; Create a GUI for the original image
    $hGUI1 = GUICreate("Original", 800, 600, 0, 0)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    ; Initialize GDI+ library and load image
    _GDIPlus_Startup()
    $hHintergrund = _GDIPlus_ImageLoadFromFile(@MyDocumentsDir & "\Hintergrund.jpg") ;das ist der Hintergrund
    $hSprite = _GDIPlus_BitmapCreateFromFile(@MyDocumentsDir & "\Sprite.jpg") ;das ist das Sprite
    ; Draw original image
    $hGraphic1 = _GDIPlus_GraphicsCreateFromHWND($hGUI1) ;"Leinwand" erstellen auf der gemalt werden kann
    _GDIPlus_GraphicsDrawImage($hGraphic1, $hHintergrund, 0, 0) ;hintergrund auf diese Leinwand malen
    MsgBox(0, 0, "Hintergrund gezeichnet")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawImageRectRect($hGraphic1, $hSprite, 0, 0, 20, 20, 0, 0, 40, 40) ;das sprite wird doppelt so groß

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, 0, "sprite gezeichnet, es folgt die Bewegung")

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 300
    _GDIPlus_GraphicsDrawImageRectRect($hGraphic1, $hSprite, 0, 0, 20, 20, $i, $i, 40, 40)
    Next
    MsgBox(0, 0, "Das war gut, aber der Hintergrund wurde nicht aktualisiert, also nochmal....")

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 300
    _GDIPlus_GraphicsDrawImage($hGraphic1, $hHintergrund, 0, 0) ;hintergrund auf diese Leinwand malen
    _GDIPlus_GraphicsDrawImageRectRect($hGraphic1, $hSprite, 0, 0, 20, 20, $i, $i, 40, 40)
    Next
    MsgBox(0, 0, "wars so gut? Nein, es flackert...wir benutzen einen sog. backbuffer, dabei wird das gesamte Bild im backbuffer erstellt und dieser danach erst komplett dargestellt")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $bitmap = _GDIPlus_BitmapCreateFromGraphics(800, 600, $hGraphic1) ;Objekt erstellen
    $backbuffer = _GDIPlus_ImageGetGraphicsContext($bitmap) ;backbuffer erstellen, eine 2. Leinwand im Hintergrund sozusagen

    [/autoit] [autoit][/autoit] [autoit]

    local $t=timerinit()
    For $i = 10 To 300
    ;_GDIPlus_GraphicsDrawImage($backbuffer, $hHintergrund, 0, 0) ;hintergrund in den backbuffer malen
    ; _GDIPlus_GraphicsDrawImage($backbuffer, $hsprite, $i, $i) ;Sprite in den backbuffer malen
    _GDIPlus_GraphicsDrawImageRectRect($backbuffer, $hhintergrund, $i-1,$i-1, 40, 40, $i-1, $i-1, 40, 40)
    _GDIPlus_GraphicsDrawImageRectRect($backbuffer, $hSprite, 0, 0, 20, 20, $i, $i, 40, 40)
    _GDIPlus_GraphicsDrawImageRect($hGraphic1, $bitmap, 0, 0, 800, 600);gesamten backbuffer darstellen
    Next
    local $m=int (timerdiff($t))
    MsgBox(0, 0, "wars so gut? ja, so soll es sein ;) aber immer noch langsam^^ "&$m&" Millisekunden")

    [/autoit] [autoit][/autoit] [autoit]

    $t=timerinit()
    For $i = 10 To 300
    _GDIPlus_GraphicsDrawImageRectRect($hGraphic1, $hhintergrund, $i-1,$i-1, 40, 40, $i-1, $i-1, 40, 40)
    _GDIPlus_GraphicsDrawImageRectRect($hGraphic1, $hSprite, 0, 0, 20, 20, $i, $i, 40, 40)
    ; _GDIPlus_GraphicsDrawImageRect($hGraphic1, $bitmap, 0, 0, 800, 600);gesamten backbuffer darstellen
    Next
    $m=int (timerdiff($t))
    MsgBox(0, 0, "wars so gut? ja, so soll es sein ;) "&$m&" Millisekunden")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Release resources
    _GDIPlus_GraphicsDispose($hGraphic1)
    _GDIPlus_GraphicsDispose($backbuffer)
    _GDIPlus_ImageDispose($hHintergrund)
    _GDIPlus_Shutdown()

    [/autoit] [autoit][/autoit] [autoit]

    ; Clean up screen shot file
    FileDelete(@MyDocumentsDir & "\Hintergrund.jpg")
    FileDelete(@MyDocumentsDir & "\sprite.jpg")
    ; Loop until user exits
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_Main

    [/autoit]

    10x schneller^^ ohne backbuffer, aber bei vielen "sprites" wird der Verwaltungsaufwand ziemlich groß...
    Aber der "eigentliche" Sinn des Backbuffers ist ja, das 2. Bild schon zu zeichnen während das erste mit dem Kathodenstrahl auf den Bildschirm gemalt wird! Dann muß man nur noch zum richtigen Zeitpunkt den Backbuffer in den speicher der Grafikkarte blitten und ZAAAAPPPP....

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™