und da:ist es für diesen Fall unbrauchbar.
Zum Zeitpunkt meines Posts stand im Thread noch nichts von 2D Arrays.
Edit: Oder ich habs überlesen. Normalerweise biete ich keine Lösungen an die nicht funktionieren.
und da:ist es für diesen Fall unbrauchbar.
Zum Zeitpunkt meines Posts stand im Thread noch nichts von 2D Arrays.
Edit: Oder ich habs überlesen. Normalerweise biete ich keine Lösungen an die nicht funktionieren.
Hab dafür grade mal eine Funktion gebastelt (obwohl ich sicher bin, dass es sowas schon irgendwo geben muss).
Ist auf Tempo ausgelegt und braucht kein Include. Läuft aber nur mit 1D Arrays.
; Wird nur für _ArrayDisplay gebraucht.
#include <Array.au3>
Global $a[10]
[/autoit] [autoit][/autoit] [autoit]For $i = 0 To 9 Step 1
$a[Random(0, 9, 1)] += Random(1, 5, 1)
Next
_ArrayDisplay($a)
[/autoit] [autoit][/autoit] [autoit]_ArrayDeleteEmpty($a)
[/autoit] [autoit][/autoit] [autoit]_ArrayDisplay($a)
[/autoit] [autoit][/autoit] [autoit]Func _ArrayDeleteEmpty(ByRef $a)
Local $u = UBound($a) - 1
For $i = $u To 0 Step -1
If Not $a[$i] Then
For $e = $i To $u - 1 Step 1
$a[$e] = $a[$e + 1]
Next
$u -= 1
EndIf
Next
ReDim $a[$u + 1]
EndFunc
Edit: Mit ArraySearch und ArrayDelete würde das min. 10x so lange dauern...
lg
Mars
Ich habs auch getestet und alles was über eine Combo läuft funktioniert nicht.
Die InputFelder laufen, weil ein GuiCtrlread eingebaut ist.
Völlige Funktion kann ich nicht bestätigen.
Ich weiß nicht warum, aber ich hatte grade "Lust".
Das Tool läuft nicht, weil die Savefunktion fehlt. (Die bau ich noch ein irgendwann^^).
Die Texte hab ich einfach kopiert. Keine Ahnung ob die stimmen.
Global $aText[56] = ['MC-Server-Editor', 'Basic', 'Additional 1', 'Additional 2', 'coded 4 AutoIt.de', 'Difficulty', 'Gamemode', 'Level-Name', 'Max-Players', 'Online Mode', 'PvP', 'Normal|Peaceful|Easy|Hard', 'Survival|Creative|Adventure', 'world', '10', 'True|False', 'Enabled|Disabled', 'Flying', 'Nether', 'Structures', 'Seed', 'Type', 'White-List', 'Disabled|Enabled', 'Enabled|Disabled', 'Enabled|Disabled', 'autoit.de', 'Default|Flat|Largebiomes', 'Disabled|Enabled', 'Quarry', 'Gen.Settings', 'Description', 'Server-IP', 'Server-Port', 'Snooper', 'Enabled|Disabled', '', '', '', '25565', 'Disabled|Enabled', 'Spawn Animals', 'Spawn Monsters', 'Spawn NPCs', 'Texturepack', 'View-Distance', 'Command-Block', 'Enabled|Disabled', 'Enabled|Disabled', 'Enabled|Disabled', '', '10', 'Enabled|Disabled', 'Additional 3', 'Additional 4', 'Exit/Save'], $hGUI, $aLabel[24], $aInput[24], $btnSave, $iTmp
[/autoit] [autoit][/autoit] [autoit]$hGUI = GUICreate($aText[0], 375, 380)
GUISetBkColor(0xB0B0B0, $hGUI)
For $i = 0 To 5 Step 1
For $q = 0 To 1 Step 1
If $i < 2 Then GUICtrlCreateGroup($aText[1 + $i + 52 * $q], 185 * $i + 5, 175 * $q + 5, 180, 165)
For $o = 0 To 1 Step 1
$aLabel[$i + 6 * $o + $q * 12] = GUICtrlCreateLabel($aText[$i + 5 + 12 * $o + 24 * $q] & ':', 185 * $o + 15, 175 * $q + 25 + 24 * $i, 85)
$aInput[$i + 6 * $o + $q * 12] = GUICtrlCreateCombo(First($aText[11 + $i + 12 * $o + 24 * $q]), 185 * $o + 100, 175 * $q + 21 + 24 * $i, 78)
If StringInStr($aText[11 + $i + 12 * $o + 24 * $q], '|') Then GUICtrlSetData(-1, TrimFirst($aText[11 + $i + 12 * $o + 24 * $q]))
If $i < 5 Then $iTmp = GUICtrlCreateLabel('', 185 * $o + 15, 175 * $q + 43 + 24 * $i, 160, 1) + GUICtrlSetBkColor(-1, 0xCCCCCC)
Next
Next
Next
$btnSave = GUICtrlCreateButton($aText[55], 147, 350, 80, 25)
GUISetState(@SW_SHOW)
While True
Switch GUIGetMsg()
Case -3
Exit
Case $btnSave
_Save()
EndSwitch
WEnd
Func _Save()
Exit
EndFunc ;==>_Save
Func First($a)
Local $b = StringSplit($a, '|', 2)
If Not @error Then Return $b[0]
Return $a
EndFunc ;==>First
Func TrimFirst($a)
Local $b = StringSplit($a, '|', 2), $c = ''
For $i = 1 To UBound($b) - 1 Step 1
$c &= $b[$i] & '|'
Next
Return StringTrimRight($c, 1)
EndFunc ;==>TrimFirst
Eine "Zufällige" Kompression habe ich auch schonmal angetestet.
Allerdings kam ich da nie zu einem fertigen Skript. Vorher hat das Tempo verhindert, dass man es wirklich an ein paar KB testen konnte.
nochmal zum Ersetzen: Die 3 ist wahrscheinlich ungünstig, es kommt halt immer darauf an was man komprimiert.
z.B. bei 24 Bit Bitmaps sind 6er sehr häufig, bei 32ern (gibt's häufiger) kann zu Beginn ein Paar Durchläufe mit 8ern machen um die Häufigen Farben schonmal kleinzubekommen.
Bei Text wie z.B. diesem Beitrag" Kommen auch einige Wörter/Zeichenkombinationen mehrfach vor. Mit anfänglichen 16Byte Tests macht man idr nichts verkehrt. Im Späteren Kompressionsverlauf sind natürlich alle großen Kombinationen überflüssig. Nach dem 20ten Durchlauf wird man keinen einzigen 16er mehr finden.
Optimal wäre glaube ich eine breite Fächerung zu Beginn (Maximalwert abhängig von einer anfänglichen Redundanzanalyse) die direkt stark abnimmt, bis man bei Runde X nur noch 2er benutzt.
Edit: Wenn bei mir die Klausuren rum sind bastele ich mal ein schönes Skript. Dann schauen wir mal wie 7Zip aussieht
Somit wäre die Methode meiner Ersetzungskompression sehr ähnlich, aber wesentlich schneller.
Jetzt noch Kombinationen mit 2, 3, n Bytes rein und die Kompression steigt nochmal an. Einpackzeit wird sich verhunderttausendfachen, Auspackzeit bleibt gleich.
Bsp:
Ersetzungen: 2, 2, 2, 2, 2, usw -> Komp (60%)
Ersetzungen: 3, 2, 2, 2, 2, usw -> Komp (65%)
...
Ersetzungen n, n, n, n, n, usw -> Komp (5%)
Jetzt nach Effizienz sortieren und den Besten anwenden.
Habt ihr überhaupt keine Fantasie ?
Das ist total einfach, aber unschön. (bei Assign, Variante 2 ist besser)
Global $iDummy
Global $a, $b, $c
If 6 > 5 Then $iDummy = Assign('a', 12345) + Assign('b', 'Penner') + Assign('c', 0xFF00FF)
[/autoit][autoit][/autoit][autoit]ConsoleWrite($iDummy & @CRLF)
ConsoleWrite($a & @CRLF)
ConsoleWrite($b & @CRLF)
ConsoleWrite($c & @CRLF & @CRLF)
; Edit nach 1 Min
If Not ('Tobi' == 'tobi') Then Zuweisen3x($a, 'Ich bin Variable 1', $b, 'Team Rocket so schnell wie das Licht', $c, 'Gib lieber auf und bekämpft uns nicht !')
ConsoleWrite($a & @CRLF)
ConsoleWrite($b & @CRLF)
ConsoleWrite($c & @CRLF)
Func Zuweisen3x(ByRef $a, $a_, ByRef $b, $b_, ByRef $c, $c_)
$a = $a_
$b = $b_
$c = $c_
EndFunc
Man kann so viel man will zuweisen.
Weils so schön ist, ist mir in 1 Min noch eine leichte Methode eingefallen.
Bisschen überlegen vorher bitte
Edit 2:
Und wenns um Continueloop geht gibts natürlich auch eine Möglichkeit.
ContinueLoop hat einen Level. also Continueloop 5 z.B.
Als Statement für diesen Level kann ich 1 + 0 * Was auch immer, da es eh zu 0 wird benutzen.
.
.
Lg
Wieso ist mehrfache Verschlüsselung ein Bug ?
Ich kann doch auch 5x eine WinRar Kompression auf einen Ordner anwenden.
Meine Methode hat ein Problem mit Chr(0). Wenn dieses Zeichen im zu komprimierenden String vorkommt gibts Probleme.
Für so große Dateien muss man die Funktion gesplittet anwenden. Dafür kann ich auch noch ein Skript basteln. Ich lass die autoit.exe bei mir einfach mal durchnudeln wenn ich daheim bin.
Moin. Genau für dieses Problem hatte ich schonmal ein Skript geschrieben.
Die Auspackgeschwindigkeit ist dabei extrem flott. (wenige ms im Regelfall). Das Einpacken dauert aber ziemlich lange (es wird viel vergleichen um die zu ersetzenden Strings zu finden).
Dabei habe ich gemerkt, dass Andys methode seltsame Zeichen einstreut die meine Methode beim 2ten Durchgang ziemlich den Wind aus den Segeln nimmt. Sämtliche seltenen Zeichen behindern das Ersetzungsprinzip und müssen gesondert gespeichtert werden damit die Dekompression klappt.
Zusammen kommts bei mir beim TestString auf 29%
Meine Methode alleine packt 30%
Ich bin mir sicher, dass eine Modifikation von Andys Methode das Resultat unter 25% bringen kann.
Bei mir lässt sich glaube ich nicht mehr viel rausholen ohne extremen Rechenaufwand. (Durchprobiert werden nur 2er Paare. Man kann das auch auf 3, 4, n ausweiten. Dann muss man aber die Permutationen berücksichtigen was den Rechenaufwand ins unermessliche steigen lässt. Das habe ich auch schonmal getestet. Bringt im Schnitt ca. 10% (also 27 statt 30 bei hundertfachem Aufwand^^))
_Test()
Func _Test()
Local Static $sTest = "67B666666B76000000000000000000056B66666666B650000000000000000056B666666666676500000000000000006676666666666766000000000000000566666666666666665000000000000006666666666666666660000000000000566666666666666666650000000000005666666666666667666500000000000056677676767676767665000000000000566B777777777777B665000000000000566B7B777777777BB665000000000000066BBB7B7B7BB7BBD650000000000000056BDBBBBBBBBBBD76500000000000000056BDDDBDBDBDDD660000000000000000366BEDDDDDDEB655000000000000000005567BDEEDB76550000000000000000000055666666550000000000000000000000005555550000000000000FFFFFFFFFFFE7FFFFFF81FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFE007FFFFE007FFFFE007FFFFC003FFFFC003FFFFC003FFFFC003FFFF8001FFFF0000FFFF0000FFFE00007FFE00007FFC00003FFC00003FFC00003FFC00003FFC00003FFE00007FFE00007FFF0000FFFF0000FFFF8001FFFFE007FFFFF81FFF00000000F26A0451000000000000010000000000800300009053040030010000B0040000000000002800000020000000400000000100010000000000000100000000000000000000000000000000000000000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1FFFFFC3C7FFFC3FC1FF83FFC07FBFFFC1FFBFFFC7FFBFFFDFFFBFFFDFFFBFFFDFFFBFFFDFFFBFFFDFFFBFFFDFFFBFFFDFFFBFFFDFFFBFFC1FFFBFC3DFFFBC3C1FFF83C3FFFFBC3FFFFF83FFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1FFFFFC007FFFC0001FF8000007F800001FF800007FF80001FFF80001FFF80001FFF80001FFF80001FFF80001FFF80001FFF80001FFF80001FFF80001FFF80001FFF8003FFFF803FFFFF83FFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000F26A0451000000000000010000000000D8040000E8540400E8020000B0040000000000002800000020000000400000000100040000000000800200000000000000000000000000000000000000000000"
Local $sComp, $iTimer, $sDecomp
ConsoleWrite('Kombination beider Methoden (Andys als Vorstufe):' & @CRLF)
$iTimer = TimerInit()
$sComp = _Comp($sTest)
$iTimer = TimerDiff($iTimer)
ConsoleWrite('!> Comp Beide: ' & Round(StringLen($sComp)/StringLen($sTest)*100,0) & '%' & @CRLF)
ConsoleWrite('> CompTime: ' & Round($iTimer) & ' ms' & @CRLF)
$iTimer = TimerInit()
$sDecomp = _Decomp($sComp)
$iTimer = TimerDiff($iTimer)
ConsoleWrite('> DecompTime: ' & Round($iTimer) & ' ms' & @CRLF)
If Not ($sDecomp == $sTest) Then
ConsoleWrite('! Error' & @CRLF)
ConsoleWrite($sDecomp & @CRLF)
EndIf
ConsoleWrite(@CRLF & 'Methode von Mars ohne Vorstufe:' & @CRLF)
$iTimer = TimerInit()
$sComp = _Ersetzung_Comp($sTest)
$iTimer = TimerDiff($iTimer)
ConsoleWrite('!> Comp Mars: ' & Round(StringLen($sComp)/StringLen($sTest)*100,0) & '%' & @CRLF)
ConsoleWrite('> CompTime: ' & Round($iTimer) & ' ms' & @CRLF)
$iTimer = TimerInit()
$sDecomp = _Ersetzung_DeComp($sComp)
$iTimer = TimerDiff($iTimer)
ConsoleWrite('> DecompTime: ' & Round($iTimer) & ' ms' & @CRLF)
If Not ($sDecomp == $sTest) Then
ConsoleWrite('! Error' & @CRLF)
ConsoleWrite($sDecomp & @CRLF)
EndIf
ConsoleWrite(@CRLF)
[/autoit] [autoit][/autoit] [autoit]EndFunc
[/autoit] [autoit][/autoit] [autoit]Func _Comp($sInput)
Local $s = StringReplace(_CompAndy($sInput), Chr(0), '[NULL]', 0, 1), $l = StringLen($s)
;ConsoleWrite($s & @CRLF)
$s = _Ersetzung_Comp($s)
ConsoleWrite('!> Comp Mars: ' & Round(StringLen($s)/$l*100,0) & '%' & @CRLF)
Return $s
EndFunc
Func _Decomp($sInput)
Local $s = StringReplace(_Ersetzung_DeComp($sInput), '[NULL]', Chr(0), 0, 1)
$s = _DecompAndy($s)
Return $s
EndFunc
Func _CompAndy($string)
$len = StringLen($string)
$ret = ""
$p = 0
For $i = 1 To $len ;kompletten string durchlaufen
$aktuell = StringMid($string, $i, 1) ;aktuelles token
$anz = 1 ;anzahl gleicher token
For $a = $i + 1 To $i + 54 ;kommt es mehrfach vor?
If StringMid($string, $a, 1) = $aktuell And $a <= $len Then ;kommt mehrfach vor
$anz += 1
Else
$i = $a - 1 ;nicht mehrfach
ExitLoop ;nächstes token
EndIf
Next
If $anz > 2 Then ;mehr als 2 gleiche token gefunden
$ret &= $aktuell & Chr(70 + $anz) ;anzahl hinter token hängen
$i = $a - 1
ElseIf $anz = 2 Then
If Asc($aktuell) < 56 Then ;bit 0-3 und 5-7 nehmen eine doppelte zahl auf
$ret &= Chr((Asc($aktuell) - 48) * 17 + 127)
Else
$ret &= $aktuell & $aktuell
EndIf
Else
$ret &= $aktuell ;nur einmal vorkommenden buchstaben anhängen
EndIf
Next
$Perc = Round(StringLen($ret) / $len * 100)
ConsoleWrite("!> Comp Andy: " & $Perc & "%" & @CRLF)
Return $ret
EndFunc ;==>compbin
Func _DecompAndy($string)
$ret = ""
$len = StringLen($string)
For $i = 1 To $len
$decomp = StringMid($string, $i, 1);aktueller buchstabe ;
$token = Asc($decomp) ;aktuelles token
If $token >= 127 Then ;doppelte 0-7?
$decomp = Chr((($token - 127) / 17) + 48);magic numbers FTW^^
$decomp &= $decomp
ElseIf $token > 70 Then ;komprimiertes Zeichen?
$token -= 70 ;länge
$akt = StringMid($string, $i - 1, 1) ;aktueller zu vervielfältigende buchstabe
$decomp = ""
For $a = 1 To $token - 1
$decomp &= $akt
Next
Else
$decomp = StringMid($string, $i, 1) ;einfache Ziffer/Buchstabe
EndIf
$ret &= $decomp
Next
Return $ret
EndFunc
[/autoit] [autoit][/autoit] [autoit]Func _ZeichenArray($sDoNotUse = '')
Local $sZ = '!"#%&,-/:;=@0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_`abcdefghijklmnopqrstuvwxyz~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ', $UBound = StringLen($sZ), $b[$UBound]
For $i = 1 To StringLen($sDoNotUse) Step 1
$sZ = StringReplace($sZ, StringMid($sDoNotUse, $i, 1), '', 0, 1)
Next
For $i = 0 To $UBound - 1 Step 1
$b[$i] = StringLeft($sZ, 1)
$sZ = StringTrimLeft($sZ, 1)
Next
Return $b
EndFunc ;==>_ZeichenArray
Func _Ersetzung_DeComp($a)
Local $aTmp = StringSplit($a, ' '), $sDoNotUse = $aTmp[$aTmp[0]]
$a = StringTrimRight($a, StringLen($sDoNotUse) + 1)
Local $n = Int('0x' & StringRight($a, 2)), $_____ZeichenReverse = _ZeichenArray($sDoNotUse), $st = ''
$a = StringTrimRight($a, 2)
_ArrayReverse2($_____ZeichenReverse, 0, $n - 1)
For $i = 0 To $n - 1 Step 1
$st = StringRight($a, 2)
$a = StringTrimRight($a, 2)
$a = StringReplace($a, $_____ZeichenReverse[$i], $st, 0, 1)
Next
Return $a
EndFunc ;==>_Ersetzung_DeComp
Func _Ersetzung_Comp($a)
Local $sTmp = $a, $sDoNotUse
While $sTmp
;ConsoleWrite(StringLeft($sTmp, 1) & @CRLF)
$sDoNotUse &= StringLeft($sTmp, 1)
$sTmp = StringReplace($sTmp, StringLeft($sTmp, 1), '', 0, 1)
WEnd
ConsoleWrite('!--- DoNotUse Zeichen: ' & $sDoNotUse & @CRLF)
Local $l_alt = StringLen($a), $l_neu = 0, $st, $er, $n = 0, $_____Zeichen = _ZeichenArray($sDoNotUse), $_____Zeichenmenge = UBound($_____Zeichen)
While 1
$st = _Analyse($a) ; $st = Meist vorkommender String
$a = StringReplace($a, $st, $_____Zeichen[$n], 0, 1)
$a &= $st ; Und rechts an $a angehängt. $a = Urspringsstring
$l_neu = StringLen($a) ; Neue Stringlänge
$n += 1 ; Durchläufe
If ($n = $_____Zeichenmenge Or $l_neu >= $l_alt) Then ;Nur Abbrechen, wenn tatsächlich nix geht. (nicht wenn der 8er nicht klappt...)
ExitLoop
EndIf
$l_alt = $l_neu
WEnd
Return $a & Hex($n, 2) & ' ' & $sDoNotUse ; Rückgabe ist der Komprimierte String und die Anzahl ersetzungen
EndFunc ;==>_Ersetzung_Comp
Func _Analyse($sData, $l = 2)
Local $StringLaenge = StringLen($sData), $Top[2], $StringPart, $Replacements, $BenutzteStrings[256][256]
For $i = 0 To $StringLaenge - ($l - 1) Step 1
$StringPart = StringMid($sData, $i, $l)
If Not $BenutzteStrings[Asc(StringLeft($StringPart, 1))][Asc(StringRight($StringPart, 1))]Then ; Damit keine Strings doppelt getestet werden...
$BenutzteStrings[Asc(StringLeft($StringPart, 1))][Asc(StringRight($StringPart, 1))] = True
StringReplace($sData, $StringPart, $StringPart, 0, 1)
$Replacements = @extended
If $Replacements >= $Top[0] Then
$Top[0] = $Replacements
$Top[1] = $StringPart
EndIf
EndIf
Next
Return $Top[1]
EndFunc ;==>_Analyse
Func _ArrayReverse2(ByRef $avArray, $iStart = 0, $iEnd = 0)
Local $vTmp, $iUBound = UBound($avArray) - 1
For $i = $iStart To Int(($iStart + $iEnd - 1) / 2)
$vTmp = $avArray[$i]
$avArray[$i] = $avArray[$iEnd]
$avArray[$iEnd] = $vTmp
$iEnd -= 1
Next
EndFunc ;==>_ArrayReverse
Moin,
Hab durch irgendeinen Post hier den ich nicht mehr finde ein einzeiliges Control gesehen welches automatische Vervollständigung (aber nur bei korrekter Eingabe) besaß.
Das geht auch mit einem kompletten Editfeld.
Leider steckt das Teil noch bis zum Rand voll mit Bugs.
Die meisten sollten sich aber relativ leicht beheben lassen.
Zum ausprobieren hier mal ein Beispiel. (Bugs und Wünsche dürfen geäußert werden)
Die Datenbank wurde mit GDI+ Befehlen gefüttert.
Durch die Vervollständigung reicht nun die Eingabe von "fillRect" ("fllr" reicht auch schon^^) aus, um per "Return" ein _GDIPlus_GraphicsFillRect daraus zu machen.
lg
Mars
Normalerweise gratuliere ich nie im Netz...
Alles Gute, viel Bier, viel Spaß !
Hmm... Hab jetzt mal was wirklich primitives getestet und siehe da: Ohne Offset läufts auch (komischerweise)
Es wird jetzt per Timer alle x ms die Funktion ausgeführt. Nachteil ist die Hohe Schleifenfrequenz. Das kann man aber mit einem kleinen Trick umgehen.
Offseteinstellung über die Pfeiltasten. Scheint aber ohne wirkung zu sein, was mich überrascht...
#include <GDIPlus.au3>
#include <Misc.au3>
Opt('GUIOnEventMode', 1)
Opt('MustDeclareVars', 1)
Opt('GUICloseOnESC', 0)
Global Const $iFPS = 60
Global Const $iW = 600, $iH = 480
Global Const $sTitel = 'Test', $iSpeed = 5
Global $hGUI, $hIMG, $hDC, $hGFX, $hBUF, $hBRU
[/autoit] [autoit][/autoit] [autoit]Global $vSyncTimer = TimerInit(), $vSyncOffset = 0, $vSyncTemp = 0, $vSyncDiff = 1000/$iFPS
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]$hGUI = GUICreate($sTitel, $iW, $iH)
$hIMG = _Image_Create($iW, $iH)
$hBUF = DllStructGetData($hIMG, 1)
$hDC = _WinAPI_GetDC($hGUI)
$hGFX = _GDIPlus_GraphicsCreateFromHDC($hBUF)
$hBRU = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
GUISetState(@SW_SHOW, $hGUI)
GUISetOnEvent(-3, '_Exit', $hGUI)
GUIRegisterMsg(0xF, 'WM_PAINT')
OnAutoItExitRegister('_Freigeben')
While 1
If TimerDiff($vSyncTimer) > $vSyncTemp + $vSyncOffset Then
$vSyncTemp += $vSyncDiff
_GDIPlus_GraphicsClear($hGFX, 0xFF000000)
_Rect()
WM_PAINT()
ToolTip($vSyncOffset)
If _IsPressed('26') Then $vSyncOffset += 0.1
If _IsPressed('28') Then $vSyncOffset -= 0.1
If $vSyncOffset > $vSyncDiff Then $vSyncOffset -= $vSyncDiff
If $vSyncOffset < 0 Then $vSyncOffset += $vSyncDiff
EndIf
WEnd
[/autoit] [autoit][/autoit] [autoit]Func _Rect()
Local Static $x = 0, $y = 100
$x += $iSpeed * 60 / $iFPS
If $x > $iW Then
$x -= $iW + 64
$y = Random(0, $iH - 64, 1)
EndIf
_GDIPlus_GraphicsFillRect($hGFX, $x, $y, 64, 64, $hBRU)
EndFunc
Func FPS($W)
Local Static $1 = TimerInit(), $2, $3
Local $s = TimerDiff($1)
$2 += (1000 / $W - $s)
$3 = TimerInit()
If $2 > 0 Then Sleep($2)
$2 -= TimerDiff($3)
$1 = TimerInit()
Return True
EndFunc ;==>_Sleep
Func WM_PAINT()
Local Static $nFPS = 0, $iTimer = TimerInit()
$nFPS += 1
If TimerDiff($iTimer) > 1000 Then
WinSetTitle($hGUI, '', $sTitel & ' FPS: ' & $nFPS)
$iTimer = TimerInit()
$nFPS = 0
EndIf
;~ _WinAPI_RedrawWindow($hGUI)
_WinAPI_BitBlt($hDC, 0, 0, $iW, $iH, $hBUF, 0, 0, 0xCC0020)
EndFunc
[/autoit] [autoit][/autoit] [autoit]Func _Exit()
Exit
EndFunc
Func _Freigeben()
_GDIPlus_BrushDispose($hBRU)
_GDIPlus_GraphicsDispose($hGFX)
_Image_Delete($hIMG)
_GDIPlus_Shutdown()
EndFunc
Func _Image_Create($iW, $iH)
Local $Ptr, $hDC, $hBmp, $tBMI, $aDIB, $vStruct
$hDC = _WinAPI_CreateCompatibleDC(0)
$tBMI = DllStructCreate($tagBITMAPINFO)
DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4)
DllStructSetData($tBMI, "Width", $iW)
DllStructSetData($tBMI, "Height", -$iH)
DllStructSetData($tBMI, "Planes", 1)
DllStructSetData($tBMI, "BitCount", 32)
$aDIB = DllCall('GDI32.DLL', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'uint', 0)
$hBmp = $aDIB[0]
$Ptr = $aDIB[4]
_WinAPI_SelectObject($hDC, $hBmp)
$vStruct = DllStructCreate('int[5]')
DllStructSetData($vStruct, 1, $hDC, 1)
DllStructSetData($vStruct, 1, $iW, 2)
DllStructSetData($vStruct, 1, $iH, 3)
DllStructSetData($vStruct, 1, $Ptr, 4)
DllStructSetData($vStruct, 1, $hBmp, 5)
Return $vStruct
EndFunc ;==>_Image_Create
Func _Image_Delete(ByRef $vStruct)
_WinAPI_DeleteObject(DllStructGetData($vStruct, 1, 5))
_WinAPI_DeleteDC(DllStructGetData($vStruct, 1, 1))
$vStruct = 0
EndFunc ;==>_Image_Delete
Edit: Alle 1-2 Sekunden Ruckeln aber dennoch 1-2 Frames.
Wie komme ich an die exakte Frequenz des Bildschirms ? 60 scheint es nicht zu sein...
Hast ja gelesen Alizame liegt nicht am Script sondern an mir bzw. jetzt auch an dir.
Der Kommentar hat meinen Tag verschönert
[Blockierte Grafik: http://i.imgur.com/E1PCvpc.png]
Mars: Dein Hintergrundbild erinnert mich an "Per Anhalter durch die Galaxis". Versuchst Du genügend Ningi zusammen zu bekommen um sie in einen Pu eintauschen zu können?
Was die vielen Icons betrifft: Das würde mich wahnsinnig machen.
Um erstmal herauszufinden was Ningi und Pu sind musste ich doch glatt den Film gucken^^
Ich hab jetzt die Unordnung erkannt und gebannt. Es sieht aus wie ein leeres Zimmer ohne Tapete und Möbel
Hier ist meiner.
So, liebe Kinder, sieht ein Desktop aus, der nie aufgeräumt wirdSpoiler anzeigen
[Blockierte Grafik: http://s1.directupload.net/images/130108/vvsg3nsf.png]
Soviel dazu^^
[Blockierte Grafik: http://i.imgur.com/aEt6KZ2.png]
ZitatFühre ich mein Skript mit #RequireAdmin aus
Dann musst du dem Skript auch Adminrechte geben, sonst startet es nicht.
Das liegt bestimmt an der hohen Größe der Dll.
Wenn du die Dll mit UPX kleinmachst (param --ultra-brute) kommt der Spaß bei mir auf 116kb (ca. 1/4)
Vllt anschließend nochmal versuchen das binär einzubinden. Wenns dann noch laggt müsstest du es in ein Include (welches nur die Res enthält) auslagern.
Irgendwie in den Code einbauen solltest du es aber schon. Eine Dll die zusätzlich benötigt wird ist immer ein Klotz am Bein.
Interessant. Das verfolgt ähnlich aber gleichzeitig völlig unterschiedliche Ansätze wie meine (im Bau befindliche) M2D (Mars 2D) UDF.
Ich werde mir auf jeden Fall alles durchlesen und mal schauen welche "Redewndungen" in meiner UDF Gebrauch finden könnten. (du wirst dann natürlich erwähnt).
Um das Problem zu verstehen braucht man entweder eine Kristallkugel (die hier villeicht manche besitzen, aber nicht mit den nötigen Magischen Fähigkeiten für die Benutzung ausgestattet sind) oder das vollständige Skript.