Hallo,
wie kann man in diesem Script in den Schleifen darstellen, dass wenn eine bestimme Farbe mit einer bestimmten Abweichung vorliegt, die Schleife eingeleitet oder beendet wird? Habs so probiert, geht aber nicht.
Kann jemand helfen?
;jetzt kommt ein menü im spiel. 2 möglichkeiten hat das menü, je nach dem ;was man vorher geschafft hat. die möglichkeiten unterscheiden sich in den ;farben.
$farbe3 = PixelSearch(1100,750,1100,750,0xFD0000,20)
If IsArray($farbe3) = True Then
Sleep(1000)
Send("{Enter down}")
Sleep(50)
Send("{Enter up}")
Du kannst mit Hilfe der Funktion "AdlibRegister" eine Funktion alle X-Milisekunden aufrufen lassen - optimal für eine Farbsuche ohne Schleife.
Währenddessen macht dein Script einfach weiter (in meinem Beispiel wartet es einfach in der Skript-nötigen While-Schleife (z.B. für GUI-Input).
Code:
Global $aColorMode[3]
Global $Color1 = 0xFFB700, $Color2 = 0xFFFFFF
AdlibRegister("_Colorsearch", 500) ; Ruft die Funktion die Farbe zu suchen alle 500ms (jede halbe Sekunde) auf
While 1
Sleep(100)
WEnd
Func _Colorsearch()
Local $aColorArray
$aColorMode[0] = 0
send("{space down}")
sleep(50)
send("{space up}")
Sleep(10)
$aColorArray = PixelSearch(w,y,x,z, $Color1, 20) ; Farbe 1 nach der gesucht wird
If Not @error Then ; Farbe 1 gefunden
$aColorMode[0] = 1
$aColorMode[1] = $aColorArray[0] ; PosX
$aColorMode[2] = $aColorArray[1] ; PosY
Else ; Farbe 1 nicht gefunden
$aColorArray = PixelSearch(w,y,x,z, $Color2, 20); Farbe 2 nach der gesucht wird (nur wenn Farbe 1 nicht gefunden wurde)
If Not @error Then ; Farbe 2 gefunden
$aColorMode[0] = 2
$aColorMode[1] = $aColorArray[0] ; PosX
$aColorMode[2] = $aColorArray[1] ; PosY
EndIf
EndIf
If $aColorMode[0] > 0 Then _ColorFound($aColorMode[0])
EndFunc
Func _ColorFound($pMode)
AdlibUnRegister("_Colorsearch") ; stopt den automatischen Aufruf der Such-Funktion
Select
Case $pMode = 1 ; Wenn Farbe 1 gefunden wurde
; was auch immer du hier machen willst
Case $pMode = 2 ; Wenn Farbe 2 gefunden wurde
; ... what ever
Case Else
; Fehlermeldung
MsgBox(48, "Error", "Unbekannter Modus: " & $pMode)
EndSelect
EndFunc
Vielleicht hätte ich erwähnen sollen, das erst nach dem einige male Enter, Space und "d" gedrückt wurde die Farbensuche beginnen darf. Dann befindet sich Fifa nämlich in einer Fussballpartie, es soll halt mit der Suche nach Schwarz überprüft werden, ob das Halbzeitpausenmenü schon da ist. Wenn das der Fall ist drückt der Bot es mit Enter weg, die 2. Halbzeit startet. Am Ende gibt es 2 Möglichkeiten eines Menüs- entweder man hat gewonnen, dann befindet sich bei xx,xx ein roter Pixel. Wenn nicht, irgendeine andere Farbe. Nachdem die Spielberichte weggedrückt wurden soll der Bot im Hauptmenü nicht mehr nach Farben suchen.
Was du davor oder danach machst, kannst du ja einfach einfügen.
Kurze Erklärung zu meinen Codeschnipsel:
Alle 500ms drückt er die Tasten:
send("{space down}")
sleep(50)
send("{space up}")
Sleep(10)
Danach sucht er nach Farbe 1 und 2. Wenn er eine von beiden gefunden hat, springt er in die Funktion "_ColorFound".
Dort kannst du bei Case = 1 bzw. Case = 2 definieren, was er machen soll, sobald er die jeweilige Farbe gefunden hat.
Sollte er keine der Farben gefunden haben, sucht er alle 500ms nach den beiden Farben (und drückt die 2 Tasten wieder), bis er eine von beiden gefunden hat.
Ich bin noch Anfänger in Auto-It,werde das in Zukunft dann auch in einzelne Funktionen teilen. Jetzt war ich gerade dabei mein Skript zu verbessern, es funktioniert zwar, aber an manchen stellen zu langsam. Diesen Teil hab ich geändert. Allerdings funktioniert PixelGetColor nicht, er führt immer den Else Teil der Schleife aus obwohl die Farbe 100%tig an der Stelle 1E1F1E ist (hab extra nochmal nur ein PixelGetColor Skript geschrieben und per MsgBox kam die auch raus).
Was ist daran bitte falsch?!
Das kann nicht funktionieren. Du versucht eine Zahl mit einem String zu vergleichen, was in AutoIt eigentlich noch möglich wäre, wenn der String nur Zahlen enthalten würde.
Richtig wäre es so:
Code:
If Hex($Farbe) == 0x1E1F1E Then
;oder einfach:
If $Farbe == 0x1E1F1E Then
Die einzelnen Sachen in mehrere Funktionen aufzuteilen ist außerdem nur dann sinnvoll, wenn diese Codestücke öfters verwendet werden. Wenn du sie nur einmal in der While-Schleife brauchst, hat es keinen Sinn sie in Funktionen aufzuteilen.
Gut das hab ich geändert. Geht aber trotzdem noch nicht, er findet die Farbe nicht. Ich hab hier nochmal einen Screenshot. Bei 976,684 liegt die Farbe 0x1E1F1E vor, aber es klappt einfach nicht. Kann AutoIt evtl. bei Vollbildspielen die Farbe nicht richtig auslesen? Vielleicht hat es auch was damit zu tun: Bei Fifa hat man bei Screenshots das Problem, das sie komplett grau sind, wenn man sie über die Druck Taste macht. Mit Fraps klappt es.
der Hex(...) befehl hat doch aber als rückgabe wert einen string :P
es ist zwar einfacher direkt die farbe mit dem hex-wert zu vergleichen, aber das kann nicht die fehlerquelle sein =)
Edit:
um herauszufinden wo das problem liegt, musst du schon für realistische bedinungen sorgen, und in einer dauerschleife das ganze checken.
hier mal ein beispiel-tool für den dauercheck auf den pixel:
Code:
Dim $color, $tmp
While Sleep(50)
$color = PixelGetColor(976,684)
ToolTip('0x'&Hex($color))
If $color<>$tmp Then
MsgBox(0, 'Notice', 'Die Farbe auf dem Pixel hat sich geändert auf 0x'&Hex($color))
$tmp=$color
EndIf
WEnd
Dim $color, $tmp
While Sleep(50)
$color = PixelGetColor(976,684)
ToolTip('0x'&Hex($color))
If $color<>$tmp Then
MsgBox(0, 'Notice', 'Die Farbe auf dem Pixel hat sich geändert auf 0x'&Hex($color))
$tmp=$color
EndIf
WEnd
Ich verstehe das Skript nicht genau. Er schreibt in $color die Farbe rein, gibt sie als Hex aus. Color ist ungleich $tmp, also gibt er wieder, aber in einer MsgBox aus, das gleiche aus. Wie funktioniert der dann permanent?
$tmp übernimmt nach der ersten MsgBox() den Wert von $color. Die MsgBox() wird also nur dann wieder ausgegeben, wenn sich die Farbe des Pixels ändert uns sich somit der aktuelle Farbwert ($color) vom alten Wert ($tmp) unterscheidet. Bleibt die Farbe des Pixels immer gleich, wirst du nur einmal eine MsgBox() Ausgabe bekommen.
Ich verstehe das Skript nicht genau. Er schreibt in $color die Farbe rein, gibt sie als Hex aus. Color ist ungleich $tmp, also gibt er wieder, aber in einer MsgBox aus, das gleiche aus. Wie funktioniert der dann permanent?
ich war davon ausgegengen, das du dir sicher bist, das der pixel dauerhaft diese farbe hat. so kannst du testen ob dies wirklich der fall ist.
sobald die farbe sich ändert popt hier eine msgbox auf, welche dich darauf hinweist.
interesannt hieran ist, ob tatsächlich die farbe ausgelesen wird, von welcher du hier ausgehst.
Hilfe bei der autoit while schleife 03/05/2010 - Metin2 - 7 Replies Hallo,
also ich habe ein problem und weiß nicht wie ich das lösen kann :(
ich will einen Multihack machen für metin2
aber wenn ich eine value freezen muss dann mache ich eine while schleife und dann kann man keinen anderen Button mehr aktivieren :(
z.B. (ein anderes von mit erstelltes programm)
Code: