GDI+ Spiel Problem

  • Hey ich hab ein kleinen Spiel geschrieben, jedoch kann ich die Ziele nicht neuzeichen lassen, da ich die Variable nicht verwenden kann...


    Spoiler anzeigen
    [autoit]


    #region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Change2CUI=y
    #AutoIt3Wrapper_Add_Constants=n
    #endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <Array.au3>
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister("__GDIPlus_Shutdown")

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

    _GDIPlus_Startup()

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

    Global $iWidth = 500, $iHeight = 500
    $GUI_Back_Color = 0xFF000000 + 0xF0F0F0

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

    $hGUI = GUICreate("", $iWidth, $iHeight, 400, 100, $WS_POPUP)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    ;Erstmal das normale Grafik-Objekt erstellen.
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    ;Statt uns mit dem normalen Frontbuffer zufrieden zu geben, erstellen wir erstmal eine
    ;Bitmap, mit Bezug auf unser Grafikobjekt.
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    $sImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\hintergrund.jpg")
    $kImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Fadenkreuz.png")
    $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\ziel.jpg") ; Lädt das Bild Image.gif aus dem ScriptDir Ordner
    ;Nachdem unser Bitmap erstellt ist, holen wir uns den Graphics Context. Dieser
    ;wird von uns verwendet, um darin zu zeichnen.

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

    GUISetOnEvent(-3, "_Exit")
    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    GUISetState()
    _FUNC()

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

    Func _FUNC()
    Global $ran1 = Random(0, 400, 1)
    Global $ran2 = Random(0, 400, 1)

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

    _GDIPlus_GraphicsClear($hBackbuffer, $sImage)

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

    ; Super Radierer benutzen um alten Backbuffer zu löschen

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

    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_INTERNALPAINT)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $sImage, 0, 0, 500, 500)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $hImage, $ran1, $ran2, 40, 50)
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_INTERNALPAINT)

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

    ; WM_PAINT wird nur aufgerufen, wenn alle Berechnungen fertig sind!
    ; In WM_PAINT wird selbst nichts berechnet, oder gezeichnet. diese Funktion wird nur das
    ; Bitmap-Objekt in das Grafik-Objekt übertragen.
    While 1
    $pos = GUIGetCursorInfo()
    If IsArray($pos) Then
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $kImage, $pos[0] - 14, $pos[1] - 15, 30, 30)
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_INTERNALPAINT)
    EndIf
    $mouse = GUIGetCursorInfo($hGUI)
    If IsArray($mouse) Then

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

    If $mouse[2] = 1 Then
    If $mouse[0] > $ran1 And $mouse[0] < $ran1 + 40 And $mouse[1] > $ran2 And $mouse[1] < $ran2 + 50 Then
    ;~ If $mouse[0] > $ran1 and $mouse[0] < $ran1 + 40 And $mouse[1] > $ran2 and $mouse[1] < $ran2 + 50 Then
    _FUNC()
    EndIf
    EndIf
    EndIf
    WEnd
    EndFunc ;==>_FUNC
    ; -----------------> X
    ;|
    ;|
    ;|
    ;|
    ;|
    ;v
    ;Y
    Func _Exit()
    Exit
    EndFunc ;==>_Exit

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)
    $pos = GUIGetCursorInfo()
    If IsArray($pos) Then
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $kImage, $pos[0] - 14, $pos[1] - 15, 30, 30)
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_INTERNALPAINT)
    EndIf
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $sImage, 0, 0, 500, 500)

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

    ; _GDIPlus_GraphicsDrawImageRect() überträgt den Backbuffer in den Frontbuffer.
    ; Der erste Parameter ist unser Frontbuffer (Grafik Objekt).
    ; Der zweite ist unsere Bitmap, welche ja als BackBuffer fungiert.
    ; Darauf folgt der Abschnitt den man übertragen will.
    ; i.d.R. ist es 0, 0 für X und Y koordinaten, und die GUI Breite und Höhe für
    ; Width und Height. Kommt natürlich immer drauf an, wie groß euer Grafikobjekt ist,
    ; und ob ihr den vollen Teil zeichnen wollt.
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func __GDIPlus_Shutdown()
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    EndFunc ;==>__GDIPlus_Shutdown

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

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

    Einmal editiert, zuletzt von BadBunny (24. September 2010 um 15:18)

  • ich habs bei mir bis jetzt so stehen, und ich sehe keine fehler(bisher)

    Spoiler anzeigen
    [autoit]

    #region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Change2CUI=y
    #AutoIt3Wrapper_Add_Constants=n
    #endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <Array.au3>
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister("__GDIPlus_Shutdown")

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

    _GDIPlus_Startup()

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

    Global $iWidth = 500, $iHeight = 500, $ran1 = 0, $ran2 = 0 ;hab die variablen hier reingepackt
    $GUI_Back_Color = 0xFF000000 + 0xF0F0F0

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

    $hGUI = GUICreate("", $iWidth, $iHeight, 400, 100, $WS_POPUP)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    ;Erstmal das normale Grafik-Objekt erstellen.
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    ;Statt uns mit dem normalen Frontbuffer zufrieden zu geben, erstellen wir erstmal eine
    ;Bitmap, mit Bezug auf unser Grafikobjekt.
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    $sImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\hintergrund.jpg")
    $kImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Fadenkreuz.png")
    $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\ziel.jpg") ; Lädt das Bild Image.gif aus dem ScriptDir Ordner
    ;Nachdem unser Bitmap erstellt ist, holen wir uns den Graphics Context. Dieser
    ;wird von uns verwendet, um darin zu zeichnen.

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

    GUISetOnEvent(-3, "_Exit")
    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    GUISetState()
    _FUNC()

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

    Func _FUNC()
    $ran1 = Random(0, 400, 1)
    $ran2 = Random(0, 400, 1)
    _GDIPlus_GraphicsClear($hBackbuffer, $sImage)

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

    ; Super Radierer benutzen um alten Backbuffer zu löschen

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

    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_INTERNALPAINT)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $sImage, 0, 0, 500, 500)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $hImage, $ran1, $ran2, 40, 50)
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_INTERNALPAINT)

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

    ; WM_PAINT wird nur aufgerufen, wenn alle Berechnungen fertig sind!
    ; In WM_PAINT wird selbst nichts berechnet, oder gezeichnet. diese Funktion wird nur das
    ; Bitmap-Objekt in das Grafik-Objekt übertragen.
    While 1
    $pos = GUIGetCursorInfo()
    If IsArray($pos) Then
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $kImage, $pos[0] - 14, $pos[1] - 15, 30, 30)
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_INTERNALPAINT)
    EndIf
    $mouse = GUIGetCursorInfo($hGUI)
    If IsArray($mouse) Then

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

    If $mouse[2] = 1 Then
    If $mouse[0] > $ran1 And $mouse[0] < $ran1 + 40 And $mouse[1] > $ran2 And $mouse[1] < $ran2 + 50 Then
    ;~ If $mouse[0] > $ran1 and $mouse[0] < $ran1 + 40 And $mouse[1] > $ran2 and $mouse[1] < $ran2 + 50 Then
    _FUNC()
    EndIf
    EndIf
    EndIf
    WEnd
    EndFunc ;==>_FUNC
    ; -----------------> X
    ;|
    ;|
    ;|
    ;|
    ;|
    ;v
    ;Y
    Func _Exit()
    Exit
    EndFunc ;==>_Exit

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)
    $pos = GUIGetCursorInfo()
    If IsArray($pos) Then
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $kImage, $pos[0] - 14, $pos[1] - 15, 30, 30)
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_INTERNALPAINT)
    EndIf
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $sImage, 0, 0, 500, 500)

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

    ; _GDIPlus_GraphicsDrawImageRect() überträgt den Backbuffer in den Frontbuffer.
    ; Der erste Parameter ist unser Frontbuffer (Grafik Objekt).
    ; Der zweite ist unsere Bitmap, welche ja als BackBuffer fungiert.
    ; Darauf folgt der Abschnitt den man übertragen will.
    ; i.d.R. ist es 0, 0 für X und Y koordinaten, und die GUI Breite und Höhe für
    ; Width und Height. Kommt natürlich immer drauf an, wie groß euer Grafikobjekt ist,
    ; und ob ihr den vollen Teil zeichnen wollt.
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func __GDIPlus_Shutdown()
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    EndFunc ;==>__GDIPlus_Shutdown

    [/autoit]

    Mfg. PCKing


    Mein PC

    CPU: AMD FX 8350 8x4.00GHz
    Ram: 8GB DDR3
    Grafikkarte: Nvidia Geforce GTX 960 (4GB)
    Festplatten: 500GB SSD 1TB HDD
    Laufwerk: Blueray RW+ Brenner

  • Wenn man es so macht funktioniert es garnicht.... das Fadenkreuz wird ja nur geladen und überdeckt alles.

    Das hier ist der Skript den ich meinte bei dem anderen war der fehler nicht din (der funkt dann aber auch nicht wo wie es soll)

    Spoiler anzeigen
    [autoit]

    #region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Change2CUI=y
    #AutoIt3Wrapper_Add_Constants=n
    #endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <Array.au3>
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister("__GDIPlus_Shutdown")

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

    _GDIPlus_Startup()

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

    Global $iWidth = 500, $iHeight = 500
    $GUI_Back_Color = 0xFF000000 + 0xF0F0F0

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

    $hGUI = GUICreate("", $iWidth, $iHeight, 400, 100, $WS_POPUP)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    ;Erstmal das normale Grafik-Objekt erstellen.
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    ;Statt uns mit dem normalen Frontbuffer zufrieden zu geben, erstellen wir erstmal eine
    ;Bitmap, mit Bezug auf unser Grafikobjekt.
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    $sImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\hintergrund.jpg")
    $kImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Fadenkreuz.png")
    $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Ziel.jpg") ; Lädt das Bild Image.gif aus dem ScriptDir Ordner
    ;Nachdem unser Bitmap erstellt ist, holen wir uns den Graphics Context. Dieser
    ;wird von uns verwendet, um darin zu zeichnen.

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

    GUISetOnEvent(-3, "_Exit")
    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    GUISetState()
    _FUNC()

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

    Func _FUNC()
    Global $ran1 = Random(0, 400, 1)
    Global $ran2 = Random(0, 400, 1)

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

    _GDIPlus_GraphicsClear($hBackbuffer, $sImage)

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

    ; Super Radierer benutzen um alten Backbuffer zu löschen

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

    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_INTERNALPAINT)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $sImage, 0, 0, 500, 500)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $hImage, $ran1, $ran2, 40, 50)
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_INTERNALPAINT)

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

    ; WM_PAINT wird nur aufgerufen, wenn alle Berechnungen fertig sind!
    ; In WM_PAINT wird selbst nichts berechnet, oder gezeichnet. diese Funktion wird nur das
    ; Bitmap-Objekt in das Grafik-Objekt übertragen.
    While 1
    $pos = GUIGetCursorInfo()
    If IsArray($pos) Then
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $kImage, $pos[0] - 14, $pos[1] - 15, 30, 30)
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_INTERNALPAINT)
    EndIf
    $mouse = GUIGetCursorInfo($hGUI)
    If IsArray($mouse) Then

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

    If $mouse[2] = 1 Then
    If $mouse[0] > $ran1 And $mouse[0] < $ran1 + 40 And $mouse[1] > $ran2 And $mouse[1] < $ran2 + 50 Then
    ;~ If $mouse[0] > $ran1 and $mouse[0] < $ran1 + 40 And $mouse[1] > $ran2 and $mouse[1] < $ran2 + 50 Then
    _FUNC()
    EndIf
    EndIf
    EndIf
    WEnd
    EndFunc ;==>_FUNC
    ; -----------------> X
    ;|
    ;|
    ;|
    ;|
    ;|
    ;v
    ;Y
    Func _Exit()
    Exit
    EndFunc ;==>_Exit

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)
    $pos = GUIGetCursorInfo()
    If IsArray($pos) Then
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $kImage, $pos[0] - 14, $pos[1] - 15, 30, 30)
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_INTERNALPAINT)
    EndIf
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $sImage, 0, 0, 500, 500)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $hImage, $ran1, $ran2, 40, 50)

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

    ; _GDIPlus_GraphicsDrawImageRect() überträgt den Backbuffer in den Frontbuffer.
    ; Der erste Parameter ist unser Frontbuffer (Grafik Objekt).
    ; Der zweite ist unsere Bitmap, welche ja als BackBuffer fungiert.
    ; Darauf folgt der Abschnitt den man übertragen will.
    ; i.d.R. ist es 0, 0 für X und Y koordinaten, und die GUI Breite und Höhe für
    ; Width und Height. Kommt natürlich immer drauf an, wie groß euer Grafikobjekt ist,
    ; und ob ihr den vollen Teil zeichnen wollt.
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func __GDIPlus_Shutdown()
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    EndFunc ;==>__GDIPlus_Shutdown

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

    Func _GDIPlus_GraphicsFillCircle($hGraphic, $x, $y, $rad, $hBrush = 0)
    _GDIPlus_GraphicsFillEllipse($hGraphic, $x - $rad, $y - $rad, $rad * 2, $rad * 2, $hBrush)
    EndFunc ;==>_GDIPlus_GraphicsFillCircle

    [/autoit]

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

    Einmal editiert, zuletzt von BadBunny (24. September 2010 um 15:06)

  • Hi,

    da ich die Variable nicht verwenden kann...

    Was meinst du damit? Kommt irgendeine Fehlermeldung?

    _GDIPlus_GraphicsClear($hBackbuffer, $sImage)

    Der zweite Parameter ist soweit ich weiß für die Farbe in nem HexCode,
    außerdem solltest du auch die Variable $hBackbuffer mit _GDIPlus_GraphicsDispose() disposen.

  • Es erscheint eine Fehler meldung, die besagt, das die Variablen $ran1 und $ran 2 nicht gegeben sind.

    Das liegt dadran das die variablen in der anderen funk bestimmt werden und nicht in der wo man sie auch braucht, man kann sie aber auch nciht neu bestimmen , da es ja random ist und sonst sehr wahrscheinlich andere werte raus kommen.


    EDIT// Ok hat sich geklärt hab einfach alles in eine Func gesetzt danke^^

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

    Einmal editiert, zuletzt von BadBunny (24. September 2010 um 15:16)

  • Wie das funktioniert haste ausm AutoITBot-Forum oder ???

    Die Kommentare sind nähmlich die gleichen :)

    Mein (Beta-)Programm baisert auch auf dem Tutorial xD