Collision Berechnen

  • Hallo,
    Ich versuche gerade das Spiel Mamba zu programmieren.

    Ich komm aber gerade bei der Collision nicht weiter, wie muss ich das machen?

    Spoiler anzeigen
    [autoit]

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

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

    Global $StartPosiSpinneX=152
    Global $StartPosiSpinneY=102
    Global $StartPosiSchlangeX=898
    Global $StartPosiSchlangeY=698
    Global $SpinnenSpeed=2
    Global $SchlangenSpeed=3
    Global $SpinnenDicke=40
    Global $SchlangenDicke=25

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

    $hWnd=GUICreate ( "Mamba", 1100, 850 )
    GUISetBkColor ( 0xABCDEF )
    $Beenden=GUICtrlCreateButton ( "Beenden", 965, 740, 125, 100 )
    GUISetState ()

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

    Local $accel[4][2]= [["{UP}"],["{DOWN}"],["{LEFT}"],["{RIGHT}"]]
    GUISetAccelerators($accel)

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

    _GDIPlus_Startup()

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hWnd)
    $HintergrundFeldFarbe=_GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    $SpinneFarbe=_GDIPlus_BrushCreateSolid(0xFF00FF00)
    $SchlangeFarbe=_GDIPlus_BrushCreateSolid(0xFFFF0000)

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

    $temp=_GDIPlus_BrushCreateSolid(0xFF000000)

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

    Sleep ( 20 )

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

    $HintergrundFeld=_GDIPlus_GraphicsFillRect ( $hGraphic, 150, 100, 800, 650, $HintergrundFeldFarbe )
    $SpielFeld=_GDIPlus_GraphicsDrawRect( $hGraphic, 148, 98, 802, 652 )
    $DieSpinne=_GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSpinneX, $StartPosiSpinneY, $SpinnenDicke, $SpinnenDicke, $SpinneFarbe )
    $DieSchlange=_GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSchlangeX, $StartPosiSchlangeY, $SchlangenDicke, $SchlangenDicke, $SchlangeFarbe )

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

    GUIRegisterMsg ( 0x000F, "wm_paint" )
    AdlibEnable('_Zyklus', 10)

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

    While 1
    $msg=GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    _GDIPlus_BrushDispose ( $HintergrundFeldFarbe )
    _GDIPlus_BrushDispose ( $SpinneFarbe )
    _GDIPlus_BrushDispose ( $SchlangeFarbe )
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    Exit
    Case $Beenden
    _GDIPlus_BrushDispose ( $HintergrundFeldFarbe )
    _GDIPlus_BrushDispose ( $SpinneFarbe )
    _GDIPlus_BrushDispose ( $SchlangeFarbe )
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    Exit
    EndSwitch
    WEnd

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

    Func _Zyklus()
    If _IsPressed('26') Then
    _hoch()
    ElseIf _IsPressed('28') Then
    _runter()
    ElseIf _IsPressed('25') Then
    _links()
    ElseIf _IsPressed('27') Then
    _rechts()
    EndIf
    _CollisionMitSchlange()
    EndFunc ;==>_Zyklus

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

    Func _hoch()
    If $StartPosiSpinneY-$SchlangenSpeed<=100 Then
    Sleep ( 1 )
    Else
    _GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSpinneX, $StartPosiSpinneY+38, $SpinnenDicke, 2, $HintergrundFeldFarbe )
    $StartPosiSpinneY-=$SpinnenSpeed
    _GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSpinneX, $StartPosiSpinneY, $SpinnenDicke, $SpinnenDicke, $SpinneFarbe )
    EndIf
    EndFunc

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

    Func _runter()
    If $StartPosiSpinneY+50>=756 Then
    Sleep ( 1 )
    Else
    _GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSpinneX, $StartPosiSpinneY, $SpinnenDicke, 2, $HintergrundFeldFarbe )
    $StartPosiSpinneY+=$SpinnenSpeed
    _GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSpinneX, $StartPosiSpinneY, $SpinnenDicke, $SpinnenDicke, $SpinneFarbe )
    EndIf
    EndFunc

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

    Func _links()
    If $StartPosiSpinneX-$SpinnenSpeed<=150 Then
    Sleep ( 1 )
    Else
    _GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSpinneX+38, $StartPosiSpinneY, 2, $SpinnenDicke, $HintergrundFeldFarbe )
    $StartPosiSpinneX-=$SpinnenSpeed
    _GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSpinneX, $StartPosiSpinneY, $SpinnenDicke, $SpinnenDicke, $SpinneFarbe )
    EndIf
    EndFunc

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

    Func _rechts()
    If $StartPosiSpinneX>=906 Then
    Sleep ( 1 )
    Else
    _GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSpinneX, $StartPosiSpinneY, 2, $SpinnenDicke, $HintergrundFeldFarbe )
    $StartPosiSpinneX+=$SpinnenSpeed
    _GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSpinneX, $StartPosiSpinneY, $SpinnenDicke, $SpinnenDicke, $SpinneFarbe )
    EndIf
    EndFunc

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

    Func wm_paint()
    Sleep ( 10 )
    $HintergrundFeld=_GDIPlus_GraphicsFillRect ( $hGraphic, 150, 100, 800, 650, $HintergrundFeldFarbe )
    $SpielFeld=_GDIPlus_GraphicsDrawRect( $hGraphic, 148, 98, 802, 652 )
    $DieSpinne=_GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSpinneX, $StartPosiSpinneY, $SpinnenDicke, $SpinnenDicke, $SpinneFarbe )
    $DieSchlange=_GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSchlangeX, $StartPosiSchlangeY, $SchlangenDicke, $SchlangenDicke, $SchlangeFarbe )
    EndFunc

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

    Func _CollisionMitSchlange()
    ToolTip ( "Spinne X "&$StartPosiSpinneX&" Spinne Y "&$StartPosiSpinneY&" Schlange X "&$StartPosiSchlangeX&" Schlange Y "&$StartPosiSchlangeY )
    If $StartPosiSpinneY+51=$StartPosiSchlangeY Then
    FileOpen ( @ScriptDir&"\temp.txt", 9 )
    FileWrite ( @ScriptDir&"\temp.txt", "Collision" )
    EndIf
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von Greek (6. April 2009 um 21:44)

  • Guck dir mal das hier an. da bewegt sich zwar ne GUI und kein GDI, aber vom prnzieb her ist es das gleiche.

    Wollt eigl. auch noch sowas oda sowas ähnliches machen, such aber noch ne bessere Möglichkeit, collisionen zu berechnen.

    Vllt mach ich demnächst mal ne UDF draus...


    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <Misc.au3>
    $dll = DllOpen ("User32.dll")
    $Form = GUICreate ("Test", 100, 100, -1, -1, $WS_POPUP)
    GUISetBkColor (0xFF0000)
    GUISetState (@SW_SHOW)
    While 1
    ;~ #cs =======================================================
    $FormPos = WinGetPos ($Form)
    ; ----------------------
    ; ==> PosMove Start
    If $FormPos[0] > 20 Then
    If _IsPressed ("25", $dll) Then
    WinMove ($Form, "", $FormPos[0] - 5, $FormPos[1], $FormPos[2], $FormPos[3])
    Sleep (10)
    EndIf
    EndIf
    If $FormPos[0] < @DesktopWidth - $FormPos[2] - 20 Then
    If _IsPressed ("27", $dll) Then
    WinMove ($Form, "", $FormPos[0] + 5, $FormPos[1], $FormPos[2], $FormPos[3])
    Sleep (10)
    EndIf
    EndIf
    If $FormPos[1] > 20 Then
    If _IsPressed ("26", $dll) Then
    WinMove ($Form, "", $FormPos[0], $FormPos[1] - 5, $FormPos[2], $FormPos[3])
    Sleep (10)
    EndIf
    EndIf
    If $FormPos[1] < @DesktopHeight - $FormPos[2] - 40 Then
    If _IsPressed ("28", $dll) Then
    WinMove ($Form, "", $FormPos[0], $FormPos[1] + 5, $FormPos[2], $FormPos[3])
    Sleep (10)
    EndIf
    EndIf
    ; ==> PosMove End
    ; ----------------------
    ; ==> SizeMove Start
    If $FormPos[2] < 150 Then
    If _IsPressed ("21", $dll) Then
    WinMove ($Form, "", $FormPos[0], $FormPos[1], $FormPos[2] + 5, $FormPos[3] + 5)
    Sleep (10)
    EndIf
    EndIf
    If $FormPos[2] > 20 Then
    If _IsPressed ("22", $dll) Then
    WinMove ($Form, "", $FormPos[0], $FormPos[1], $FormPos[2] - 5, $FormPos[3] - 5)
    Sleep (10)
    EndIf
    EndIf
    ;~ #ce =======================================================
    ; ==> Func's Start
    $msg = GUIGetMsg ()
    If $msg = -3 Then Exit
    WEnd

    DllClose ($dll)

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Funktioniert das?

    Spoiler anzeigen
    [autoit]

    Func _RectCollision($Rect1X1,$Rect1Y1,$Rect1X2,$Rect1Y2, $Rect2X1, $Rect2Y1, $Rect2X2, $Rect2Y2)
    ; Prog@ndy
    Local Const $tagRECT = "long[4]"
    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("gdi32.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] [autoit][/autoit] [autoit][/autoit]


    Als Parameter: 2 Rechtecke, jeweils: X/Y linker oberer Punkt, X/Y rechter unterer Punkt

  • Habs jetzt so benutzt :

    Spoiler anzeigen
    [autoit]

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

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

    Global $StartPosiSpinneX=152
    Global $StartPosiSpinneY=102
    Global $StartPosiSchlangeX=898
    Global $StartPosiSchlangeY=698
    Global $SpinnenSpeed=2
    Global $SchlangenSpeed=3
    Global $SpinnenDicke=40
    Global $SchlangenDicke=25

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

    $hWnd=GUICreate ( "Mamba", 1100, 850 )
    GUISetBkColor ( 0xABCDEF )
    $Beenden=GUICtrlCreateButton ( "Beenden", 965, 740, 125, 100 )
    GUISetState ()

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

    Local $accel[4][2]= [["{UP}"],["{DOWN}"],["{LEFT}"],["{RIGHT}"]]
    GUISetAccelerators($accel)

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

    _GDIPlus_Startup()

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hWnd)
    $HintergrundFeldFarbe=_GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    $SpinneFarbe=_GDIPlus_BrushCreateSolid(0xFF00FF00)
    $SchlangeFarbe=_GDIPlus_BrushCreateSolid(0xFFFF0000)

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

    $temp=_GDIPlus_BrushCreateSolid(0xFF000000)

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

    Sleep ( 20 )

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

    $HintergrundFeld=_GDIPlus_GraphicsFillRect ( $hGraphic, 150, 100, 800, 650, $HintergrundFeldFarbe )
    $SpielFeld=_GDIPlus_GraphicsDrawRect( $hGraphic, 148, 98, 802, 652 )
    $DieSpinne=_GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSpinneX, $StartPosiSpinneY, $SpinnenDicke, $SpinnenDicke, $SpinneFarbe )
    $DieSchlange=_GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSchlangeX, $StartPosiSchlangeY, $SchlangenDicke, $SchlangenDicke, $SchlangeFarbe )

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

    GUIRegisterMsg ( 0x000F, "wm_paint" )
    AdlibEnable('_Zyklus', 10)

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

    While 1
    $msg=GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    _GDIPlus_BrushDispose ( $HintergrundFeldFarbe )
    _GDIPlus_BrushDispose ( $SpinneFarbe )
    _GDIPlus_BrushDispose ( $SchlangeFarbe )
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    Exit
    Case $Beenden
    _GDIPlus_BrushDispose ( $HintergrundFeldFarbe )
    _GDIPlus_BrushDispose ( $SpinneFarbe )
    _GDIPlus_BrushDispose ( $SchlangeFarbe )
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    Exit
    EndSwitch
    WEnd

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

    Func _Zyklus()
    If _IsPressed('26') Then
    _hoch()
    ElseIf _IsPressed('28') Then
    _runter()
    ElseIf _IsPressed('25') Then
    _links()
    ElseIf _IsPressed('27') Then
    _rechts()
    EndIf
    _CollisionMitSchlange()
    EndFunc ;==>_Zyklus

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

    Func _hoch()
    If $StartPosiSpinneY-$SchlangenSpeed<=100 Then
    Sleep ( 1 )
    Else
    _GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSpinneX, $StartPosiSpinneY+38, $SpinnenDicke, 2, $HintergrundFeldFarbe )
    $StartPosiSpinneY-=$SpinnenSpeed
    _GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSpinneX, $StartPosiSpinneY, $SpinnenDicke, $SpinnenDicke, $SpinneFarbe )
    EndIf
    EndFunc

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

    Func _runter()
    If $StartPosiSpinneY+50>=756 Then
    Sleep ( 1 )
    Else
    _GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSpinneX, $StartPosiSpinneY, $SpinnenDicke, 2, $HintergrundFeldFarbe )
    $StartPosiSpinneY+=$SpinnenSpeed
    _GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSpinneX, $StartPosiSpinneY, $SpinnenDicke, $SpinnenDicke, $SpinneFarbe )
    EndIf
    EndFunc

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

    Func _links()
    If $StartPosiSpinneX-$SpinnenSpeed<=150 Then
    Sleep ( 1 )
    Else
    _GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSpinneX+38, $StartPosiSpinneY, 2, $SpinnenDicke, $HintergrundFeldFarbe )
    $StartPosiSpinneX-=$SpinnenSpeed
    _GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSpinneX, $StartPosiSpinneY, $SpinnenDicke, $SpinnenDicke, $SpinneFarbe )
    EndIf
    EndFunc

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

    Func _rechts()
    If $StartPosiSpinneX>=906 Then
    Sleep ( 1 )
    Else
    _GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSpinneX, $StartPosiSpinneY, 2, $SpinnenDicke, $HintergrundFeldFarbe )
    $StartPosiSpinneX+=$SpinnenSpeed
    _GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSpinneX, $StartPosiSpinneY, $SpinnenDicke, $SpinnenDicke, $SpinneFarbe )
    EndIf
    EndFunc

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

    Func wm_paint()
    Sleep ( 10 )
    $HintergrundFeld=_GDIPlus_GraphicsFillRect ( $hGraphic, 150, 100, 800, 650, $HintergrundFeldFarbe )
    $SpielFeld=_GDIPlus_GraphicsDrawRect( $hGraphic, 148, 98, 802, 652 )
    $DieSpinne=_GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSpinneX, $StartPosiSpinneY, $SpinnenDicke, $SpinnenDicke, $SpinneFarbe )
    $DieSchlange=_GDIPlus_GraphicsFillRect ( $hGraphic, $StartPosiSchlangeX, $StartPosiSchlangeY, $SchlangenDicke, $SchlangenDicke, $SchlangeFarbe )
    EndFunc

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

    Func _CollisionMitSchlange()
    ;~ ToolTip ( "Spinne X "&$StartPosiSpinneX&" Spinne Y "&$StartPosiSpinneY&" Schlange X "&$StartPosiSchlangeX&" Schlange Y "&$StartPosiSchlangeY )
    ;~ If $StartPosiSpinneY+51=$StartPosiSchlangeY Then
    ;~ FileOpen ( @ScriptDir&"\temp.txt", 9 )
    ;~ FileWrite ( @ScriptDir&"\temp.txt", "Collision" )
    ;~ EndIf
    $return=_RectCollision ( $StartPosiSpinneX, $StartPosiSpinneY, $StartPosiSpinneX+40, $StartPosiSpinneY+40, $StartPosiSchlangeX, $StartPosiSchlangeY, $StartPosiSchlangeX+25, $StartPosiSchlangeY+25 )
    If $return<>0 Then MsgBox ( 0, "", $return )
    EndFunc

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

    Func _RectCollision($Rect1X1,$Rect1Y1,$Rect1X2,$Rect1Y2, $Rect2X1, $Rect2Y1, $Rect2X2, $Rect2Y2)
    ; Prog@ndy
    Local Const $tagRECT = "long[4]"
    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("gdi32.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]

    Aber passiert nix :S

  • Tschuldigung. Hab die falsche DLL hingeschrieben und die DLLStruct flasch gemacht.

    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

    [/autoit]