Kleines Klickspiel

  • Ich wollte mal ein simples, kleines Spielchen basteln. Es läuft auch schon, nur spielen kann man nicht ...

    Hier mal der Code dafür:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Opt("GUIOnEventMode", 1)
    $Form1 = GUICreate("Form1", 793, 574, 193, 143)
    $bSTART = GUICtrlCreateButton("Start", 688, 552, 97, 17, 0)
    ;$BG = GUICtrlCreatePic(@ScriptDir & "\images\cf01.jpg", 8, 8, 776, 537)

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

    $x = Random(24, 736, 1)
    $y = Random(24, 516, 1)
    ;$bPic = GUICtrlCreatePic(@ScriptDir & "\orange.gif", $x, $y, 32, 32)
    $bPic = GUICtrlCreateButton("",$x, $y, 32, 32)
    GUICtrlSetState($bPic,$GUI_HIDE)

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Close")
    GUICtrlSetOnEvent($bSTART, "_Start")
    GUICtrlSetOnEvent($bPic, "_Pic")

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    Sleep(1000)
    WEnd

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

    ;Functions
    Func _Start()
    GUICtrlSetState($bPic,$GUI_SHOW)
    For $i = 1 To 10
    $x = Random(24, 736, 1)
    $y = Random(24, 516, 1)
    Sleep(2000)
    GUICtrlSetPos($bPic,$x,$y)
    Next
    EndFunc

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

    Func _Pic()
    MsgBox(0,"","jo")
    EndFunc

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

    Func _Close()
    Exit
    EndFunc

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

    Die Grundidee ist, dass man den Button immer schnell anklicken muss, bevor er wechselt - dafür gibts dann vllt später mal Punkte oder so.
    Das eigentliche Problem ist aber jetzt, dass der Button nicht anspricht wenn man ihn klickt - liegt wohl am sleep.
    Was wäre also die Alternative?

    Frage 2: Könnte ich eigentlich auch eine Grafik als Button nutzen?

    Einmal editiert, zuletzt von dasT17 (28. Oktober 2009 um 18:53)

  • Zu 1. Schau dir mal die Funktionen TimerInit() und TimerDiff() in der Hilfe an.
    Zu 2. Ja. Einfach statt GUICtrlCreateButton() ein GUICtrlCreatePic().

    Gruß,
    der Verpeilte.

    EDIT: Hab das ganze jetzt mal ein bisschen umgebaut, ich hoffe es ist das, was du willst.
    (fehlt halt noch das pic aber das mit klicken klappt schonmal ;) )

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $Punkte = 0
    $Form1 = GUICreate("Form1", 793, 574, 193, 143)
    $bSTART = GUICtrlCreateButton("Start", 688, 552, 97, 17, 0)
    ;$BG = GUICtrlCreatePic(@ScriptDir & "\images\cf01.jpg", 8, 8, 776, 537)

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

    $x = Random(24, 736, 1)
    $y = Random(24, 516, 1)
    ;$bPic = GUICtrlCreatePic(@ScriptDir & "\orange.gif", $x, $y, 32, 32)
    $bPic = GUICtrlCreateButton("",$x, $y, 32, 32)
    GUICtrlSetState($bPic,$GUI_HIDE)

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    _Close()
    Case $bSTART
    _Start()
    EndSwitch
    WEnd

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

    ;Functions
    Func _Start()
    GUICtrlSetData($bSTART,"Stop")
    GUICtrlSetState($bPic,$GUI_SHOW)
    $timer = TimerInit()
    Do
    $doMsg = GUIGetMsg()
    Switch $doMsg
    Case $bPic
    _Pic()
    $x = Random(24, 736, 1)
    $y = Random(24, 516, 1)
    GUICtrlSetPos($bPic,$x,$y)
    $timer = TimerInit()
    Case $GUI_EVENT_CLOSE
    _Close()
    EndSwitch

    If TimerDiff($timer) > 2000 Then
    $x = Random(24, 736, 1)
    $y = Random(24, 516, 1)
    GUICtrlSetPos($bPic,$x,$y)
    $timer = TimerInit()
    EndIf
    Until $doMsg = $bSTART
    GUICtrlSetData($bSTART,"Start")
    GUICtrlSetState($bPic,$GUI_HIDE)
    EndFunc

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

    Func _Pic()
    $Punkte += 1
    TrayTip("","Du hast "& $Punkte & " Punkte!!!",1)
    EndFunc

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

    Func _Close()
    Exit
    EndFunc

    [/autoit]
  • Danke erstmal für die Antwort

    Spoiler anzeigen
    [autoit]


    Opt("GUIOnEventMode", 1)
    $Form1 = GUICreate("Form1", 793, 574, 193, 143)
    $bSTART = GUICtrlCreateButton("Start", 688, 552, 97, 17, 0)
    ;$BG = GUICtrlCreatePic(@ScriptDir & "\images\cf01.jpg", 8, 8, 776, 537)

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

    $x = Random(24, 736, 1)
    $y = Random(24, 516, 1)
    $bPic = GUICtrlCreatePic(@ScriptDir & "\images\stage1\s1_orange.gif", $x, $y, 32, 32)
    GUICtrlSetState($bPic,$GUI_HIDE)

    $CloseClicked = GUISetOnEvent($GUI_EVENT_CLOSE, "_Close")
    GUICtrlSetOnEvent($bSTART, "_Start")
    GUICtrlSetOnEvent($bPic, "_Pic")

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    Global $Score = 0

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

    While 1
    Sleep(1000)
    WEnd

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

    ;Functions
    Func _Start()
    GUICtrlSetState($bPic,$GUI_SHOW)

    For $i = 1 To 10
    $x = Random(24, 736, 1)
    $y = Random(24, 516, 1)
    Sleep(2000)
    GUICtrlSetPos($bPic,$x,$y)
    ;If $CloseClicked = 1 Then ExitLoop
    Next
    GUICtrlSetState($bPic,$GUI_HIDE)
    MsgBox(0,"",$Score)

    EndFunc

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

    Func _Pic()
    $Score=$Score+1
    ;MsgBox(0,"",$Score)
    EndFunc

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

    Func _Close()
    Exit
    EndFunc

    [/autoit]

    Also es funktioniert jetzt doch mit sleep. Allerdings nur, solange ich kein Hintergrundbild habe. Woran kann das liegen?
    Das Punkte zählen funktioniert auch noch nicht so recht. So wie es jetzt ist, ist $Score immer 0. Wenn ich die MsgBox innerhalb von _Pic aktiviere, sehe ich aber, dass er zählt. Dann kriegt man aber am Ende X MsgBoxes.
    Außerdem wollte ich If $CloseClicked = 1 Then ExitLoop machen, um das Script jederzeit beenden zu können, aber dann stoppt die Schleife schon nach dem 1. Durchlauf.

  • Danke erstmal für die Antwort


    Dafür bin ich doch da ;)


    Also es funktioniert jetzt doch mit sleep. Allerdings nur, solange ich kein Hintergrundbild habe. Woran kann das liegen?


    Erstmal warum benutzt du Sleep? das kann nur zu problemen führen, da während Sleep() das Skript pausiert wird!
    Was nebenbei gesagt auch bei mir passiert - denn die verzögerung ist ja immer noch da.
    Benutze am besten wie in meinem Beispiel (welches ja funktioniert - verstehe nicht warum du nicht damit weiter arbeitest.) die Timer Funktionen.
    das mit dem Hintergrundbild lässt sich mit einem

    [autoit]

    GUICtrlSetState($BG,$GUI_DISABLE)

    [/autoit]


    ganz einfach lösen.

    Du machst es dir nur unnötig schwer, ich habe dein Skript ja bereits so weit angepasst, dass alle von dir gewünschten Funktionen schon eingebaut sind. ( bis auf das Bild) :
    - Spiel kann jederzeit durch den klick auf den Start/Stop Button wieder beendet werden.
    - Punkte werden korrekt berechnet
    - Timerfunktion klappt

    hättest ja eigentlich nur noch den BUtton austauschen müssen. Und dich dann nochmal durch das skript arbeiten damit du siehst wie es funktioniert.



    Das Punkte zählen funktioniert auch noch nicht so recht. So wie es jetzt ist, ist $Score immer 0. Wenn ich die MsgBox innerhalb von _Pic aktiviere, sehe ich aber, dass er zählt. Dann kriegt man aber am Ende X MsgBoxes.


    Die msgboxen werden erst nach dem beenden der Schleife ausgegeben (frag mich nicht warum). Aber zählen tut er bei mir auf jeden Fall richtig.



    Außerdem wollte ich If $CloseClicked = 1 Then ExitLoop machen, um das Script jederzeit beenden zu können, aber dann stoppt die Schleife schon nach dem 1. Durchlauf.

    Das liegt an Zeile 17

    [autoit]

    $CloseClicked = GUISetOnEvent($GUI_EVENT_CLOSE, "_Close")

    [/autoit]


    GUISetOnEvent gibt bei erfolgreicher "verknüpfung" 1 zurück. Bei einem Fehler 0.
    Da Das verknüpfen von $GUI_EVENT_CLOSE und der Funktion _Close() erfolgreich war,
    ist $CloseClicked bei dir im Skript IMMER 1.

  • Erstmal warum benutzt du Sleep? das kann nur zu problemen führen, da während Sleep() das Skript pausiert wird!
    Was nebenbei gesagt auch bei mir passiert - denn die verzögerung ist ja immer noch da.
    Benutze am besten wie in meinem Beispiel (welches ja funktioniert - verstehe nicht warum du nicht damit weiter arbeitest.) die Timer Funktionen.

    Oje bissl besser hingucken hätte mir wohl einiges erleichtert - hab deinen Spoiler völlig übersehen.
    Hatte es dann selbst mit dem Timer probiert, war aber nicht klar gekommen ...

    Das mit dem Hintergrund klappt nun auch.

    Danke!