Pong mit GDI+, wie mach ich den Strich beweglich?

  • Dein Fehler ist, dass du mit HotKeySet in eine Funktion springst, und dann eine (Endlos-)schleife mit _IsPressed produzierst. Damit blockierst du dir die restlichen Tasten. Mach es so wie ich in meinem Beispiel. Du brauchst auch nicht den ganzen Balken zu löschen und wieder neuzuzeichnen, sondern z.B. oben 10 Pixel dazumalen und unten 10 Pixel wieder löschen, dann flackert das auch nicht so, siehe eben mein Beispiel.

    Außerdem:
    26 UP ARROW key
    28 DOWN ARROW key

  • Warum geht der Rechte nicht? Wenn ich ganz viele Tasten aufeinmal drück, passiert auch bei dem Rechtem was O.o


    Du fragst in deinen Funktionen _hochR() und _runterR() die selben Tasten ab, wie in _hochL() und _runterL()!

    Gruß Ashpool

    Zitat von mir

    Bin immer wieder erstaunt, wie begrenzt ein Horizont sein kann.

  • Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Misc.au3>

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

    HotKeySet("{ESC}", "_ende")
    Global $Strichpos1 = @DesktopHeight / 2 - 70
    Global $Strichpos2 = @DesktopHeight / 2 + 70
    Global $Titel = "Pong"
    Global $Rahmenbreite = 10
    Global $dll = DllOpen("user32.dll")
    _GDIPlus_Startup()
    ;~ $WS_EX_COMPOSITED = 0x2000000
    Global $hGUI = GUICreate($Titel, @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, BitOR($WS_EX_TOPMOST, 0x0));$WS_EX_COMPOSITED))
    Global $hwnd = WinGetHandle($Titel)
    GUISetBkColor(0x0)
    $Willkommen = GUICtrlCreateLabel("Willkommen bei Pong made by Greek", @DesktopWidth / 4, @DesktopHeight / 2 - 150, 1000, 200)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetFont(-1, 40)
    GUISetState(@SW_SHOW)

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

    Do
    Sleep(100)
    Until _IsPressed("0D", $dll) Or _IsPressed("20", $dll)

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

    GUICtrlSetState($Willkommen, $GUI_HIDE)

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hwnd)
    $hPenRahmen = _GDIPlus_PenCreate(0xFF0000FF, 15, 2)
    $hPen = _GDIPlus_PenCreate(0xFFFFFFFF, 15, 2)
    $hpen_Del = _GDIPlus_PenCreate(0xFF000000, 15, 2)
    $b = _GDIPlus_GraphicsDrawLine($hGraphic, 100, $Strichpos1, 100, $Strichpos2, $hPen)
    _GDIPlus_GraphicsDrawLine($hGraphic, @DesktopWidth - 100, $Strichpos1, @DesktopWidth - 100, $Strichpos2, $hPen)
    _DrawRahmen()
    $Spielstand = GUICtrlCreateLabel("0:0", @DesktopWidth / 2, @DesktopHeight / 15, 100, 100)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetFont(-1, 40)

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

    AdlibEnable('_Zyklus', 10)

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

    Local $accel[4][2] = [["w"],["s"],["{UP}"],["{DOWN}"]]
    GuiSetAccelerators($accel)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

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

    Func _ende()
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_ende

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

    Func _DrawRahmen()
    _GDIPlus_GraphicsDrawLine($hGraphic, $Rahmenbreite / 2, 0, $Rahmenbreite / 2, @DesktopHeight, $hPenRahmen)
    _GDIPlus_GraphicsDrawLine($hGraphic, 0, $Rahmenbreite / 2, @DesktopWidth, $Rahmenbreite / 2, $hPenRahmen)
    _GDIPlus_GraphicsDrawLine($hGraphic, @DesktopWidth - $Rahmenbreite / 2, 0, @DesktopWidth - $Rahmenbreite / 2, @DesktopHeight, $hPenRahmen)
    _GDIPlus_GraphicsDrawLine($hGraphic, 0, @DesktopHeight - $Rahmenbreite / 2, @DesktopWidth, @DesktopHeight - $Rahmenbreite / 2, $hPenRahmen)
    EndFunc ;==>_DrawRahmen

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

    Func _Zyklus()
    If _IsPressed('57') Then
    _hoch()
    ElseIf _IsPressed('53') Then
    _runter()
    ElseIf _IsPressed('26') Then
    _hoch2()
    ElseIf _IsPressed('28') Then
    _runter2()
    EndIf
    ;Hier müssen noch die restlichen Aktionen rein
    EndFunc ;==>_Zyklus

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

    Func _hoch()
    If $Strichpos1 >= 25 Then
    _GDIPlus_GraphicsDrawLine($hGraphic, 100, $Strichpos2 - 10, 100, $Strichpos2, $hpen_Del)
    $Strichpos1 -= 10
    $Strichpos2 -= 10
    _GDIPlus_GraphicsDrawLine($hGraphic, 100, $Strichpos1, 100, $Strichpos2, $hPen)
    EndIf
    EndFunc ;==>_hoch

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

    Func _runter()
    If $Strichpos2 <= @DesktopHeight - 25 Then
    _GDIPlus_GraphicsDrawLine($hGraphic, 100, $Strichpos1, 100, $Strichpos1 + 10, $hpen_Del)
    $Strichpos1 += 10
    $Strichpos2 += 10
    _GDIPlus_GraphicsDrawLine($hGraphic, 100, $Strichpos1, 100, $Strichpos2, $hPen)
    EndIf
    EndFunc ;==>_runter

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

    Func _hoch2()
    If $Strichpos1 >= 25 Then
    _GDIPlus_GraphicsDrawLine($hGraphic, @DesktopWidth - 100, $Strichpos2 - 10, @DesktopWidth - 100, $Strichpos2, $hpen_Del)
    $Strichpos1 -= 10
    $Strichpos2 -= 10
    _GDIPlus_GraphicsDrawLine($hGraphic, @DesktopWidth - 100, $Strichpos1, @DesktopWidth - 100, $Strichpos2, $hPen)
    EndIf
    EndFunc ;==>_hoch

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

    Func _runter2()
    If $Strichpos2 <= @DesktopHeight - 25 Then
    _GDIPlus_GraphicsDrawLine($hGraphic, @DesktopWidth - 100, $Strichpos1, @DesktopWidth - 100, $Strichpos1 + 10, $hpen_Del)
    $Strichpos1 += 10
    $Strichpos2 += 10
    _GDIPlus_GraphicsDrawLine($hGraphic, @DesktopWidth - 100, $Strichpos1, @DesktopWidth - 100, $Strichpos2, $hPen)
    EndIf
    EndFunc ;==>_runter

    [/autoit]

    Wenn man beide Beweget ist es Total verbuggt, an was könnte das liegen?

    Edit: Ah ich glaub es liegt am Variablen Name Strickposition, die dürfen ja net gleich heißen, mom ausprobieren.

    Edit2: Ja lag an der Variable, aber man kann trotzdem nicht beide gleichzeitig drücken, es kann immer nur einer lenken.

    Edit3:

    [autoit]

    Func _Zyklus()
    If _IsPressed('57') Then
    _hoch()
    EndIf
    If _IsPressed('53') Then
    _runter()
    EndIf
    If _IsPressed('26') Then
    _hoch2()
    EndIf
    If _IsPressed('28') Then
    _runter2()
    EndIf
    ;Hier müssen noch die restlichen Aktionen rein
    EndFunc ;==>_Zyklus

    [/autoit]

    So funzt endlich alles, danke an alle die mir Geholfen haben!! =D

    2 Mal editiert, zuletzt von Greek (6. März 2009 um 20:12)