GPIPlus

  • Hallo,
    ich beschäftige mich gerade wieder ein wenig mit GDIPlus und habe mir überlegt, evtl ein kleines Spiel zu entwerfen. Ich habe damit nun auch schon angefangen, jedoch habe ich mir die Frage gestellt, ob es keinen einfacheren Weg gibt, wie den den ich gehe ;)
    Die Frage die sich mir stellt ist, wie ich bestimmen kann, in welchem Bereich sich meine Spielfigur bewegen darf. Meine erste Idee war es, dies über X und Y Koordinaten zu machen und wenn die Figur an bestimmte Koordinaten kommt, die Laufgeschwindigkeit auf 0 gesetzt wird. Dies würde jedoch, wie ich festgestellt habe, sehr aufwendig werden und eine Menge Zeilen in Anspruch nehmen. Deshalb wollte ich fragen, ob jemand eine andere Idee hat, oder dies nur so visualisierbar ist.
    Außerdem hat sich mir die Frage gestellt, wie ich es anstelle, das ich Beispielsweise nur immer einen Teil meiner "Spielkarte" sehe und je nach dem wo ich meine Figur hinbewege sich meine Karte mit bewegt (die Karte soll größer wie der sichtbare Spielbereich auf meiner Gui sein).

    Ich hoffe mir kann jemand helfen und danke schon einmal für´s lesen :)

  • Ich hab mal mit den Funktionen der GDIP.au3 herumexperimentiert, und das ist dabei herausgekommen...

    Spoiler anzeigen
    [autoit]

    #include <GDIP.au3>
    #include <GUIConstants.au3>
    #include <Misc.au3>

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

    Opt("GUIOnEventMode", 1)

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

    $iGUIColorBG = 0xFFFFFFFF
    $iGUIWidth = 400
    $iGUIHeight = 400

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

    $iX_Char = 50
    $iY_Char = 50
    $vX_Char = 0
    $vY_Char = 0

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

    $hWnd = GUICreate("Kollisionstest", $iGUIWidth, $iGUIHeight)
    GUISetState()

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

    _GDIPlus_Startup()

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iGUIWidth, $iGUIHeight, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)

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

    $hPath = _GDIPlus_PathCreate()
    _GDIPlus_PathAddRectangle($hPath, 100, 100, 25, 25)
    _GDIPlus_PathAddEllipse($hPath, 250, 150, 200, 100)
    Dim $aPoints[6][2]
    $aPoints[0][0] = 5
    $aPoints[1][0] = 125
    $aPoints[1][1] = 125
    $aPoints[2][0] = 150
    $aPoints[2][1] = 125
    $aPoints[3][0] = 135
    $aPoints[3][1] = 150
    $aPoints[4][0] = 200
    $aPoints[4][1] = 210
    $aPoints[5][0] = 100
    $aPoints[5][1] = 300
    _GDIPlus_PathAddCurve($hPath, $aPoints)
    $hRegion = _GDIPlus_RegionCreateFromPath($hPath)

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

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

    While Sleep(20)
    If _IsPressed("25") Then $vX_Char -= 0.2
    If _IsPressed("26") Then $vY_Char -= 0.2
    If _IsPressed("27") Then $vX_Char += 0.2
    If _IsPressed("28") Then $vY_Char += 0.2

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

    $iX_Char += $vX_Char
    $iY_Char += $vY_Char
    $vX_Char *= 0.98
    $vY_Char *= 0.98
    If _GDIPlus_RegionIsVisibleRect($hRegion, $iX_Char, $iY_Char, 20, 20, $hBuffer) Then
    $iX_Char -= $vX_Char
    $iY_Char -= $vY_Char
    $vX_Char = 0
    $vY_Char = 0
    EndIf
    _GDIPlus_GraphicsClear($hBuffer, $iGUIColorBG)
    _GDIPlus_GraphicsFillPath($hBuffer, $hPath)
    _GDIPlus_GraphicsFillRect($hBuffer, $iX_Char, $iY_Char, 20, 20)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iGUIWidth, $iGUIHeight)
    WEnd

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

    Func _Exit()
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_PathDispose($hPath)
    _GDIPlus_RegionDispose($hRegion)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

    [/autoit]


    Dazu benötigt ihr natürlich die GDIP.au3 (Anhang) ;) .
    Das lässt sich auch noch optimieren, aber ich denke das ist mal ein Anfang für ein effektives Kollisions System. 8)

  • BugFix
    Ich habe mir eben die Funktion angeschaut. Ich werde erst einmal versuchen dies über diese Funktion zu lösen, da die Bereiche die nicht begehbar sein sollen hauptsächlich Rechtecke sind. Vielen Dank :)

    @Ubuntu
    Dein Tutorial habe ich bereits gelesen. Ich muss sagen das es sehr hilfreich war, einen Einstieg in das Thema GDIPlus zu finden. Leider konnte ich damit mein Problem nicht lösen. Es hat mir jedoch in Bezug auf den Buffer sehr geholfen :thumbup:

    name22
    Das Script ist im Grunde genau das was ich gesucht habe. Leider verstehe ich nicht alle Funktionen der GDIP und kann dazu auch keine Hilfedatei mit Erläuterungen finden.
    Ich denke mein größtes Problem ist, dass ich nicht weiß, was letztendlich für die "Kollision" sorgt.

  • Den Ansatz für deine Problemlösung findest du doch in Ubuntus Tut?

    Spoiler anzeigen
    [autoit]

    Select
    Case _IsPressed(25) and not $x <= 0; ------------- geändert -------------
    $x -= 3
    Case _IsPressed(26) and not $y <= 0; ------------- geändert -------------
    $y -= 3
    Case _IsPressed(27) and $x <= 160; ------------- geändert -------------
    $x += 3
    Case _IsPressed(28) and $y <= 125; ------------- geändert -------------
    $y += 3
    EndSelect

    [/autoit]

    Hier nochma der Link zum Tut

    Wenn du dein Spiel auf dem Grundgerüst von Ubuntus Tut aufgebaut hast dann musste nurnoch bisschen an den Koordinaten rumspielen :huh:


    MfG Hellboy

    MfG hellboy

    [autoit]

    Do
    _help($user)
    Until $questions = 0

    [/autoit]

    Meine Werke:
    Ste`s Web-Radio

  • Ich habe mein Spiel nicht auf das Grundgerüst aus dem Tutorial aufgebaut, sonder versucht dies selbst umzusetzen, da ich dadurch wohl einen größeren Lerneffekt habe. Die Bewegung der Figur stellt nicht das Problem dar. Es ging mir ausschließlich darum, Bereiche festzulegen, in welche meine Figur sich nicht bewegen darf. Da es sich hierbei nicht nur um den Rand des Spielfeldes handelt kann ich dies wohl nicht über eine solche Abfrage machen. Ich hatte bereits angefangen eine Abfrage über einzelne Koordinaten zu machen. Dies war jedoch wie bereits gesagt sehr aufwendig und hat sehr viele Zeilen benötigt, weshalb ich nach eine alternative gesucht habe.
    Ich habe nun versucht die Idee von Bugfix umzusetzen, was bisher auch funktioniert. Ich habe lediglich noch einen Fehler in der If-Abfrage welchen ich momentan suche.

  • Ok dann hatte ich das falsch verstanden sorry
    Beim Thema Kollisionen hänge ich momentan auch rum , gibt es keine udf für sowas :D ?

    If collision= 1 then blabla

    Das wäre schön :D:D:D

    MfG hellboy

    [autoit]

    Do
    _help($user)
    Until $questions = 0

    [/autoit]

    Meine Werke:
    Ste`s Web-Radio

  • Es ging mir ausschließlich darum, Bereiche festzulegen, in welche meine Figur sich nicht bewegen darf.

    Das geht mit einer veränderung von Hellboys gezeigter stelle auch.(zumindest bei rechteckigen formen)
    Aber mach es wie du meinst ;)

    mfg Ubuntu