#include <GDIPlus.au3>
#include <Array.au3>

Opt("GUIOnEventMode", 1)

Global $hwnd, $hGraphic, $bitmap, $backbuffer
Global $World = "DieWelt.png", _
	   $Char = "Char_neu.png", _
	   $World_Split, _
	   $Char_Split

Global $MaxMapWidth = 10, $MaxMapHeight = 8

Global $Counter = 0, $CounterNum = 1, $zoom = 2

$hwnd = GUICreate("GDI+ Beispiel: Gehender Char", $MaxMapWidth * 32 * $zoom, $MaxMapHeight * 32 * $zoom, -1, -1)
GUISetBkColor(0x000000)
GUISetOnEvent(-3, "_Close")
GUISetState(@SW_SHOW, $hwnd)

_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hwnd)
$bitmap = _GDIPlus_BitmapCreateFromGraphics(450, 450, $hGraphic)
$backbuffer = _GDIPlus_ImageGetGraphicsContext($bitmap)
_GDIPlus_GraphicsSetSmoothingMode($backbuffer, 4)

$World_Split = _PicSplitWorld($World)
$Char_Split = _PicSplitChar($Char)

While 1
	$Counter += $CounterNum
	_GDIPlus_GraphicsClear($backbuffer)
	_DrawMultiMap(0, 0, 10, 10, 190, $World_Split)
	_DrawChar(0, 0, $Counter, $Char_Split)
	_GDIPlus_GraphicsDrawImageRect($hGraphic, $bitmap, 0, 0, 450 * $zoom, 450 * $zoom)
	If $Counter = 11 Then $CounterNum = - 1
	If $Counter = 0 Then $CounterNum = + 1
	Sleep(250)
WEnd

Func _Close()
    _GDIPlus_GraphicsDispose($backbuffer)
    _GDIPlus_BitmapDispose($bitmap)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    WinClose($hwnd)
    Exit
EndFunc

Func _DrawChar($XPos, $YPos, $Pic, $hSplit)
	_GDIPlus_GraphicsDrawImageRect($backbuffer, $hSplit[$Pic], $XPos * 32 + 4, $YPos * 31, 24, 32)
EndFunc

Func _DrawMultiMap($XPos, $YPos, $MapHigh, $MapWidth, $Pic, $hSplit)
    For $i = $XPos To $MapHigh + $XPos Step + 1
        For $j = $YPos To $MapWidth + $YPos Step + 1
			_GDIPlus_GraphicsDrawImageRect($backbuffer, $hSplit[$Pic], $i * 31, $j * 32, 32, 33)
        Next
    Next
EndFunc

Func _PicSplitChar($Pic)
	Local $hImage = _GDIPlus_BitmapCreateFromFile($Pic)
	Local $hBitmapWidht = _GDIPlus_ImageGetWidth($hImage), $hBitmapHeight = _GDIPlus_ImageGetHeight($hImage), $PicZahl = $hBitmapWidht / 24 * $hBitmapHeight / 32
	Local $hBitmap, $hSplit[12]
	Local $Widht = 0, $High = 0

	For $i = 0 To $PicZahl -1 Step + 1
		If $Widht <> $hBitmapWidht Then
			$hSplit[$i] = _GDIPlus_BitmapCloneArea($hImage, $Widht, $High, 24, 32, $GDIP_PXF64PARGB)
			$Widht = $Widht + 24
		Else
			$Widht = 0
			$High = $High + 32
			$i = $i - 1
		EndIf
	Next
    _GDIPlus_BitmapDispose($hImage)
	Return $hSplit
EndFunc

Func _PicSplitWorld($Pic)
	Local $hImage = _GDIPlus_BitmapCreateFromFile($Pic)
	Local $hBitmapWidht = _GDIPlus_ImageGetWidth($hImage), $hBitmapHeight = _GDIPlus_ImageGetHeight($hImage), $PicZahl = $hBitmapWidht / 16 * $hBitmapHeight / 16
	Local $hBitmap, $hSplit[$PicZahl]
	Local $Widht = 0, $High = 0

	For $i = 0 To $PicZahl -1 Step + 1
		If $Widht <> $hBitmapWidht Then
			$hSplit[$i] = _GDIPlus_BitmapCloneArea($hImage, $Widht, $High, 16, 16, $GDIP_PXF64PARGB)
			$Widht = $Widht + 16
		Else
			$Widht = 0
			$High = $High + 16
			$i = $i - 1
		EndIf
	Next
    _GDIPlus_BitmapDispose($hImage)
	Return $hSplit
EndFunc
