Alter Inhalt
Moin,
Ich habe eben folgendes auf Wikipedia gefunden: Klick Mich
Das klang so einfach, dass man es direkt umsetzen musste.
Da nicht viel Interpretationsfreiraum war gibts nur 2 Optionen.
- Zoom (Um welchen Faktor soll das Bild für die anzeige verfrößert werden)
- FrameSkip (Wie viele Schritte sollten gemacht werden, bis gezeichnet wird. Min=1)
Normalerweise fängt die maschine irgendwann an eine Schräge linie zu zeichnen.
Da das aber zu langweilig war gilt das Prinzip: Links rein, Rechts raus (auch für Oben und Unten).
Skript
#include <GDIPlus.au3>
Opt('GUIOnEventMode', 1)
[/autoit] [autoit][/autoit] [autoit]; Vergrößerungsfaktor
Global Const $iZoom = 5
; Es wird alle X Schritte gezeichnet und 10ms gewartet.
Global Const $iFrameSkip = 2
; #### Skript:
Global $iW = 129, $iH = 129
Global $hGUI = GUICreate('Ameise', $iW*$iZoom, $iH*$iZoom)
_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]Global $hDLL_GDI32 = DllOpen('GDI32.dll')
Global $hDC = _WinAPI_GetDC($hGUI)
Global $hBUF = _Image_Create($iW, $iH)
Global $hDC_Buf = DllStructGetData($hBUF, 1, 1)
Global $hGFX = _GDIPlus_GraphicsCreateFromHDC($hDC_Buf)
Global $vStruct = DllStructCreate('int[' & $iW * $iH & ']', DllStructGetData($hBUF, 1, 4))
_GDIPlus_GraphicsClear($hGFX, 0xFFFFFFFF)
[/autoit] [autoit][/autoit] [autoit]Global $x = 64, $y = 64, $r = 3
; LORU
GUIRegisterMsg(0xF, 'WM_PAINT')
OnAutoItExitRegister('_Freigeben')
GUISetOnEvent(-3, '_Event')
GUISetState(@SW_SHOW, $hGUI)
While Sleep(10)
For $i = 1 To $iFrameSkip Step 1
If _GetPx() = -1 Then ; Weiß
_SetPx(0xFF000000)
$r += 1
Else
_SetPx(0xFFFFFFFF)
$r -= 1
EndIf
If $r > 3 Then $r -= 4
If $r < 0 Then $r += 4
Switch $r
Case 0
$x -= 1
Case 1
$y -= 1
Case 2
$x += 1
Case 3
$y += 1
EndSwitch
If $x = $iW Then $x = 0
If $x < 0 Then $x = $iW-1
If $y = $iH Then $y = 0
If $y < 0 Then $y = $iH-1
Next
WM_PAINT()
WEnd
Func _SetPx($iCol)
If $x+1+$y*$iW > $iW*$iH Then Return ToolTip('Error: Zeichnen außerhalb des Bildes.')
DllStructSetData($vStruct, 1, $iCol, $x+1+$y*$iW)
EndFunc
Func _GetPx()
Return DllStructGetData($vStruct, 1, $x+1+$y*$iW)
EndFunc
Func WM_PAINT()
DllCall($hDLL_GDI32, 'int', 'StretchBlt', 'hwnd', $hDC, 'int', 0, 'int', 0, 'int', $iW * $iZoom, 'int', $iH * $iZoom, 'hwnd', $hDC_Buf, 'int', 0, 'int', 0, 'int', $iW, 'int', $iH, 'dword', 0xCC0020)
EndFunc
Func _Event()
Switch @GUI_CtrlId
Case -3
Exit
EndSwitch
EndFunc
Func _Freigeben()
_Image_Delete($hBUF)
_GDIPlus_GraphicsDispose($hGFX)
_GDIPlus_Shutdown()
DllClose($hDLL_GDI32)
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($hDLL_GDI32, '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: Künstlerischer Freiraum: Version mit 4 Farben und variabler Auflösung.
Spoiler anzeigen
#include <GDIPlus.au3>
Opt('GUIOnEventMode', 1)
[/autoit] [autoit][/autoit] [autoit]; Vergrößerungsfaktor
Global Const $iZoom = 4
; Es wird alle X Schritte gezeichnet und 10ms gewartet.
Global Const $iFrameSkip = 2
; Auflösung anpassen (iW=iH)
Global Const $iAufloesung = 178
; #### Skript:
Global $iW = $iAufloesung, $iH = $iAufloesung
Global $hGUI = GUICreate('Ameise', $iW*$iZoom, $iH*$iZoom)
_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]Global $hDLL_GDI32 = DllOpen('GDI32.dll')
Global $hDC = _WinAPI_GetDC($hGUI)
Global $hBUF = _Image_Create($iW, $iH)
Global $hDC_Buf = DllStructGetData($hBUF, 1, 1)
Global $hGFX = _GDIPlus_GraphicsCreateFromHDC($hDC_Buf)
Global $vStruct = DllStructCreate('int[' & $iW * $iH & ']', DllStructGetData($hBUF, 1, 4))
_GDIPlus_GraphicsClear($hGFX, 0xFFFFFFFF)
[/autoit] [autoit][/autoit] [autoit]Global $aCol[4] = [0xFF000000, 0xFFFF8040, 0xFF4080FF, 0xFFFFFFFF]
[/autoit] [autoit][/autoit] [autoit]Global $x = Int($iW/2), $y = Int($iH/2), $r = 3
; LORU
GUIRegisterMsg(0xF, 'WM_PAINT')
OnAutoItExitRegister('_Freigeben')
GUISetOnEvent(-3, '_Event')
GUISetState(@SW_SHOW, $hGUI)
While Sleep(10)
For $i = 1 To $iFrameSkip Step 1
Switch _GetPx()
Case $aCol[0]
$r += 1
_SetPx($aCol[1])
Case $aCol[1]
$r += 2
_SetPx($aCol[2])
Case $aCol[2]
$r += 3
_SetPx($aCol[3])
Case $aCol[3]
$r += 4
_SetPx($aCol[0])
EndSwitch
;~ If _GetPx() = -1 Then ; Weiß
;~ _SetPx(0xFF000000)
;~ $r += 1
;~ Else
;~ _SetPx(0xFFFFFFFF)
;~ $r -= 1
;~ EndIf
If $r > 3 Then $r -= 4
If $r < 0 Then $r += 4
Switch $r
Case 0
$x -= 1
Case 1
$y -= 1
Case 2
$x += 1
Case 3
$y += 1
EndSwitch
If $x = $iW Then $x = 0
If $x < 0 Then $x = $iW-1
If $y = $iH Then $y = 0
If $y < 0 Then $y = $iH-1
Next
WM_PAINT()
WEnd
Func _SetPx($iCol)
If $x+1+$y*$iW > $iW*$iH Then Return ToolTip('Error: Zeichnen außerhalb des Bildes.')
DllStructSetData($vStruct, 1, $iCol, $x+1+$y*$iW)
EndFunc
Func _GetPx()
Return DllStructGetData($vStruct, 1, $x+1+$y*$iW)
EndFunc
Func WM_PAINT()
DllCall($hDLL_GDI32, 'int', 'StretchBlt', 'hwnd', $hDC, 'int', 0, 'int', 0, 'int', $iW * $iZoom, 'int', $iH * $iZoom, 'hwnd', $hDC_Buf, 'int', 0, 'int', 0, 'int', $iW, 'int', $iH, 'dword', 0xCC0020)
EndFunc
Func _Event()
Switch @GUI_CtrlId
Case -3
Exit
EndSwitch
EndFunc
Func _Freigeben()
_Image_Delete($hBUF)
_GDIPlus_GraphicsDispose($hGFX)
_GDIPlus_Shutdown()
DllClose($hDLL_GDI32)
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($hDLL_GDI32, '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
.
.
Inzwischen hatte ich etwas Zeit und habe eine "Finale Version" der Ameisenlaufmaschine gemacht.
Für Erweiterungsideen bin ich natürlich trotz "final" immer zu haben.
Funktionen:
- Frameskip (1 bis 2000) - Muss man sich selbst aussuchen. ca. 100 ist finde ich optimal zum testen.
- Anzahl Farben frei wählbar (2 bis 16)
- Freie Einstellmöglichkeit ob Links oder Recht gelaufen werden soll
- Start/Stop/Reset Möglichkeit
- Export und Import von Einstellungen via Rechtsklickmenu
- Zufällige Einstellungen
Exportierte Daten haben das Format : #71110000100000000# <- Sieht cool aus
Die # davor und danach sind unwichtig. Das ist nur, damit man es besser kopieren kann.
Ameise 1.01
#include <GDIPlus.au3>
Opt('GUIOnEventMode', 1)
[/autoit] [autoit][/autoit] [autoit]; Der Faktor muss 640 ergeben.
Global $iAufloesung = 160
Global $iZoom = 4
; #### Skript:
Global $iW = $iAufloesung, $iH = $iAufloesung
Global $hGUI = GUICreate('Ameise 1.01', $iW * $iZoom + 150, $iH * $iZoom + 19)
Global $x, $y, $r, $c, $bRun, $iFrames, $iT, $iFrameSkip, $iMaxCol
;~ #91011111100000000#
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]Global $hDLL_GDI32 = DllOpen('GDI32.dll')
Global $hDC = _WinAPI_GetDC($hGUI)
Global $hBUF = _Image_Create($iW, $iH)
Global $hDC_Buf = DllStructGetData($hBUF, 1, 1)
Global $hGFX = _GDIPlus_GraphicsCreateFromHDC($hDC_Buf)
Global $vStruct = DllStructCreate('int[' & $iW * $iH & ']', DllStructGetData($hBUF, 1, 4))
GUICtrlCreateLabel('Frame Skip:', $iW * $iZoom + 10, 20, 140, 17)
GUICtrlSetFont(-1, 13, 500, 0, 'Arial', 5)
Global $hInput_FrameSkip = GUICtrlCreateInput('5', $iW * $iZoom + 10, 40, 130, 25)
GUICtrlSetFont(-1, 13, 500, 0, 'Arial', 5)
GUICtrlCreateUpdown(-1)
GUICtrlSetLimit(-1, 2000, 1)
GUICtrlSetOnEvent(-1, '_Event')
GUICtrlCreateLabel('Anzahl Farben:', $iW * $iZoom + 10, 80, 140, 17)
GUICtrlSetFont(-1, 13, 500, 0, 'Arial', 5)
Global $hInput_MaxCol = GUICtrlCreateInput('2', $iW * $iZoom + 10, 100, 130, 25)
GUICtrlSetFont(-1, 13, 500, 0, 'Arial', 5)
GUICtrlCreateUpdown(-1)
GUICtrlSetLimit(-1, 16, 2)
GUICtrlSetOnEvent(-1, '_Event')
Global $hBtn_Run = GUICtrlCreateButton('Start', $iW * $iZoom + 10, $iH * $iZoom - 90, 130, 35)
GUICtrlSetFont(-1, 13, 500, 0, 'Arial', 5)
GUICtrlSetOnEvent(-1, '_Event')
Global $hBtn_Reset = GUICtrlCreateButton('Reset', $iW * $iZoom + 10, $iH * $iZoom - 50, 130, 35)
GUICtrlSetFont(-1, 13, 500, 0, 'Arial', 5)
GUICtrlSetOnEvent(-1, '_Event')
GUICtrlCreateLabel('', 0, $iH * $iZoom, $iW * $iZoom + 150, 1)
GUICtrlSetBkColor(-1, 0x606060)
GUICtrlCreateLabel('', 0, $iH * $iZoom+1, $iW * $iZoom + 150, 1)
GUICtrlSetBkColor(-1, 0xA0A0A0)
GUICtrlCreateLabel('', $iW*$iZoom, 0, 1, $iH*$iZoom)
GUICtrlSetBkColor(-1, 0x606060)
Global $hLabel_Status = GUICtrlCreateLabel('', 0, $iH * $iZoom + 2, $iW * $iZoom + 150, 17)
GUICtrlSetBkColor(-1, 0xA0A0A0)
GUICtrlSetFont(-1, 10, 500, 0, 'Arial', 5)
Global $aCol[16] = [0xFFFFFFFF, 0xFF000000, 0xFFFF0000, 0xFF00FF00, 0xFFFFFF00, 0xFF0000FF, 0xFFFF00FF, 0xFF00FFFF, 0xFFC0C0C0, 0xFF808080, 0xFF800000, 0xFF008000, 0xFF808000, 0xFF000080, 0xFF800080, 0xFF008080]
Global $aRichtung[16] = [-1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1]
Global $iDummy = GUICtrlCreateDummy()
For $i = 0 To 15 Step 1
GUICtrlCreateButton('', $iW * $iZoom + 28 + 50 * ($i > 7), 140 + $i * 50 - 50 * 8 * ($i > 7), 45, 45)
GUICtrlSetBkColor(-1, '0x' & StringRight(Hex($aCol[$i], 8), 6))
GUICtrlSetFont(-1, 13, 500, 0, 'Arial', 5)
If $i = 1 Or $i > 9 Then GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetOnEvent(-1, '_Event')
Next
For $i = 0 To 15 Step 1
GUICtrlCreateLabel($i+1, $iW * $iZoom + 5 + 122 * ($i > 7), 155 + $i * 50 - 50 * 8 * ($i > 7), 16, 16,0 + 2*($i<8))
GUICtrlSetFont(-1, 10, 500, 0, 'Arial', 5)
Next
Global $hMenu = GUICtrlCreateContextMenu()
GUICtrlCreateMenuItem('Zufall', $hMenu)
GUICtrlSetOnEvent(-1, '_Zufall')
GUICtrlCreateMenuItem('Importieren', $hMenu)
GUICtrlSetOnEvent(-1, '_Import')
GUICtrlCreateMenuItem('Exportieren', $hMenu)
GUICtrlSetOnEvent(-1, '_Export')
;~ Global $hMenu_Aufloesung = GUICtrlCreateMenu('Auflösung Ändern', $hMenu)
;~ GUICtrlCreateMenuItem('80x80 px', $hMenu_Aufloesung)
;~ GUICtrlCreateMenuItem('128x128 px', $hMenu_Aufloesung)
[/autoit] [autoit][/autoit] [autoit];~ GUICtrlCreateMenuItem('160x160 px', $hMenu_Aufloesung)
[/autoit] [autoit][/autoit] [autoit];~ GUICtrlCreateMenuItem('320x320 px', $hMenu_Aufloesung)
[/autoit] [autoit][/autoit] [autoit];~ GUICtrlCreateMenuItem('640x640 px', $hMenu_Aufloesung)
[/autoit] [autoit][/autoit] [autoit]Global $bReset2 = False, $bRun2 = False
[/autoit] [autoit][/autoit] [autoit]_Reset()
[/autoit] [autoit][/autoit] [autoit]GUIRegisterMsg(0xF, 'WM_PAINT') ; Neu Zeichnen
GUISetOnEvent(-5, 'WM_PAINT') ; Restore
OnAutoItExitRegister('_Freigeben')
GUISetOnEvent(-3, '_Event')
GUISetState(@SW_SHOW, $hGUI)
[/autoit] [autoit][/autoit] [autoit]While Sleep(10)
While Not $bRun
If $bReset2 Then
_Reset()
$bReset2 = False
$bRun = $bRun2
If $bRun Then
GUICtrlSetData($hBtn_Run, 'Stop')
Else
GUICtrlSetData($hBtn_Run, 'Start')
EndIf
EndIf
Sleep(10)
WEnd
For $i = 1 To $iFrameSkip Step 1
$c = _GetPx()
$c = _Index()
If Not $c Then
;~ _Tip(''
;~ _Tip('Error: Unbekannte Farbe aufgetaucht. Reset wurde durchgeführt.')
_Reset()
$bRun = True
ExitLoop
EndIf
$t = $c
If $c = $iMaxCol Then $c = 0
_SetPx($aCol[$c])
$r += $aRichtung[$c]
If $r > 3 Then $r -= 4
If $r < 0 Then $r += 4
Switch $r
Case 0
$x -= 1
Case 1
$y -= 1
Case 2
$x += 1
Case 3
$y += 1
EndSwitch
If $x = $iW Then $x = 0
If $x < 0 Then $x = $iW - 1
If $y = $iH Then $y = 0
If $y < 0 Then $y = $iH - 1
Next
$iFrames += $iFrameSkip
If TimerDiff($iT) > 100 Then
_Status('Frame: ' & $iFrames)
$iT = TimerInit()
EndIf
WM_PAINT()
WEnd
Func _Import()
Local $s = ClipGet()
$s = StringReplace($s, '#', '')
If (Not (StringLen($s) = 17)) Then Return _Tip('Error: Unbekannte Importdaten:' & @CRLF & '"' & $s & '"')
If Not (StringLen(StringReplace(StringReplace($s, '0',''),'1','')) <= 1) Then Return _Tip('Error: Unbekannte Importdaten:' & @CRLF & '"' & $s & '"')
$iMaxCol = Int('0x' & StringLeft($s, 1)) + 1
If $iMaxCol = 1 Then Return _Tip('Error: Defekte Importdaten:' & @CRLF & '"' & $s & '"')
For $i = 0 To $iMaxCol - 1 Step 1
$aRichtung[$i] = 1 - 2*(StringMid($s, $i+2,1)='1')
Next
GUICtrlSetData($hInput_MaxCol, $iMaxCol)
_Reset()
$bReset2 = True
$bRun2 = True
;~ GUICtrlSetData($hBtn_Run, 'Stop')
$s = '#' & $s & '#'
_Tip('Importiert: ' & @CRLF & StringMid($s, 1, 1) & ' ' & StringMid($s, 2, 1) & ' ' & StringMid($s, 3, 4) & ' ' & StringMid($s, 7, 4) & ' ' & StringMid($s, 11, 4) & ' ' & StringMid($s, 15, 4) & ' ' & StringMid($s, 19, 1))
EndFunc
Func _Export()
Local $s = '#' & Hex($iMaxCol-1,1)
For $i = 0 To $iMaxCol - 1 Step 1
If $aRichtung[$i] = 1 Then
$s &= '0'
Else
$s &= '1'
EndIf
Next
$s = StringLeft($s & '00000000000000', 18) & '#'
ClipPut($s)
_Tip('Exportiert: ' & @CRLF & StringMid($s, 1, 1) & ' ' & StringMid($s, 2, 1) & ' ' & StringMid($s, 3, 4) & ' ' & StringMid($s, 7, 4) & ' ' & StringMid($s, 11, 4) & ' ' & StringMid($s, 15, 4) & ' ' & StringMid($s, 19, 1))
EndFunc
Func _Zufall()
Local $iMaxCol = Random(3, 16, 1)
For $i = 0 To $iMaxCol-1 Step 1
$aRichtung[$i] = 1-2*Random(0, 1, 1)
Next
GUICtrlSetData($hInput_MaxCol, $iMaxCol)
_Reset()
$bRun2 = True
$bReset2 = True
;~ GUICtrlSetData($hBtn_Run, 'Stop')
EndFunc
Func _ResetBtn($n = -1)
If $n = -1 Then
For $i = 0 To 15 Step 1
GUICtrlSetData($iDummy + $i + 1, LR($aRichtung[$i]))
Next
Else
GUICtrlSetData($iDummy + $n + 1, LR($aRichtung[$n]))
EndIf
EndFunc ;==>_ResetBtn
Func LR($a)
If $a = 1 Then Return 'R'
Return 'L'
EndFunc ;==>LR
Func _Reset()
$x = Int($iW / 2)
$y = Int($iH / 2)
$r = 3
$c = ''
$t = ''
$bRun = False
$iFrames = 0
$iMaxCol = Number(GUICtrlRead($hInput_MaxCol))
If $iMaxCol < 2 Then $iMaxCol = 2
If $iMaxCol > 16 Then $iMaxCol = 16
GUICtrlSetData($hInput_MaxCol, $iMaxCol)
$iFrameSkip = Number(StringReplace(GUICtrlRead($hInput_FrameSkip), '.', ''))
If $iFrameSkip < 1 Then
$iFrameSkip = 1
GUICtrlSetData($hInput_FrameSkip, 1)
EndIf
If $iFrameSkip > 2000 Then
$iFrameSkip = 2000
GUICtrlSetData($hInput_FrameSkip, '2.000')
EndIf
$iT = TimerInit()
_GDIPlus_GraphicsClear($hGFX, 0xFFFFFFFF)
WM_PAINT()
;~ GUICtrlSetData($hBtn_Run, 'Start')
_ResetBtn()
_Status('Bereit...')
EndFunc ;==>_Reset
Func _Tip($a)
ToolTip($a)
AdlibUnRegister('_EndTip')
AdlibRegister('_EndTip', 4000)
EndFunc
Func _EndTip()
ToolTip('')
AdlibUnRegister('_EndTip')
EndFunc
Func _Status($a)
GUICtrlSetData($hLabel_Status, ' ' & $a)
EndFunc ;==>_Status
Func _Index()
For $i = 0 To $iMaxCol - 1 Step 1
If $aCol[$i] = $c Then Return $i + 1
Next
Return ''
EndFunc ;==>_Index
Func _SetPx($iCol)
If $x + 1 + $y * $iW > $iW * $iH Then Return _Tip('Error: Zeichnen außerhalb des Bildes.')
DllStructSetData($vStruct, 1, $iCol, $x + 1 + $y * $iW)
EndFunc ;==>_SetPx
Func _GetPx()
Return DllStructGetData($vStruct, 1, $x + 1 + $y * $iW)
EndFunc ;==>_GetPx
Func WM_PAINT()
DllCall($hDLL_GDI32, 'int', 'StretchBlt', 'hwnd', $hDC, 'int', 0, 'int', 0, 'int', $iW * $iZoom, 'int', $iH * $iZoom, 'hwnd', $hDC_Buf, 'int', 0, 'int', 0, 'int', $iW, 'int', $iH, 'dword', 0xCC0020)
EndFunc ;==>WM_PAINT
Func _Event()
Local $a = @GUI_CtrlId, $b
Switch $a
Case -3
Exit
Case $hInput_MaxCol + 1
$iMaxCol = Number(GUICtrlRead($hInput_MaxCol))
Case $hInput_FrameSkip + 1
$iFrameSkip = Number(StringReplace(GUICtrlRead($hInput_FrameSkip), '.', ''))
Case $hBtn_Run
If $bRun Then
GUICtrlSetData($hBtn_Run, 'Start')
Else
GUICtrlSetData($hBtn_Run, 'Stop')
EndIf
$bRun = Not $bRun
Case $hBtn_Reset
_Reset()
$bReset2 = True
$bRun2 = False
Case Else ; Button
$b = $a - $iDummy - 1
If $aRichtung[$b] = 1 Then
$aRichtung[$b] = -1
Else
$aRichtung[$b] = 1
EndIf
_ResetBtn($b)
EndSwitch
EndFunc ;==>_Event
Func _Freigeben()
_Image_Delete($hBUF)
_GDIPlus_GraphicsDispose($hGFX)
_GDIPlus_Shutdown()
DllClose($hDLL_GDI32)
EndFunc ;==>_Freigeben
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($hDLL_GDI32, '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
Interessante Seeds:
#41110100000000000#
#30111000000000000#
#80000100010000000#
#60011110000000000#
#31100000000000000#
#B0110110010000000#
#80110110000000000# - läuft unglaublich lange in der Mitte im Kreis, ohne sich dabei zu wiederholen
#70110110000000000# - Das gleiche wie oben nur eine Farbe weniger -> gibt interessante Linien.
#A1010001110000000# - Schnell ausbreitendes Gelbes Gebilde
#61010000000000000# - Gelbes Rechteck
Bugs:
Es muss 2x resettet werden, bevor wirklich alles resettet ist.
Deshalb vor dem Importieren auf Reset drücken. Sonst kann das Resultat abweichen.
1.01:
- Resetsystem überarbeitet. Es wird jetzt automatisch 2x resettet. Falls eine unbekannte Farbe auftaucht folgt auch ein Reset.
- Beim wiederherstellen sollte nun das bild aktualisiert werden.
.
.