RectCollison

  • Hie ich habe diese funtkion

    Spoiler anzeigen
    [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 ;==>_RectCollision

    [/autoit]

    Mit folgenden werten gefüllt. ich glaube bis jetzt ist noch alles riochtig aber muss ich da noch was ändern??

    Spoiler anzeigen
    [autoit]

    Func _RectCollision($f1pos[0], $f1pos[1], $f1pos[0]+200, $f1pos[1]+300, $fupos[0], $fupos[1], $fupos[0]+100, $fupos[1]+100)
    ; Prog@ndy
    Local Const $tagRECT = "long;long;long;long"
    Local $1 = DllStructCreate($tagRECT)
    Local $2 = DllStructCreate($tagRECT)
    Local $3 = DllStructCreate($tagRECT)
    DllStructSetData($1, 1, $f1pos[0])
    DllStructSetData($1, 2, $f1pos[1])
    DllStructSetData($1, 3, $f1pos[0]+200)
    DllStructSetData($1, 4, $f1pos[1]+300)
    DllStructSetData($2, 1, $fupos[0])
    DllStructSetData($2, 2, $fupos[1])
    DllStructSetData($2, 3, $fupos[0]+100)
    DllStructSetData($2, 4, $fupos[1]+100)
    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 ;==>_RectCollision

    [/autoit]
    [autoit]


    Func Ulam($n)
    Return 1
    EndFunc

    [/autoit]


    Rekursion FTW :D

    Einmal editiert, zuletzt von retrokid (16. Dezember 2009 um 18:03)

  • Ist nur die Frage wieso du in der Funktion ein Array benutzt?

    Eigentlich reicht es doch wenn du im Funktionsaufruf das mit Arrays machst. Davon mal aber das ich jetzt weis was die Funktion machen soll.
    Kollision zweier Rechtecke erkennen. :huh:

    MfG
    Der_Doc

  • schade die ist offline
    aber könnt ihr euch das ganz vllt nicht erschließen ob ich da noch was angeben muss

    [autoit]


    Func Ulam($n)
    Return 1
    EndFunc

    [/autoit]


    Rekursion FTW :D

  • hm ok mal zum thema:

    Zitat

    ich glaube bis jetzt ist noch alles riochtig aber muss ich da noch was ändern??

    funktioniert sie denn oder nicht? irgendwelche ausgaben oder meldungen?

  • ja

    Spoiler anzeigen

    C:\Dokumente und Einstellungen\NATHAN_2\Desktop\Aqua\gfh.au3 (79) : ==> Badly formatted "Func" statement.:
    Func RectCollision($f1pos[0], $f1pos[1], $f1pos[0]+200, $f1pos[1]+300, $fupos[0], $fupos[1], $fupos[0]+100, $fupos[1]+100)
    Func RectCollision($f1pos^ ERROR


    und ich glaube der hier hat sie geschrieben ist sogar on http://www.autoit.de/index.php?page=User&userID=200143

    [autoit]


    Func Ulam($n)
    Return 1
    EndFunc

    [/autoit]


    Rekursion FTW :D

  • Da funktionier nix.!

    Teste mal das. Musst eben nur die Variablen im Aufruf füllen.

    Spoiler anzeigen
    [autoit]

    ; Aufruf
    _RectCollision($f1pos[0], $f1pos[1], $f1pos[0]+200, $f1pos[1]+300, $fupos[0], $fupos[1], $fupos[0]+100, $fupos[1]+100)

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

    ; Funktion
    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 ;==>_RectCollision

    [/autoit]

    MfG
    Der_Doc

  • geht nicht
    C:\Dokumente und Einstellungen\NATHAN_2\Desktop\Aqua\gfh.au3 (34) : ==> Incorrect number of parameters in function call.:
    _RectCollision()
    ^ ERROR

    [autoit]


    Func Ulam($n)
    Return 1
    EndFunc

    [/autoit]


    Rekursion FTW :D

  • Ja, so hätte ich das auch gemacht.
    Parameter:

    • $Rect1X1 - X-Koordinate der linken oberen Ecke des 1. Rechtecks
    • $Rect1Y1 - Y-Koordinate der linken oberen Ecke des 1. Rechtecks
    • $Rect1X2 - X-Koordinate der rechten oberen Ecke des 1. Rechtecks
    • $Rect1Y2 - Y-Koordinate der rechten oberen Ecke des 1. Rechtecks
    • $Rect2X1 - X-Koordinate der linken oberen Ecke des 2. Rechtecks
    • $Rect2Y1 - Y-Koordinate der linken oberen Ecke des 2. Rechtecks
    • $Rect2X2 - X-Koordinate der rechten oberen Ecke des 2. Rechtecks
    • $Rect2Y2 - Y-Koordinate der rechten oberen Ecke des 2. Rechtecks

    Rückgabe:
    True, wenn sich die Rechtecke überschneiden
    False, wenn sie sich nicht überschneiden

  • Du solltest die Funktion nicht ändern, sondern mit den Koordinaten der beiden Objekte füttern, so dass du ein Wert zurück bekommst, ob beide Objekte eine Kollision haben oder nicht!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • ok im anhang sind die bilder ich möchte die collision zwischen futter und fisch

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <StaticConstants.au3>
    #include <Array.au3>
    #Include <Misc.au3>

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

    HotKeySet("{ESC}", "ende")

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

    ; Hauptvariablen-------------------------
    $f = 0
    Global $guix, $guiy
    Global $fischx = 200, $fischy = 300, $movex = 10, $movey = 10
    ; ---------------------------------------

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

    ; Guierstellung--------------------------
    $gui1 = GUICreate ("Aquarium",(@DesktopWidth), (@DesktopHeight-65),0,0)
    GUISetBkColor(0x0000ff,$gui1)
    $hintergrund = GUICtrlCreatepic("bilder\hintergrund.gif",0,0,@DesktopWidth,@DesktopHeight-50)
    $fisch1 = GUICtrlCreatepic("bilder\fischrechts1.gif",$fischx,$fischy, 120,100)
    $futter = GUICtrlCreatePic("bilder\futter.gif",-200,-200,100,100)
    GUISetState (@SW_SHOW)
    ; ---------------------------------------

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

    AdlibEnable("move_fisch", 20)

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

    ; Hauptfunktion des Guis-----------------
    While 1
    $c = GUIGetCursorInfo()
    $f1pos = ControlGetPos( "Aquarium", "", $fisch1)
    $fupos = ControlGetPos( "Aquarium", "", $futter)
    $msg = GUIGetMsg()
    _RectCollision()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    EndSelect
    If _IsPressed("01") and $f = 1 Then
    GUICtrlDelete($futter)
    $futter = GUICtrlCreatePic("bilder\futter.gif",$c[0]-40,$c[1]-40,100,100)
    $f = 1
    ElseIf _IsPressed("01") and $f = 0 then
    $futter = GUICtrlCreatePic("bilder\futter.gif",$c[0]-40,$c[1]-40,100,100)
    $f = 1
    Endif

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

    Wend
    ; ---------------------------------------

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

    ; Funktionen-----------------------------
    Func ende()
    Exit
    EndFunc

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

    Func move_fisch()
    Select
    Case $fischx < 0
    GUICtrlSetImage($fisch1,"bilder\fischrechts1.gif")
    $movex = Random(0, 10, 1)
    Case $fischx > @DesktopWidth - 120
    GUICtrlSetImage($fisch1,"bilder\fischlinks1.gif")
    $movex = Random(-10, 0, 1)
    EndSelect
    Select
    Case $fischy < 0
    $movey = Random(0, 10, 1)
    Case $fischy > @DesktopHeight - 100
    $movey = Random(-10, 0, 1)
    EndSelect
    $fischx = $fischx + $movex
    $fischy = $fischy + $movey
    GUICtrlSetPos($fisch1, $fischx, $fischy)
    EndFunc
    ; ---------------------------------------

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

    ;noch unwichtig-------------------------
    Func _RectCollision($f1pos[0], $f1pos[1], $f1pos[0]+200, $f1pos[1]+300, $fupos[0], $fupos[1], $fupos[0]+100, $fupos[1]+100)
    ; Prog@ndy
    Local Const $tagRECT = "long;long;long;long"
    Local $1 = DllStructCreate($tagRECT)
    Local $2 = DllStructCreate($tagRECT)
    Local $3 = DllStructCreate($tagRECT)
    DllStructSetData($1, 1, $f1pos[0])
    DllStructSetData($1, 2, $f1pos[1])
    DllStructSetData($1, 3, $f1pos[0]+200)
    DllStructSetData($1, 4, $f1pos[1]+300)
    DllStructSetData($2, 1, $fupos[0])
    DllStructSetData($2, 2, $fupos[1])
    DllStructSetData($2, 3, $fupos[0]+100)
    DllStructSetData($2, 4, $fupos[1]+100)
    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 ;==>_RectCollision

    [/autoit]
    [autoit]


    Func Ulam($n)
    Return 1
    EndFunc

    [/autoit]


    Rekursion FTW :D

  • Du darfst die Funktion nicht verändern. Der Funktionskopf bleibt immer gleich.
    Bei Aufruf, also an der Stelle, an der du die Kollision testen willst, musst du die Parameter setzen.
    Also Zeile 79 muss wie im original bleiben
    In Zeile 34 musst du die Parameter übergeben und die Kollision überprüfen.

  • Also ich breche weg wieso ist denn dein Funktionsaufruf NUR

    [autoit]

    _RectCollision()

    [/autoit]

    Er sollte doch

    [autoit]

    _RectCollision($f1pos[0], $f1pos[1], $f1pos[0]+200, $f1pos[1]+300, $fupos[0], $fupos[1], $fupos[0]+100, $fupos[1]+100)

    [/autoit]


    sein

    MfG
    Der_Doc

  • Bedenke, dass die Kollisionsabfrage von Rechtecken ausgeht. Wenn du komplexere Objekte hast, wird die Kollisionsabfrage ungenauer!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯