Spiel

  • So ich habe ein Problem mit meinem Spiel . Ich habe die Koordinaten in einer externen txt Datei abgespeichert sie werden ausgelesen + gesplittet und dann wenn man eine Taste drückt überprüft ob sie berührt werden. Nun habe ich aber ein Problem das spiel wird viel zu langsam so dass man es nicht mehr spielen will. :
    Zwei Probleme :

    • Sobald man ein Objekt berührt bleibt man darin stecken und es geht garnichts mehr :(
    • Alles wird zu langsam


    Skript :

    Spoiler anzeigen
    [autoit]

    If _IsPressed("57") Then
    $Touch1 = False
    For $i = 1 to Ubound($Map_1,1)-1
    $Splitted = StringSplit($Map_1[$i],",")
    If _ObjectTouch($Splitted[1],$Splitted[2],$Splitted[3],$Splitted[4],$CharPosX,$CharPosY,45,41) = 1 Then
    $Touch1 = True
    EndIf
    Next
    If $Touch1 = False Then
    GUICtrlSetPos($CharIn , $CharPosX , $CharPosY -2)
    GUICtrlSetImage($CharIn,$Char4)
    $CharPosX = $CharPosX
    $CharPosY = $CharPosY - 2
    EndIf
    EndIf
    If _IsPressed("53") Then
    $Touch2 = False
    For $i = 1 to Ubound($Map_1,1)-1
    $Splitted = StringSplit($Map_1[$i],",")
    If _ObjectTouch($Splitted[1],$Splitted[2],$Splitted[3],$Splitted[4],$CharPosX,$CharPosY,45,41) = 1 Then
    $Touch2 = True
    EndIf
    Next
    If $Touch2 = False Then
    GUICtrlSetPos($CharIn , $CharPosX , $CharPosY +2)
    GUICtrlSetImage($CharIn,$Char2)
    $CharPosX = $CharPosX
    $CharPosY = $CharPosY + 2
    EndIf
    EndIf
    If _IsPressed("44") Then
    $Touch3 = False
    For $i = 1 to Ubound($Map_1,1)-1
    $Splitted = StringSplit($Map_1[$i],",")
    If _ObjectTouch($Splitted[1],$Splitted[2],$Splitted[3],$Splitted[4],$CharPosX,$CharPosY,45,41) = 1 Then
    $Touch3 = True
    EndIf
    Next
    If $Touch3 = False Then
    GUICtrlSetPos($CharIn , $CharPosX + 2 , $CharPosY)
    GUICtrlSetImage($CharIn,$Char)
    $CharPosX = $CharPosX + 2
    $CharPosY = $CharPosY
    EndIf
    EndIf
    If _IsPressed("41") Then
    $Touch4 = False
    For $i = 1 to Ubound($Map_1,1)-1
    $Splitted = StringSplit($Map_1[$i],",")
    If _ObjectTouch($Splitted[1],$Splitted[2],$Splitted[3],$Splitted[4],$CharPosX,$CharPosY,45,41) = 1 Then
    $Touch4 = True
    EndIf
    Next
    If $Touch4 = False Then
    GUICtrlSetPos($CharIn , $CharPosX - 2 , $CharPosY)
    GUICtrlSetImage($CharIn,$Char3)
    $CharPosX = $CharPosX - 2
    $CharPosY = $CharPosY
    EndIf
    EndIf

    [/autoit]


    Ich habe ein Include benutzt hier ist es :
    Touch.au3 :

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    ;===========================================================================================================================================
    ;Name:_ObjectTouchUp
    ;Beschreibung: Überprüft ob die obere Seite eines Objekts ein anderes Objekt berührt.
    ;Parameter: $Stat_01: X Position von Objekt 1
    ; $Stat_02: Y Position von Objekt 1
    ; $Stat_03: Länge von Objekt 1
    ; $Stat_04: Höhe von Objekt 1
    ; $Stat2_01: X Position von Objekt 2
    ; $Stat2_02: Y Positon von Object 2
    ; $Stat2_03: Länge von Objekt 2
    ; $Stat2_04: Höhe von Objekt 2
    ;Return Values: Bei Berührung 1
    ; Ansonsten: 0
    ;Author:nof@ker
    ;===========================================================================================================================================
    Func _ObjectTouchUp($Stat_01,$Stat_02,$Stat_03,$Stat_04,$Stat2_01,$Stat2_02,$Stat2_03,$Stat2_04)
    $Ausmass1LeftStart=$Stat_01
    $Ausmass1LeftEnd=$Stat_01+$Stat_03
    $Ausmass1HeightStart=$Stat_02
    $Ausmass1HeightEnd=$Stat_02+$Stat_04
    $Ausmass2LeftStart=$Stat2_01
    $Ausmass2LeftEnd=$Stat2_01+$Stat2_03
    $Ausmass2HeightStart=$Stat2_02
    $Ausmass2HeightEnd=$Stat2_02+$Stat2_04
    $TouchLeft=False
    $TouchHeight=False
    For $i=$Ausmass1LeftStart to $Ausmass1LeftEnd
    If $i=$Stat2_01 Then
    $TouchLeft=True
    EndIf
    Next
    For $i=$Ausmass1HeightStart to $Ausmass1HeightEnd
    If $i=$Stat2_02 Then
    $TouchHeight=True
    EndIf
    Next
    If $TouchLeft=True and $TouchHeight=True Then
    Return 1
    Else
    Return 0
    EndIf
    EndFunc
    ;===========================================================================================================================================
    ;Name:_ObjectTouchDown
    ;Beschreibung: Überprüft ob die untere Seite eines Objekts ein anderes Objekt berührt.
    ;Parameter: $Stat_01: X Position von Objekt 1
    ; $Stat_02: Y Position von Objekt 1
    ; $Stat_03: Länge von Objekt 1
    ; $Stat_04: Höhe von Objekt 1
    ; $Stat2_01: X Position von Objekt 2
    ; $Stat2_02: Y Positon von Object 2
    ; $Stat2_03: Länge von Objekt 2
    ; $Stat2_04: Höhe von Objekt 2
    ;Return Values: Bei Berührung 1
    ; Ansonsten: 0
    ;Author:nof@ker
    ;===========================================================================================================================================
    Func _ObjectTouchDown($Stat_01,$Stat_02,$Stat_03,$Stat_04,$Stat2_01,$Stat2_02,$Stat2_03,$Stat2_04)
    $Ausmass1LeftStart=$Stat_01
    $Ausmass1LeftEnd=$Stat_01+$Stat_03
    $Ausmass1HeightStart=$Stat_02
    $Ausmass1HeightEnd=$Stat_02+$Stat_04
    $Ausmass2LeftStart=$Stat2_01
    $Ausmass2LeftEnd=$Stat2_01+$Stat2_03
    $Ausmass2HeightStart=$Stat2_02
    $Ausmass2HeightEnd=$Stat2_02+$Stat2_04
    $TouchLeft=False
    $TouchHeight=False
    For $i=$Ausmass1LeftStart to $Ausmass1LeftEnd
    If $i=$Stat2_01 Then
    $TouchLeft=True
    EndIf
    Next
    For $i=$Ausmass1HeightStart to $Ausmass1HeightEnd
    If $i=$Ausmass2HeightEnd Then
    $TouchHeight=True
    EndIf
    Next
    If $TouchLeft=True and $TouchHeight=True Then
    Return 1
    Else
    Return 0
    EndIf
    EndFunc
    ;===========================================================================================================================================
    ;Name:_ObjectTouchLeft
    ;Beschreibung: Überprüft ob die linke Seite eines Objekts ein anderes Objekt berührt.
    ;Parameter: $Stat_01: X Position von Objekt 1
    ; $Stat_02: Y Position von Objekt 1
    ; $Stat_03: Länge von Objekt 1
    ; $Stat_04: Höhe von Objekt 1
    ; $Stat2_01: X Position von Objekt 2
    ; $Stat2_02: Y Positon von Object 2
    ; $Stat2_03: Länge von Objekt 2
    ; $Stat2_04: Höhe von Objekt 2
    ;Return Values: Bei Berührung 1
    ; Ansonsten: 0
    ;Author:nof@ker
    ;===========================================================================================================================================
    Func _ObjectTouchLeft($Stat_01,$Stat_02,$Stat_03,$Stat_04,$Stat2_01,$Stat2_02,$Stat2_03,$Stat2_04)
    $Ausmass1LeftStart=$Stat_01
    $Ausmass1LeftEnd=$Stat_01+$Stat_03
    $Ausmass1HeightStart=$Stat_02
    $Ausmass1HeightEnd=$Stat_02+$Stat_04
    $Ausmass2LeftStart=$Stat2_01
    $Ausmass2LeftEnd=$Stat2_01+$Stat2_03
    $Ausmass2HeightStart=$Stat2_02
    $Ausmass2HeightEnd=$Stat2_02+$Stat2_04
    $TouchLeft=False
    $TouchHeight=False
    For $i=$Ausmass1LeftStart to $Ausmass1LeftEnd
    If $i=$Ausmass2LeftStart Then
    $TouchLeft=True
    EndIf
    Next
    For $i=$Ausmass1HeightStart to $Ausmass1HeightEnd
    For $j=$Ausmass2HeightStart to $Ausmass2HeightEnd
    If $i=$j Then
    $TouchHeight=True
    EndIf
    Next
    Next
    If $TouchLeft=True and $TouchHeight=True Then
    Return 1
    Else
    Return 0
    EndIf
    EndFunc
    ;===========================================================================================================================================
    ;Name:_ObjectTouchRight
    ;Beschreibung: Überprüft ob die rechte Seite eines Objekts ein anderes Objekt berührt.
    ;Parameter: $Stat_01: X Position von Objekt 1
    ; $Stat_02: Y Position von Objekt 1
    ; $Stat_03: Länge von Objekt 1
    ; $Stat_04: Höhe von Objekt 1
    ; $Stat2_01: X Position von Objekt 2
    ; $Stat2_02: Y Positon von Object 2
    ; $Stat2_03: Länge von Objekt 2
    ; $Stat2_04: Höhe von Objekt 2
    ;Return Values: Bei Berührung 1
    ; Ansonsten: 0
    ;Author:nof@ker
    ;===========================================================================================================================================
    Func _ObjectTouchRight($Stat_01,$Stat_02,$Stat_03,$Stat_04,$Stat2_01,$Stat2_02,$Stat2_03,$Stat2_04)
    $Ausmass1LeftStart=$Stat_01
    $Ausmass1LeftEnd=$Stat_01+$Stat_03
    $Ausmass1HeightStart=$Stat_02
    $Ausmass1HeightEnd=$Stat_02+$Stat_04
    $Ausmass2LeftStart=$Stat2_01
    $Ausmass2LeftEnd=$Stat2_01+$Stat2_03
    $Ausmass2HeightStart=$Stat2_02
    $Ausmass2HeightEnd=$Stat2_02+$Stat2_04
    $TouchLeft=False
    $TouchHeight=False
    For $i=$Ausmass1LeftStart to $Ausmass1LeftEnd
    If $i=$Ausmass2LeftEnd Then
    $TouchLeft=True
    EndIf
    Next
    For $i=$Ausmass1HeightStart to $Ausmass1HeightEnd
    For $j=$Ausmass2HeightStart to $Ausmass2HeightEnd
    If $i=$j Then
    $TouchHeight=True
    EndIf
    Next
    Next
    If $TouchLeft=True and $TouchHeight=True Then
    Return 1
    Else
    Return 0
    EndIf
    EndFunc
    ;===========================================================================================================================================
    ;Name:_ObjectinObject
    ;Beschreibung: Überprüft ob ein Objekt in einem anderen Objekt liegt.
    ;Parameter: $Stat_01: X Position von Objekt 1
    ; $Stat_02: Y Position von Objekt 1
    ; $Stat_03: Länge von Objekt 1
    ; $Stat_04: Höhe von Objekt 1
    ; $Stat2_01: X Position von Objekt 2
    ; $Stat2_02: Y Positon von Object 2
    ; $Stat2_03: Länge von Objekt 2
    ; $Stat2_04: Höhe von Objekt 2
    ;Return Values: Bei Ineinanderliegen 1
    ; Ansonsten: 0
    ;Author:nof@ker
    ;===========================================================================================================================================
    Func _ObjectinObject($Stat_01,$Stat_02,$Stat_03,$Stat_04,$Stat2_01,$Stat2_02,$Stat2_03,$Stat2_04)
    $Ausmass1LeftStart=$Stat_01
    $Ausmass1LeftEnd=$Stat_01+$Stat_03
    $Ausmass1HeightStart=$Stat_02
    $Ausmass1HeightEnd=$Stat_02+$Stat_04
    $Ausmass2LeftStart=$Stat2_01
    $Ausmass2LeftEnd=$Stat2_01+$Stat2_03
    $Ausmass2HeightStart=$Stat2_02
    $Ausmass2HeightEnd=$Stat2_02+$Stat2_04
    $TouchX=False
    $TouchY=False
    For $i=$Ausmass1LeftStart to $Ausmass1LeftEnd
    For $j=$Ausmass2LeftStart to $Ausmass2LeftEnd
    If $i=$j Then
    $TouchX=True
    EndIf
    Next
    Next
    For $i=$Ausmass1HeightStart to $Ausmass1HeightEnd
    For $j=$Ausmass2HeightStart to $Ausmass2HeightEnd
    If $i=$j Then
    $TouchY=True
    EndIf
    Next
    Next
    If $TouchX and $TouchY = True Then
    Return 1
    Else
    Return 0
    EndIf
    EndFunc
    Func _ObjectTouch($Stat_01,$Stat_02,$Stat_03,$Stat_04,$Stat2_01,$Stat2_02,$Stat2_03,$Stat2_04)
    $Ret=0
    If _ObjectTouchUp($Stat_01,$Stat_02,$Stat_03,$Stat_04,$Stat2_01,$Stat2_02,$Stat2_03,$Stat2_04) = 1 Then
    $Ret=1
    EndIf
    If _ObjectTouchDown($Stat_01,$Stat_02,$Stat_03,$Stat_04,$Stat2_01,$Stat2_02,$Stat2_03,$Stat2_04) = 1 Then
    $Ret=1
    EndIf
    If _ObjectTouchLeft($Stat_01,$Stat_02,$Stat_03,$Stat_04,$Stat2_01,$Stat2_02,$Stat2_03,$Stat2_04) = 1 Then
    $Ret=1
    EndIf
    If _ObjectTouchRight($Stat_01,$Stat_02,$Stat_03,$Stat_04,$Stat2_01,$Stat2_02,$Stat2_03,$Stat2_04) = 1 Then
    $Ret=1
    EndIf
    Return $Ret
    EndFunc ;ObjectTouch

    [/autoit]

    Einmal editiert, zuletzt von nof@ker2 (1. Mai 2009 um 17:58)

  • Schwierig zu sagen ohne das ganze Skript. Wie oft wird denn das ganze aufgerufen, also quasi wie groß ist die Zykluszeit? Wenn die zu hoch ist, dann ist es besser bei _ispressed die DLL mitzugeben (siehe Hilfe).

    Du könntst auch das Skript so verbessern, dass du wenn du dich nach links bewegst auch nur die _ObjectTouchLeft ausführst.
    Viel mehr ist so jetzt nicht zu sagen.

  • der letzte satz war es :D

    Zitat

    dass du wenn du dich nach links bewegst auch nur die _ObjectTouchLeft ausführst.

    Vielen dank jetzt klappts :D

    mfg nof@ker