Tiles

  • Ich habe mir letzten Doodle jump angeschaut.(Wirklich klasse)
    Das hat mich motiviert mal bisl mit GDI rumzuspielen.
    Ich wolte eig. schon immer ein kleines rpg bauen.
    Erstes Problem hierbei sind die Bilder. Diese gibt es meis nur als Tilesets.
    Unter Java ist das auch gut so, da kan ich sagen subimage und x,x und erhalten den Ausschnit des Tilessets, sprich ein Tile.
    Google hat mir bisher noch keine sinvolle antwort darauf geben können ob GDi bzw autoit sowas auch kan.
    andere möglichkeit währ jedes Tile mit pain zu zerlegen -_-
    Vielleicht kan mich ja jemand davor bewahren.
    thx

    /edit jeden Tag kommt bisl mehr dazu drum poste ich hier oben mal immer die aktuelle version
    version 0.0.3
    http://www.file-upload.net/download-2477073/co.7z.html

    Spoiler anzeigen


    v0.0.1.1 "inventar" geht mit "i" auf
    Lebensleiste -> Background drückt sich durch

    [autoit]

    #include <GDIPlus.au3>
    #include <Misc.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <WinAPI.au3>
    #include <timers.au3>
    #include<Array.au3>

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

    $Width = 480
    $Height = 480
    $tilesize=48
    $richtung="e"
    $xrichtung=0
    $yrichtung=0
    $x=250
    $y=250
    $map=1
    $speed=3
    $inventar1=-1
    $inventar2=-1
    $menu=-1
    $gold=100
    $hp=100
    $mp=100

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

    $GUI1 = GUICreate("Chosen one", $Width, $Height)
    GUISetState(@SW_SHOW)

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

    $dll=DllOpen("user32.dll")

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

    opt("guioneventmode", 1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "ende")
    AutoItSetOption ("MouseCoordMode", 0)
    TCPStartUp()

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

    #cs
    dim $attacke[13]
    for $counter=0 to 12
    $attacke[$counter]=@ScriptDir&"\bilder\attacke\attack" & $add & $counter & ".gif"

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

    Next
    #ce
    $pBackground = @ScriptDir&"\map" & $map & ".jpg"

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

    _GDIPlus_Startup()

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

    $Graphic = _GDIPlus_GraphicsCreateFromHWND($GUI1)
    $Bitmap = _GDIPlus_BitmapCreateFromGraphics($Width, $Height, $Graphic)
    $Buffer = _GDIPlus_ImageGetGraphicsContext($Bitmap)
    $Background=_GDIPlus_ImageLoadFromFile ($pBackground)
    #region Load
    ;$Background = _GDIPlus_ImageLoadFromFile ($pBackground)

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

    #endregion Load
    ; gdi wieder beenden = _GDIPlus_GraphicsDispose(_GDIPlus_GraphicsCreateFromHWND($GUI1))
    _WinAPI_RedrawWindow($GUI1, "", "", $RDW_UPDATENOW + $RDW_FRAME)
    _GDIPlus_GraphicsDrawImage ($Buffer, $Background, 0, 0)
    draw_inventar()
    _GDIPlus_GraphicsDrawImage($Buffer, _GDIPlus_ImageLoadFromFile(@ScriptDir&"\bilder\steht\steht e0000.bmp"), $x, $y)
    _GDIPlus_GraphicsDrawImageRect($Graphic, $Bitmap, 0, 0, $Width, $Height)
    ;Sleep(10000)
    while 1

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

    ;warten auf Eingabe laufen oder andere Aktion

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

    ;wen keine richtung gedrückt wird ist richtung =0 heist stillstand

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

    ;Inventar ein/ausschalten
    If _IsPressed("49",$dll) Then

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

    Do
    Until Not _IsPressed("49",$dll)
    _GDIPlus_GraphicsDrawImage ($Buffer, $Background, 0, 0)
    $inventar1*=-1
    draw_inventaronce()
    EndIf

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

    ;menü ein/ausschalten
    If _IsPressed("1B",$dll) Then

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

    Do
    Until Not _IsPressed("1B",$dll)
    _GDIPlus_GraphicsDrawImage ($Buffer, $Background, 0, 0)
    $menu*=-1
    draw_inventar()
    EndIf

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

    If _IsPressed("31",$dll) Then ;angriff eins

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

    for $counter=0 to 12
    if $counter<10 then
    $add=0
    else
    $add=""
    EndIf

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

    _GDIPlus_GraphicsDrawImage ($Buffer, $Background, 0, 0)
    _GDIPlus_GraphicsDrawImage($Buffer, _GDIPlus_ImageLoadFromFile(@ScriptDir&"\bilder\attack\attack " & $richtung & "00" & $add & $counter & ".bmp"), $x, $y)
    draw_inventar()
    Sleep(60)
    _GDIPlus_GraphicsDrawImageRect($Graphic, $Bitmap, 0, 0, $Width, $Height)
    Next

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

    EndIf

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

    ;laufen
    If _IsPressed("25",$dll) or _IsPressed("26",$dll) or _IsPressed("27",$dll) or _IsPressed("28",$dll) then

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

    If _IsPressed("25",$dll) Then $xrichtung =-1

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

    If _IsPressed("26",$dll) Then $yrichtung =-1

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

    If _IsPressed("27",$dll) Then $xrichtung =1

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

    If _IsPressed("28",$dll) Then $yrichtung =1

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

    ;himmelsrichtungen definieren

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

    if $xrichtung=1 and $yrichtung=-1 then $richtung="ne"
    if $xrichtung=1 and $yrichtung=0 then $richtung="e"
    if $xrichtung=1 and $yrichtung=1 then $richtung="se"

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

    if $xrichtung=0 and $yrichtung=-1 then $richtung="n"

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

    if $xrichtung=0 and $yrichtung=1 then $richtung="s"

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

    if $xrichtung=-1 and $yrichtung=-1 then $richtung="nw"
    if $xrichtung=-1 and $yrichtung=0 then $richtung="w"
    if $xrichtung=-1 and $yrichtung=1 then $richtung="sw"

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

    for $counter=0 to 7

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

    _GDIPlus_GraphicsDrawImage ($Buffer, $Background, 0, 0)
    _GDIPlus_GraphicsDrawImage($Buffer, _GDIPlus_ImageLoadFromFile(@ScriptDir&"\bilder\laufen\läuft " & $richtung & "000" & $counter & ".bmp"), $x, $y)
    draw_inventar()
    $x=$xrichtung*$speed+$x
    $y=$yrichtung*$speed+$y
    Sleep(60)
    _GDIPlus_GraphicsDrawImageRect($Graphic, $Bitmap, 0, 0, $Width, $Height)
    Next
    EndIf

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

    $xrichtung=0
    $yrichtung=0

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

    wend

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

    func make_background()
    Local $hBitmap1, $hBitmap2, $hImage1, $hImage2, $hGraphic, $width, $height

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

    ; Initialisiert (startet) Microsoft Windows GDI+

    $counterx=1

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

    $hImage1 = _GDIPlus_ImageLoadFromFile (@ScriptDir&"\bilder\background.bmp")

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

    for $countery=1 to 10 step 1

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

    $sur=IniRead(@ScriptDir & "\map.ini",$map,$counterx,"Grass,Grass,Grass,Grass,Grass,Grass,Grass,Grass,Grass,Grass")
    $tile = StringSplit($sur, ",")

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

    for $counterx=1 to 10 step 1
    $himage2=_GDIPlus_ImageLoadFromFile (@ScriptDir&"\bilder\Umgebung\" & $tile[$counterx] & ".bmp")
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage1)

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

    DrawInsert($hGraphic, $hImage2, $counterx*$tilesize-$tilesize, $countery*$tilesize-$tilesize, 00, $width, $height)
    ;_GDIPlus_GraphicsDrawImage ($Buffer, _GDIPlus_ImageLoadFromFile (@ScriptDir&"\bilder\Umgebung\" & $tile[$counterx] & ".bmp"), $counterx*$tilesize-$tilesize, $countery*$tilesize-$tilesize)

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

    Next
    Next

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

    ; Zeichnet ein Bild in ein anderes

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

    ; Speichert das neue Bild
    _GDIPlus_ImageSaveToFile($hImage1, @ScriptDir & "\GDIPlus_Image.jpg")

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

    EndFunc

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

    Func DrawInsert($hGraphic, $hImage2, $iX, $iY, $nAngle, $iWidth, $iHeight, $iARGB = 0xFF000000, $nWidth = 1)
    Local $hMatrix, $hPen2

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

    ; Rotationsmatrix
    $hMatrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixRotate($hMatrix, $nAngle, "False")
    _GDIPlus_GraphicsSetTransform($hGraphic, $hMatrix)

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

    _GDIPlus_GraphicsDrawImage($hGraphic, $hImage2, $iX, $iY)

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

    ; Ermittelt Stift + Farbe
    $hPen2 = _GDIPlus_PenCreate($iARGB, $nWidth)

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

    ; Zeichnet einen Rahmen um das eingefügte Bild
    _GDIPlus_GraphicsDrawRect($hGraphic, $iX, $iY, $iWidth, $iHeight, $hPen2)

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

    ; Ressourcen freigeben
    _GDIPlus_MatrixDispose($hMatrix)
    _GDIPlus_PenDispose($hPen2)
    Return 1
    EndFunc ;==>DrawInsert

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

    func draw_inventaronce()
    _GDIPlus_GraphicsDrawImage($Buffer, _GDIPlus_ImageLoadFromFile(@ScriptDir & "\bilder\steht\steht " & $richtung & "0000.bmp"), $x, $y)
    _GDIPlus_GraphicsDrawImage($Buffer, _GDIPlus_ImageLoadFromFile(@ScriptDir & "\bilder\Interface\Lebensleiste.gif"), 0, 10)
    if $inventar1=1 then _GDIPlus_GraphicsDrawImage($Buffer, _GDIPlus_ImageLoadFromFile(@ScriptDir&"\bilder\Interface\inventar2.bmp"), 350, 100)
    if $inventar2=1 then _GDIPlus_GraphicsDrawImage($Buffer, _GDIPlus_ImageLoadFromFile(@ScriptDir&"\bilder\Interface\inventar1.bmp"),350, 100)
    if $menu=1 then _GDIPlus_GraphicsDrawImage($Buffer, _GDIPlus_ImageLoadFromFile(@ScriptDir&"\bilder\Interface\inventar1.bmp"),250, 100)
    _GDIPlus_GraphicsDrawImageRect($Graphic, $Bitmap, 0, 0, $Width, $Height)

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

    EndFunc

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

    func draw_inventar()

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

    _GDIPlus_GraphicsDrawImage($Buffer, _GDIPlus_ImageLoadFromFile(@ScriptDir & "\bilder\Interface\Lebensleiste.gif"), 0, 10)
    if $inventar1=1 then _GDIPlus_GraphicsDrawImage($Buffer, _GDIPlus_ImageLoadFromFile(@ScriptDir&"\bilder\Interface\inventar2.bmp"), 350, 100)
    if $inventar2=1 then _GDIPlus_GraphicsDrawImage($Buffer, _GDIPlus_ImageLoadFromFile(@ScriptDir&"\bilder\Interface\inventar1.bmp"),350, 100)
    if $menu=1 then _GDIPlus_GraphicsDrawImage($Buffer, _GDIPlus_ImageLoadFromFile(@ScriptDir&"\bilder\Interface\inventar1.bmp"),250, 100)

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

    _GDIPlus_GraphicsFillRect($Graphic, 2,12, 100, 12, _GDIPlus_BrushCreateSolid(0xFFFF0000))
    _GDIPlus_GraphicsFillRect($Graphic, 2, 27, 100, 12, _GDIPlus_BrushCreateSolid(0xFF0000ff))
    _GDIPlus_GraphicsDrawString($Buffer, $hp & "/" & $hp, 28, 11, "Comic Sans MS", 7)
    _GDIPlus_GraphicsDrawString($Buffer, $mp & "/" & $mp, 28, 26, "Comic Sans MS", 7)
    _GDIPlus_GraphicsDrawImageRect($Graphic, $Bitmap, 0, 0, $Width, $Height)

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

    EndFunc

    [/autoit]

    2 Mal editiert, zuletzt von GegX (30. April 2010 um 14:27)

  • Mit GDI+ hast du 2 Möglichkeiten, das Bild zu vernwenden:
    1) Bei jedem Zeichnen per _GDIPlus_GraphicsDrawImageRectRect nur den gewünschten Ausschntt zeichnen
    2) Zu Beginn mit _GDIPlus_BitmapCloneArea ein neues Bild aus dem Ausschnitt zu erzeigen. Dau darfst aber nicht vergessen, am Ende _GDIPlus_BitmapDispose aufzurufen. Also Format für die Kopie wählst du am besten $GDIP_PXF32ARGB denke ich.

  • Das einfachste und Ressourcen freundlichste wäre warscheinlich das Bild schon vorher mit einem Grafikprogramm zu zerlegen.

    mfg Ubuntu

  • Das einfachste und Ressourcen freundlichste wäre warscheinlich das Bild schon vorher mit einem Grafikprogramm zu zerlegen.

    mfg Ubuntu


    Das ist doch im Endeffekt auch nichts anderes als _GDIPlus_BitmapCloneArea zu verwenden ;)

  • vielen dank.
    ich denke ich werde nur einen teil anzeigen. wen das zu lahm ist dan selber bauen.
    Bisher hab ich schon eine Figur die in 8 richtungen laufen kan und dabei 8 animation pro schritt macht und eine attacke mit 13 animation!
    Wenn ich die Tiles (vlt morgen,eher montag ^^) fertig post ich das ganze mal und alle können sich freuen.
    vielen dank erstmal

  • So hier also mal was zum anschauhen.
    man kan schon laufen mit "1" zuhauhen und neue maps bauen.
    (die braunen Umrandung der Figur kommen noch weg.
    Wen einer schnell weis wie ich die Bilder bearbeite und das Braun mit autoit transparent mache und wieder speichere, kan er sich gerne melden)

    als nächstes kommt Inventar, Menü etc und dan mal einen Kampf einbauen.
    hoffe es gefällt, ist ja noch nicht wirklich viel

  • Du solltest die Bilder nicht jedes mal laden, wenn du sie anzeigen willst. Du musst sie vorladen und am Ende des Skripts wieder freigeben. Außerdem werden gif-Dateien als .gif, png als .png und nur unkomprimierte bitmaps als .bmp gepseichert.

  • Ich hab da auch einmal etwas gemacht.
    Wirklich nichts besonderes. ;(

  • Zitat

    Du solltest die Bilder nicht jedes mal laden, wenn du sie anzeigen willst. Du musst sie vorladen und am Ende des Skripts wieder freigeben.

    bein den Inventarbildern hast du recht. aber die animation sind ja ca 200 bilder pro Figur meinst du wirklich ich sollte die alle vorladen ?

  • bein den Inventarbildern hast du recht. aber die animation sind ja ca 200 bilder pro Figur meinst du wirklich ich sollte die alle vorladen ?


    Ich würde immer eine Animation laden, dann abspielen und dann wieder enladen. Auf jeden Fall musst du das Bild nach dem Benutzen wieder freigeben, sonst wird immer mehr Speicher verbraucht.