Kolisionsabfrage von einem Quadrat und Rechteck

  • Ich wollte ein kleines Game machen und mir fehlt die Kolisionsabfrage, die ich nicht hinbekomme !

    Spoiler anzeigen
    [autoit]


    Global $pos = 50
    Global $pos1 = 20

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

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 625, 443, 192, 124)
    GUISetBkColor(0x000000)
    Global $Graphic1 = GUICtrlCreateGraphic(10, 100, 20, 70)
    GUICtrlSetBkColor(-1, 0xFFFF00)
    Global $Graphic2 = GUICtrlCreateGraphic(540, 100, 20, 70)
    GUICtrlSetBkColor(-1, 0xFFFF00)
    Global $Graphic3 = GUICtrlCreateGraphic(10, 100, 9, 9)
    GUICtrlSetBkColor(-1, 0xFF0000)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    HotKeySet("{UP}","up")
    HotKeySet("{down}","down")
    While 1
    $msg = GUIGetMsg()
    IF $msg = -3 Then Exit
    ;============================== Kolisionsabfrage==========================

    rechts()
    links()

    WEnd

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

    Func up()
    $pos = $pos -10
    GUICtrlSetPos($Graphic1,10,$pos)
    If $pos = -10 Then
    $pos = $pos +10
    EndIf
    EndFunc

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

    Func down()
    $pos = $pos +10
    GUICtrlSetPos($graphic1,10,$pos)
    If $pos = 400 Then
    $pos = $pos -10
    EndIf
    EndFunc

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

    Func links()
    $random = Random(0,450,1)
    Do
    $pos1 = $pos1 - 10
    Sleep(100)
    GUICtrlSetPos($Graphic3,$pos1,$random)
    Until $pos1 = 20
    EndFunc

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

    Func rechts()
    $random = Random(0,450,1)
    GUICtrlSetPos($Graphic2,540,$random - 20)
    Do
    $pos1 = $pos1 + 10
    GUICtrlSetPos($Graphic3,$pos1,$random)
    Sleep(100)
    Until $pos1 = 530
    EndFunc

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

    Ich hoffe ihr könnt mir weiterhelfen...

    Ein Spoiler im Spoiler im Spoiler...

    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen

    Die geheime Nachricht ist "Baum" !

    4 Mal editiert, zuletzt von F4R (30. März 2013 um 11:23)

  • Hi,

    Spoiler anzeigen
    [autoit]

    Func _RectCollision($iX1, $iY1, $iWidth1, $iHeight1, $iX2, $iY2, $iWidth2, $iHeight2)
    ;Author: Faweyr
    Return $iX1 + $iWidth1 > $iX2 And $iX1 < $iX2 + $iWidth2 And $iY1 + $iHeight1 > $iY2 And $iY1 < $iY2 + $iHeight2
    EndFunc ;==>_RectCollision

    [/autoit]


    oder

    [autoit]


    Func _RectCollision($Rect1X1, $Rect1Y1, $Rect1X2, $Rect1Y2, $Rect2X1, $Rect2Y1, $Rect2X2, $Rect2Y2)
    ; Prog@ndy
    Local Const $tagRECT = "long;long;long;long"
    Local $1 = DllStructCreate($tagRECT)
    Local $2 = DllStructCreate($tagRECT)
    Local $3 = DllStructCreate($tagRECT)
    DllStructSetData($1, 1, $Rect1X1)
    DllStructSetData($1, 2, $Rect1Y1)
    DllStructSetData($1, 3, $Rect1X2)
    DllStructSetData($1, 4, $Rect1Y2)
    DllStructSetData($2, 1, $Rect2X1)
    DllStructSetData($2, 2, $Rect2Y1)
    DllStructSetData($2, 3, $Rect2X2)
    DllStructSetData($2, 4, $Rect2Y2)
    Local $r = DllCall($userdll, "int", "IntersectRect", "ptr", DllStructGetPtr($3), "ptr", DllStructGetPtr($1), "ptr", DllStructGetPtr($2))
    If @error Then Return SetError(1, 0, 0)
    Return $r[0] <> 0
    EndFunc ;==>_RectCollision

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

    Func _intersection($Rect1X1, $Rect1Y1, $Rect1X2, $Rect1Y2, $Rect2X1, $Rect2Y1, $Rect2X2, $Rect2Y2) ;ergebnis ist die fläche der überschneidung
    ; Andy
    Local Const $tagRECT = "long;long;long;long"
    Local $1 = DllStructCreate($tagRECT)
    Local $2 = DllStructCreate($tagRECT)
    Local $3 = DllStructCreate($tagRECT)
    DllStructSetData($1, 1, $Rect1X1)
    DllStructSetData($1, 2, $Rect1Y1)
    DllStructSetData($1, 3, $Rect1X2)
    DllStructSetData($1, 4, $Rect1Y2)
    DllStructSetData($2, 1, $Rect2X1)
    DllStructSetData($2, 2, $Rect2Y1)
    DllStructSetData($2, 3, $Rect2X2)
    DllStructSetData($2, 4, $Rect2Y2)
    Local $r = DllCall($userdll, "int", "IntersectRect", "ptr", DllStructGetPtr($3), "ptr", DllStructGetPtr($1), "ptr", DllStructGetPtr($2))
    If @error Then Return SetError(1, 0, 0)
    Local $x1 = DllStructGetData($3, 1)
    Local $y1 = DllStructGetData($3, 2)
    Local $x2 = DllStructGetData($3, 3)
    Local $y2 = DllStructGetData($3, 4)
    Local $flaeche = ($x2 - $x1) * ($y2 - $y1)
    Return $flaeche
    EndFunc ;==>_intersection

    [/autoit]

    Die Suche nach "Kollision" im Forum findet übrigens ca. hundert Threads. Ich kann mir nicht vorstellen, dass dort keine verwertbaren Beispiele dabei sind...

    Übrigens würde auch eine Suche nach "Pong" weiterhelfen, dort kann man sich ansehen, wie das Problem bei fertigen Spielen gelöst wurde.

  • Andy ich habe versucht deine 1. Methode einzubauen aber irgendwie muss ich noch etwas verändern damit es Funktioniert kannst du dir
    Bitte den Skript nochmal anschauen und mir sagen was ich falsch gemacht habe , oder noch ändern muss

    Mfg F4R

    Spoiler anzeigen
    [autoit]

    Global $iHeight1 = 70
    Global $iWidth1 = 20
    Global $iY1 = 10
    Global $iX1 = 100

    [/autoit]


    Global $iHeight2 = 9
    Global $iWidth2 = 9
    Global $iX2 = 100
    Global $iY2 = 10

    Global $sleep = 100
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Pong", 625, 443, 192, 124)
    GUISetBkColor(0x000000)
    Global $Graphic1 = GUICtrlCreateGraphic($iY1, $iX1, $iWidth1, $iHeight1)
    GUICtrlSetBkColor(-1, 0xFFFF00)
    Global $Graphic2 = GUICtrlCreateGraphic(540, 100, 20, 70)
    GUICtrlSetBkColor(-1, 0xFFFF00)
    Global $Graphic3 = GUICtrlCreateGraphic($iY2, $iX2, $iWidth2, $iHeight2)
    GUICtrlSetBkColor(-1, 0xFF0000)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###


    HotKeySet("{UP}","up")
    HotKeySet("{down}","down")
    While 1
    $msg = GUIGetMsg()
    IF $msg = -3 Then Exit

    _RectCollision($iX1, $iY1, $iWidth1, $iHeight1, $iX2, $iY2, $iWidth2, $iHeight2)
    rechts()
    links()

    WEnd


    Func up()
    $iX1 = $iX1 -10
    GUICtrlSetPos($Graphic1,10,$iX1)
    If $iX1 = -10 Then
    $iX1 = $iX1 +10
    EndIf
    EndFunc


    Func down()
    $iX1 = $iX1 +10
    GUICtrlSetPos($graphic1,10,$iX1)
    If $iX1 = 400 Then
    $iX1 = $iX1 -10
    EndIf
    EndFunc

    Func links()
    $iY2 = Random(0,450,1)
    Do
    $iX2 = $iX2 - 10
    Sleep($sleep)
    GUICtrlSetPos($Graphic3,$iX2,$iY2)
    Until $iX2 = 20
    EndFunc


    Func rechts()
    $iY2 = Random(0,450,1)
    GUICtrlSetPos($Graphic2,540,$iY2 - 20)
    Do
    $iX2 = $iX2 + 10
    GUICtrlSetPos($Graphic3,$iX2,$iY2)
    Sleep($sleep)
    Until $iX2 = 530
    EndFunc

    Func _RectCollision($iX1, $iY1, $iWidth1, $iHeight1, $iX2, $iY2, $iWidth2, $iHeight2)
    ;Author: Faweyr

    Return $iX1 + $iWidth1 > $iX2 And $iX1 < $iX2 + $iWidth2 And $iY1 + $iHeight1 > $iY2 And $iY1 < $iY2 + $iHeight2

    EndFunc ;==>_RectCollision

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

    Ein Spoiler im Spoiler im Spoiler...

    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen

    Die geheime Nachricht ist "Baum" !

    2 Mal editiert, zuletzt von F4R (29. März 2013 um 15:46)

  • Ich bin noch nicht lang hier angemeldet, aber Danke für den Hinweis :)

    Ein Spoiler im Spoiler im Spoiler...

    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen

    Die geheime Nachricht ist "Baum" !

  • Hi,
    dein Beispielscript funktioniert bei mir einwandfrei.
    Ich kann das linke Paddel mit den Hoch/Runter-Tasten bewegen und den Ball zurückspielen.
    Das rechte Paddel hat einen "Automatikmodus" ^^

    Wenn du mit dem rechten Paddel auch noch spielen willst, musst du bei jeder der Kollisionen die Koordinaten der Paddel tauschen, d.h. Treffer auf dem Linken Paddel => Kollisionsabfrage (Rechtes Paddel,Kugel). Das Tauschen würde ich in die Funktion _RectCollision() packen.

    Schräges Laufen der Kugel erhält man, indem zu der x-Koordinate auch noch die y-Koordinate verändert wird. Nach einer Kollision (mit dem Rand nur oben und unten) wird dann einfach y=-y. Nach einer Kollision mit dem Paddel x=-x und y=-y

  • Bei Funktioniert es auch so, aber wenn man den Ball nicht Trifft geht das Spiel Trotzdem weiter...
    Desswegen ja die Kolisionsabfrage :)
    Und Danke für die vielen Tipps zur verbesserung !

    Ein Spoiler im Spoiler im Spoiler...

    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen

    Die geheime Nachricht ist "Baum" !

  • Zitat

    Bei Funktioniert es auch so, aber wenn man den Ball nicht Trifft geht das Spiel Trotzdem weiter...

    ach so^^
    Dann schau dir mal die Rückgabe der _RectCollision()-Funktion an...

    Weiterhin solltest du dir auch mal die Variableninhalte anschauen, wenn der Ball den Schläger trifft / nicht trifft.

    Das generelle Problem hängt daran, dass du die Koordinaten bzw. die Achsen falsch benennst...
    In einer GUI ist der Nullpunkt oben links.
    Nach RECHTS zählt man dann X
    Nach UNTEN Y

    Du machst das genau umgekehrt. Das ist so lange kein Problem, wie du auch deine eigenen Funktionen benutzt.
    Wenn du aber Funktionen benutzt, die das Koordinatensystem "richtig" (falsches Wort, aber ich hoffe du verstehst was ich meine) verwenden, dann muss die Funktion scheitern!

    Entweder, du schreibst alle externen Funktionen um (und das würde ich nicht machen^^) oder du schreibst dein Script um, so dass aufsteigende X nach rechts und aufsteigende Y nach unten laufen :thumbup:

    Die Abfrage nach der Kollision erfolgt dann so:

    [autoit]

    $ret = _RectCollision($iX1, $iY1, $iWidth1, $iHeight1, $iX2, $iY2, $iWidth2, $iHeight2)

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

    If $ret = True Then
    MsgBox(0, "Getroffen!", $ret,2) ;2 sekunden warten
    Else
    MsgBox(0, "Nicht getroffen!", $ret,2) ;2 sekunden warten
    EndIf

    [/autoit]
  • Danke für die Hilfe ich glaube verstanden zu haben was du meinst xD
    Damit hat sich das Thema erledigt...

    *close*

    Ein Spoiler im Spoiler im Spoiler...

    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen

    Die geheime Nachricht ist "Baum" !

  • Hier werden (grundsätzlich) keine Themen geschlossen.
    Du brauchst nur den Präfix des ersten Beitrags (auf Bearbeiten klicken) auf gelöst setzen. ;)

    Mfg

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Ich weis :D Ich hab das nur als 2. Bestätigung geschrieben das das Thema gelöst ist...

    Ein Spoiler im Spoiler im Spoiler...

    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen

    Die geheime Nachricht ist "Baum" !

  • Ich habe die Variablen geändert, aber irgendwie Funktioniert jetzt gar nichts mehr ?(
    Irgendwas ist Falsch ich weis aber nicht was...

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.8.0
    Author: F4R

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

    Script Function: Pong
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    Global $iHeight1 = 70
    Global $iWidth1 = 20
    Global $iY1 = 100
    Global $iX1 = 15

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

    Global $iHeight2 = 5
    Global $iWidth2 = 5
    Global $iX2 = 10
    Global $iY2 = 100

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

    Global $sleep = 100

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

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

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

    #region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Pong", 625, 443, 192, 124)
    GUISetBkColor(0x000000)
    Global $Graphic1 = GUICtrlCreateGraphic($iX1, $iY1, $iWidth1, $iHeight1)
    GUICtrlSetBkColor(-1, 0xFFFF00)
    Global $Graphic2 = GUICtrlCreateGraphic(540, 100, 20, 70)
    GUICtrlSetBkColor(-1, 0xFFFF00)
    Global $Graphic3 = GUICtrlCreateGraphic($iX2, $iY2, $iWidth2, $iHeight2)
    GUICtrlSetBkColor(-1, 0xFF0000)
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###

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

    HotKeySet("{UP}", "up")
    HotKeySet("{down}", "down")

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

    While 1
    $msg = GUIGetMsg()
    If $msg = -3 Then Exit

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

    $ret = _RectCollision($iX1, $iY1, $iWidth1, $iHeight1, $iX2, $iY2, $iWidth2, $iHeight2)
    If $ret = True Then
    rechts()
    EndIf
    links()
    WEnd

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

    Func up()
    $iY1 = $iY1 - 10
    GUICtrlSetPos($Graphic1, 10, $iY1)
    If $iY1 = -10 Then
    $iY1 = $iY1 + 10
    EndIf
    EndFunc ;==>up

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

    Func down()
    $iY1 = $iY1 + 10
    GUICtrlSetPos($Graphic1, 10, $iY1)
    If $iY1 = 400 Then
    $iY1 = $iY1 - 10
    EndIf
    EndFunc ;==>down

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

    Func links()
    $iX2 = Random(0, 450, 1)
    Do
    $iY2 = $iY2 - 10
    Sleep($sleep)
    GUICtrlSetPos($Graphic3, $iY2, $iX2)
    Until $iY2 = 20
    EndFunc ;==>links

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

    Func rechts()
    $iX2 = Random(0, 450, 1)
    GUICtrlSetPos($Graphic2, 540, $iX2 - 20)
    Do
    $iY2 = $iY2 + 10
    GUICtrlSetPos($Graphic3, $iY2, $iX2)
    Sleep($sleep)
    Until $iY2 = 530
    EndFunc ;==>rechts

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

    Func _RectCollision($iX1, $iY1, $iWidth1, $iHeight1, $iX2, $iY2, $iWidth2, $iHeight2)
    ;Author: Faweyr

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

    Return $iX1 + $iWidth1 > $iX2 And $iX1 < $iX2 + $iWidth2 And $iY1 + $iHeight1 > $iY2 And $iY1 < $iY2 + $iHeight2

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

    EndFunc ;==>_RectCollision

    [/autoit]

    Ein Spoiler im Spoiler im Spoiler...

    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen

    Die geheime Nachricht ist "Baum" !

  • Zitat

    Ich habe die Variablen geändert,

    nein, hattest du nicht, jedenfalls nicht in den Funktionen.
    Habe jetzt mal so geändert, dass es funktioniert...

    Schau dir mal in meiner Signatur das Thema "Wie man Scriptfehler findet und beseitigt..." an, du hast es nötig!

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.8.0
    Author: F4R

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

    Script Function: Pong
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    Global $iHeight1 = 70
    Global $iWidth1 = 20
    Global $iY1 = 100
    Global $iX1 = 15

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

    Global $iHeight2 = 5
    Global $iWidth2 = 5
    Global $iX2 = 400
    Global $iY2 = 130

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

    Global $sleep = 100

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

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

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

    #region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Pong", 625, 443, 192, 124)
    GUISetBkColor(0x000000)
    Global $Graphic1 = GUICtrlCreateGraphic($iX1, $iY1, $iWidth1, $iHeight1)
    GUICtrlSetBkColor(-1, 0xFFFF00)
    Global $Graphic2 = GUICtrlCreateGraphic(540, 100, 20, 70)
    GUICtrlSetBkColor(-1, 0xFFFF00)
    Global $Graphic3 = GUICtrlCreateGraphic($iX2, $iY2, $iWidth2, $iHeight2)
    GUICtrlSetBkColor(-1, 0xFF0000)
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###

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

    HotKeySet("{UP}", "up")
    HotKeySet("{down}", "down")

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

    Sleep(1000)

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

    While 1
    $msg = GUIGetMsg()
    If $msg = -3 Then Exit

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

    rechts()
    links()
    $ret = _RectCollision($iX1, $iY1, $iWidth1, $iHeight1, $iX2, $iY2, $iWidth2, $iHeight2)
    If $ret = False Then Exit (MsgBox(0, "Pong", "Du hast verloren!")) ;programm ende

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

    WEnd

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

    Func up()
    $iY1 = $iY1 - 10
    GUICtrlSetPos($Graphic1, 10, $iY1)
    If $iY1 = -10 Then
    $iY1 = $iY1 + 10
    EndIf
    EndFunc ;==>up

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

    Func down()
    $iY1 = $iY1 + 10
    GUICtrlSetPos($Graphic1, 10, $iY1)
    If $iY1 = 400 Then
    $iY1 = $iY1 - 10
    EndIf
    EndFunc ;==>down

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

    Func links()
    $iY2 = Random(20, 430, 1)
    Do
    $iX2 = $iX2 - 10
    Sleep($sleep)
    GUICtrlSetPos($Graphic3, $iX2, $iY2)
    Until $iX2 = 20
    EndFunc ;==>links

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

    Func rechts()

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

    GUICtrlSetPos($Graphic2, 540, $iY2 - 50) ;schläger
    Do
    $iX2 = $iX2 + 10

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

    GUICtrlSetPos($Graphic3, $iX2, $iY2) ;ball
    Sleep($sleep)
    Until $iX2 = 530
    EndFunc ;==>rechts

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

    Func _RectCollision($iX1, $iY1, $iWidth1, $iHeight1, $iX2, $iY2, $iWidth2, $iHeight2)
    ;Author: Faweyr
    Return ($iX1 + $iWidth1 > $iX2) And ($iX1 < $iX2 + $iWidth2) And ($iY1 + $iHeight1 > $iY2) And ($iY1 < $iY2 + $iHeight2)
    EndFunc ;==>_RectCollision

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Hier eine leichte Modifikation deines Programmes:

    Spoiler anzeigen
    [autoit]


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

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

    Global $iW = 625, $iH = 443
    Global $BalkenBreite = 20, $BalkenHoehe = 100, $BallGroesse = 9, $SchrittY = 10
    Global $BalkenLPosX = 20, $BalkenRPosX = $iW - $BalkenLPosX - $BalkenBreite, $BalkenLPosY = 100, $BalkenRPosY = 100
    Global $BallX, $BallY, $BallVektorX, $BallVektorY
    InitBallPos()

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 625, 443)
    GUISetBkColor(0x000000)
    Global $BalkenL = GUICtrlCreateGraphic($BalkenLPosX, $BalkenLPosY, $BalkenBreite, $BalkenHoehe)
    GUICtrlSetBkColor(-1, 0xFFFF00)
    Global $BalkenR = GUICtrlCreateGraphic($BalkenRPosX, $BalkenRPosY, $BalkenBreite, $BalkenHoehe)
    GUICtrlSetBkColor(-1, 0xFFFF00)
    Global $Ball = GUICtrlCreateGraphic($BallX, $BallY, $BallGroesse, $BallGroesse)
    GUICtrlSetBkColor(-1, 0xFF0000)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    HotKeySet("{up}","up")
    HotKeySet("{down}","down")
    HotKeySet("{ESC}","_Exit")

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

    While Sleep(10)
    $BallX += $BallVektorX
    $BallY += $BallVektorY
    If ($BallY <= 0) Or ($BallY >= $iH - $BallGroesse) Then $BallVektorY *= -1
    Switch $BallX
    Case -100 To 0
    MsgBox(0, "Test", "Spieler 1 hat verloren!")
    InitBallPos()
    Case $iW - $BallGroesse To $iW + 100
    MsgBox(0, "Test", "Spieler 2 hat verloren!")
    InitBallPos()
    EndSwitch
    If _RectCollision(Int($BallX), Int($BallY), Int($BallX) + $BallGroesse, Int($BallY) + $BallGroesse, _
    $BalkenLPosX, $BalkenLPosY, $BalkenLPosX + $BalkenBreite, $BalkenLPosY + $BalkenHoehe) Or _
    _RectCollision(Int($BallX), Int($BallY), Int($BallX) + $BallGroesse, Int($BallY) + $BallGroesse, _
    $BalkenRPosX, $BalkenRPosY, $BalkenRPosX + $BalkenBreite, $BalkenRPosY + $BalkenHoehe) Then $BallVektorX *= -1
    GUICtrlSetPos($Ball, $BallX, $BallY)
    WEnd

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

    Func _Exit()
    GUIDelete()
    Exit
    EndFunc

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

    Func up()
    If $BalkenLPosY - $SchrittY > -$SchrittY Then
    $BalkenLPosY -= $SchrittY
    GUICtrlSetPos($BalkenL, $BalkenLPosX, $BalkenLPosY)
    EndIf
    EndFunc

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

    Func down()
    If $BalkenLPosY + $BalkenHoehe + $SchrittY < $iH + $SchrittY Then
    $BalkenLPosY += $SchrittY
    GUICtrlSetPos($BalkenL, $BalkenLPosX, $BalkenLPosY)
    EndIf
    EndFunc

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

    Func InitBallPos()
    $BallX = RandomBallPos(0)
    $BallY = RandomBallPos(1)
    $BallVektorX = _Random(-2, 2, -0.25, 0.25)
    $BallVektorY = _Random(-2, 2, -0.25, 0.25)
    EndFunc

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

    Func _Random($min, $max, $emin, $emax, $int = 0)
    Local $r1 = Random($min, $emin, $int)
    Local $r2 = Random($emax, $max, $int)
    If Random(0, 1, 1) Then Return $r1
    Return $r2
    EndFunc ;==>_Random

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

    Func RandomBallPos($Achse)
    If Not $Achse Then Return Random($iW / 3, $iW * 2 / 3, 1)
    Return Random($iH / 3, $iH * 2 / 3, 1)
    EndFunc

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

    Func _RectCollision($Rect1X1,$Rect1Y1,$Rect1X2,$Rect1Y2, $Rect2X1, $Rect2Y1, $Rect2X2, $Rect2Y2)
    ; Prog@ndy
    Local Const $tagRECT = "long;long;long;long"
    Local $1 = DllStructCreate($tagRECT)
    Local $2 = DllStructCreate($tagRECT)
    Local $3 = DllStructCreate($tagRECT)
    DllStructSetData($1,1,$Rect1X1)
    DllStructSetData($1,2,$Rect1Y1)
    DllStructSetData($1,3,$Rect1X2)
    DllStructSetData($1,4,$Rect1Y2)
    DllStructSetData($2,1,$Rect2X1)
    DllStructSetData($2,2,$Rect2Y1)
    DllStructSetData($2,3,$Rect2X2)
    DllStructSetData($2,4,$Rect2Y2)
    Local $r = DllCall("User32.dll", "int", "IntersectRect", "ptr", DllStructGetPtr($3), "ptr", DllStructGetPtr($1), "ptr", DllStructGetPtr($2))
    If @error Then Return SetError(1,0,0)
    Return $r[0]<>0
    EndFunc

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯