[GDI+] Kollision

  • Hey Autoit.de User :P

    Ich hab da ein Problem mit GDI+,
    nämlich will ich herausfinden,
    ob sich 2 Objekte (Bilder / Player & Wand)
    miteinander schneiden, und ggf. es zu verhindern.

    Mein erster Ansatz war dieser:

    Spoiler anzeigen
    [autoit]

    Func Kollision($iX, $iY, $iImage); $iImage: 0 = Spieler, 1 = Background, 2 = Walls
    For $i = 0 To UBound($aWalls) - 1
    If ($iX + $aImageSize[$iImage][1]) = $aWalls[$i][0] And ($iY + $aImageSize[$iImage][0]) = $aWalls[$i][1] Then Return True; $aImageSize[$iImage][X]: 0 = Height , 1= Width
    Next
    Return False
    EndFunc ;==>Kollision

    [/autoit]

    Aber:

    Spoiler anzeigen

    [Blockierte Grafik: http://i.epvpimg.com/BM4rf.png] [Blockierte Grafik: http://i.epvpimg.com/647zc.png]

    Hat jemand eine Idee? (Script ink. Bilder im Anhang!) - Script is optimierungsbedürftig, ich weiß.

    PS: Ich frage hier, auch wenn es eine "einfache" Frage ist, weil
    ich ab und an Konzentration "Störungen" habe,
    ich versuch schon ca. 50min dieses Problem
    zu lösen, aber ich lande immer wieder am Anfang...

  • So, habe nun (endlich) eine (von 4) Abfragen fertig,
    und wollte fragen, ob es Verbesserungen gäbe.
    Nämlich für die Linke seite der "Wand" (nicht Außenwand!)

    Spoiler anzeigen
    [autoit]

    For $i = 0 To UBound($aWalls) - 1; iX = PlayerX ; iY = PlayerY ;; aWalls[$i][0] = Wand X ; aWalls[$i][1] = Wand Y ;; 20 = Wandhöhe & Breite ; 40 = Player höhe & breite
    If ($iX + 40) > ($aWalls[$i][0]) And ($iX + 20) < ($aWalls[$i][0]) Then
    If ($iY) < ($aWalls[$i][1]) Then
    If ($iY + 40) > ($aWalls[$i][1] + 20) Or ($iY + 40) > ($aWalls[$i][1]) Then
    Return True
    EndIf
    ElseIf ($iY) > ($aWalls[$i][1]) Then
    If ($iY) < ($aWalls[$i][1] + 20) and ($iY + 40) > ($aWalls[$i][1]) Then
    Return True
    EndIf
    EndIf
    EndIf
    Next

    [/autoit]

    2 Mal editiert, zuletzt von Njahs (13. November 2012 um 17:22)

  • Es gibt bei mir gerade ein paar Probleme beim runterladen der *.rar...

    Hier die Kollision Abfrage:

    [autoit]

    Func Kollision($x1, $y1, $h1, $w1, $x2, $y2, $w2, $h2)
    Return $x1 + $w1 > $x2 And $y1 + $h1 > $y2 And $x1 < $x2 + $w2 And $y1 < $y2 + $h2
    EndFunc

    [/autoit]

    Das sollte um einiges leichter sein...
    $x > X-Position der 1./2. Elementes
    $y > Y-Position der 1./2. Elementes
    $w > Breite des 1./2. Elementes
    $h> Höhe des 1./2. Elementes

    Wenn eine Kollision eintritt, wird True Return.


    Das wäre z.B. eine kurzschreibweise ^^