Hi,
nach langer konnte ich mich mal wieder hinreißen und habe etwas in AutoIt gemacht. Es handelt sich um eine optische Täuschung, bei der Streifen über ein bestimmtes Bild gezogen werden, um eine Animation zu erzeugen.
Da ich sehr fasziniert von diesem Video bin, versuchte ich mich an einer Implementation und siehe da: Es funktioniert. Wenn man sich etwas mehr mit dem Thema beschäftigen würde, könnte da bestimmt ein kleines Mini Game (oder etwas in der Richtung) draus werden.
Wenn ihr die Motive wechseln wollt dann kommentiert einfach die verschiedenen $sPicture Variablen ein und aus. Die benutzten Bilder stammen nicht von mir und sind unter dem o.g. Video verlinkt.
Das Script kann man mit einem Tastendruck auf Escape beenden.
Code
#include <gdiplus.au3>
#include <winapi.au3>
#include <windowsconstants.au3>
; ### Bildpfad anpassen!
Global $sPicture = @ScriptDir & "\0.jpg"
;~ Global $sPicture = @ScriptDir & "\1.jpg"
;~ Global $sPicture = @ScriptDir & "\2.jpg"
;~ Global $sPicture = @ScriptDir & "\3.jpg"
;~ Global $sPicture = @ScriptDir & "\4.jpg"
;~ Global $sPicture = @ScriptDir & "\5.jpg"
; ###
Global $iWidth = 1024
Global $iHeight = 768
Local $iFPSRate = 100
Local $iOffsetRate = 2 ;1,2 oder 4
HotKeySet("{ESC}", "_Exit")
$hGUI = GUICreate("Optische Täuschung - Animation", $iWidth, $iHeight)
GUISetState()
;Create Backbuffer
$hGUIDC = _WinAPI_GetDC($hGUI)
$hBackbufferBitmap = _WinAPI_CreateCompatibleBitmap($hGUIDC, $iWidth, $iHeight);
$hBackbufferDC = _WinAPI_CreateCompatibleDC($hGUIDC);
_WinAPI_SelectObject($hBackbufferDC, $hBackbufferBitmap)
;Gdi+ Startup
_GDIPlus_Startup()
$hBackbufferGraphics = _GDIPlus_GraphicsCreateFromHDC($hBackbufferDC)
;Load background
$hImgBitmap = _WinAPI_CreateCompatibleBitmap($hGUIDC, $iWidth, $iHeight);
$hImgDC = _WinAPI_CreateCompatibleDC($hGUIDC);
_WinAPI_SelectObject($hImgDC, $hImgBitmap)
$hImageGraphics = _GDIPlus_GraphicsCreateFromHDC($hImgDC)
$hImage = _GDIPlus_ImageLoadFromFile($sPicture)
_GDIPlus_GraphicsDrawImageRect($hImageGraphics, $hImage, 0, 0, $iWidth, $iHeight)
Local $iOffset = 0
Local $iTimePerFrame = (1/$iFPSRate) * 1000
local $hNTDLL = DllOpen("ntdll.dll")
Local $tTime = DllStructCreate("int64 time;")
While Sleep(15)
$hTimer = TimerInit()
_WinAPI_BitBlt($hBackbufferDC, 0, 0, $iWidth, $iHeight, $hImgDC, 0, 0, $SRCCOPY) ;Background
_GDIPlus_GraphicsFillRect($hBackbufferGraphics, 0, 0, $iOffset - 2, $iHeight) ; First stripe
;other stripes
For $x = 0 To $iWidth - 1 Step 2
_GDIPlus_GraphicsFillRect($hBackbufferGraphics, $x + $iOffset, 0, 16, $iHeight)
$x += 16
Next
$iOffset += $iOffsetRate
If $iOffset >= 16 Then $iOffset = 0
_WinAPI_BitBlt($hGUIDC, 0, 0, $iWidth, $iHeight, $hBackbufferDC, 0, 0, $SRCCOPY) ; Back -> Frontbuffer
[/autoit] [autoit][/autoit] [autoit];frame control
$iTime = TimerDiff($hTimer)
if $iTime < $iTimePerFrame Then _HighPrecisionSleep(($iTimePerFrame-$iTime)*1000)
WEnd
Func _Exit()
_WinAPI_DeleteDC($hImgDC)
_WinAPI_DeleteObject($hImgBitmap)
_GDIPlus_GraphicsDispose($hImageGraphics)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_GraphicsDispose($hBackbufferGraphics)
_WinAPI_DeleteDC($hBackbufferDC)
_WinAPI_DeleteObject($hBackbufferBitmap)
_WinAPI_DeleteDC($hGUIDC)
_GDIPlus_Shutdown();
DllClose($hNTDLL)
Exit
EndFunc ;==>_Exit
; Author ........: Andreas Karlsson (monoceres)
; Modified.......: Sprenger120
Func _HighPrecisionSleep($iMicroSeconds,$hDll=False)
DllStructSetData($tTime,"time",-1*($iMicroSeconds*10))
DllCall($hNTDLL,"dword","ZwDelayExecution","int",0,"ptr",DllStructGetPtr($tTime))
EndFunc