Problem mit Pixelsearch

05/25/2013 02:55 RF1T2#1
Hallo! :D

zunächst möchte ich sagen, dass ich nicht neu bin.
ihr müsst mich also nicht willkommen heißen ;)
zum thema:


ich dacht mir es wäre schlau sich pixelsearch anzuschauen weil die idee doch sehr cool ist^^.jedenfalls habe ich mich jetzt eine weile damit beschäftigt und ein paar sachen gelesen, was gegoogelt und ein bisschen selbst rumprobiert.

lief auch alles ganz gut bis ich auf ein problem gestoßen bin, welches mir eher kopfzerbrechen bereitet als dass es sich von mir allein lösen lässt.
darum wollte ich euch um hilfe bitten

Code:
Func Start()
While 1
	$PixelPosAirEss = PixelSearch(0,0,@DesktopWidth, @DesktopHeight, 0x70AED6, 0)
	$PixelPosEarthEss = PixelSearch(0,0,@DesktopWidth, @DesktopHeight, 0xA86D58, 0)
	$PixelPosWaterEss = PixelSearch(0,0,@DesktopWidth, @DesktopHeight, 0xCB8195, 0)
		If Not @error Then
		MouseClick("left", $PixelPosAirEss[0], $PixelPosAirEss[1], 1, 0)
		Sleep(35000)

		Else
		MouseClick("left", $PixelPosEarthEss[0], $PixelPosEarthEss[1], 1, 0)
		Sleep(35000)

		ElseIf
		MouseClick("left", $PixelPosWaterEss[0], $PixelPosWaterEss[1], 1, 0)
		Sleep(35000)

		EndIf
WEnd
EndFunc
autoit sagt mir zwar:
Error: Too many "Else" statements for matching "If" statement.
aber habe trotz rumprobieren trotzdem keine lösung gefunden

(vielleicht habe ich auch etwas übersehen.in dem fall tut es mir leid :) )

bin noch relativ neu in autoit und hoffe ihr könnt mir helfen.

danke
05/25/2013 03:17 Requi#2
Vor dem EndIf hast eine ElseIf Abfrage ohne Abfrage. Mach aus dem ElseIf ein Else.
Bzw. Vollende diese ElseIf Abfrage.

Ich würde dies aber lieber mit Switch Case lösen. Kann aber auch sein dass ich falsch liege (müde)
05/25/2013 09:59 FacePalmMan#3
problem: funktion wird deklariert aber nicht aufgerufen.
lösung: while schleife und hotkeyset welcher die funktion aufruft (und ein hotkeyset um das ganze zu beenden)
volles script (mit kommentaren):
Code:
hotkeyset("{F8}","Start") ;wenn F8 gedrückt wurde dann springe zu funktion Start
hotkeyset("{F9}","_Exit") ;wenn F9 gedrückt wurde dann springe zu funktion _Exit

while 1 ;anfang der schleife
sleep(1) ;das hier soll (wort wörtlich) nichts tun
wend ;ende der schleife

Func Start() ;funktion Start fängt hier an
While 1 ;schleife startet
	$PixelPosAirEss = PixelSearch(0,0,@DesktopWidth, @DesktopHeight, 0x70AED6, 0) ;sucht nach pixel
	$PixelPosEarthEss = PixelSearch(0,0,@DesktopWidth, @DesktopHeight, 0xA86D58, 0);sucht nach pixel
	$PixelPosWaterEss = PixelSearch(0,0,@DesktopWidth, @DesktopHeight, 0xCB8195, 0);sucht nach pixel
	If IsArray($PixelPosEarthEss) Then ;wenn $PixelPosEarthEss eine array variable ist dann .....
		MouseClick("left", $PixelPosEarthEss[0], $PixelPosEarthEss[1], 1, 0) ;klickt auf den ausgesuchten pixel
		Sleep(35000) ;wartet 35 sekunden
	ElseIf IsArray($PixelPosAirEss) Then ;wenn ... eine array variable ist dann ....
		MouseClick("left", $PixelPosAirEss[0], $PixelPosAirEss[1], 1, 0) ;klickt auf den ausgesuchten pixel
		Sleep(35000) ;wartet 35 sekunden
	ElseIf IsArray($PixelPosWaterEss) Then ;wenn ... eine array variable ist dann ...
		MouseClick("left", $PixelPosWaterEss[0], $PixelPosWaterEss[1], 1, 0) ;klickt auf den ausgesuchten pixel
		Sleep(35000) ;wartet 35 sekunden
	EndIf ;If abfrage endet hier
WEnd ;schleife endet hier
EndFunc ;funktion endet hier

Func _Exit() ;Funktion _Exit startet hier
Exit ;Beendet das script
EndFunc ;Funktion _Exit endet hier
05/25/2013 17:56 RF1T2#4
danke für die antworten,
habe es nun so stehen:
Code:
Func Start()
While 1
	$PixelPosAirEss = PixelSearch(0,0,@DesktopWidth, @DesktopHeight, 0x70AED6, 0)
	$PixelPosEarthEss = PixelSearch(0,0,@DesktopWidth, @DesktopHeight, 0xA86D58, 0)
	$PixelPosWaterEss = PixelSearch(0,0,@DesktopWidth, @DesktopHeight, 0xCB8195, 0)
		If IsArray($PixelPosAirEss) Then
		MouseClick("left", $PixelPosAirEss[0], $PixelPosAirEss[1], 1, 0)
		Sleep(35000)

		ElseIf IsArray($PixelPosEarthEss) Then
		MouseClick("left", $PixelPosEarthEss[0], $PixelPosEarthEss[1], 1, 0)
		Sleep(35000)

		ElseIf IsArray($PixelPosWaterEss) Then
		MouseClick("left", $PixelPosWaterEss[0], $PixelPosWaterEss[1], 1, 0)
		Sleep(35000)

		EndIf
WEnd
EndFunc
ich bekomme zwar keine fehlermeldung mehr,
allerdings erziele ich nicht das ergebnis auf $PixelPosEarthEss oder $PixelPosWaterEss zu klicken falls sich kein $PixelPosAirEss findet

EDIT:
was ich vergessen hatte zu sagen ist, dass das nur ein ausschnitt des scripts ist das über hotkeyset verfügt. wollte es nur nicht unübersichtlich machen und habe deshalb nur die funktion "Func Start()" gepostet
05/25/2013 18:51 FacePalmMan#5
achso! o.k
hier das fertige script
Code:
Func Start() ;funktion Start fängt hier an
While 1 ;schleife startet
	$PixelPosAirEss = PixelSearch(0,0,@DesktopWidth, @DesktopHeight, 0x70AED6, 0) ;sucht nach pixel
	$PixelPosEarthEss = PixelSearch(0,0,@DesktopWidth, @DesktopHeight, 0xA86D58, 0);sucht nach pixel
	$PixelPosWaterEss = PixelSearch(0,0,@DesktopWidth, @DesktopHeight, 0xCB8195, 0);sucht nach pixel
	If IsArray($PixelPosEarthEss) Then ;wenn $PixelPosEarthEss eine array variable ist dann .....
		MouseClick("left", $PixelPosEarthEss[0], $PixelPosEarthEss[1], 1, 0) ;klickt auf den ausgesuchten pixel
		Sleep(35000) ;wartet 35 sekunden
	Else ;wenn $PixelPosEarthEss keine array variable ist dann
		If IsArray($PixelPosAirEss) Then ;wenn ... eine array variable ist dann ....
			MouseClick("left", $PixelPosAirEss[0], $PixelPosAirEss[1], 1, 0) ;klickt auf den ausgesuchten pixel
			Sleep(35000) ;wartet 35 sekunden
		ElseIf IsArray($PixelPosWaterEss) Then ;wenn ... eine array variable ist dann ...
			MouseClick("left", $PixelPosWaterEss[0], $PixelPosWaterEss[1], 1, 0) ;klickt auf den ausgesuchten pixel
			Sleep(35000) ;wartet 35 sekunden
		EndIf ;If abfrage endet hier
	EndIf
WEnd ;schleife endet hier
EndFunc ;funktion endet hier
05/25/2013 19:55 RF1T2#6
Code:
Func Start()
While 1
	$PixelPosAirEss = PixelSearch(0,0,@DesktopWidth, @DesktopHeight, 0x70AED6, 0)
	$PixelPosEarthEss = PixelSearch(0,0,@DesktopWidth, @DesktopHeight, 0xA86D58, 0)
	$PixelPosWaterEss = PixelSearch(0,0,@DesktopWidth, @DesktopHeight, 0xCB8195, 0)
		If IsArray($PixelPosAirEss) Then
		MouseClick("left", $PixelPosAirEss[0], $PixelPosAirEss[1], 1, 0)
		Sleep(1000)

		Else
		If IsArray($PixelPosEarthEss) Then
		MouseClick("left", $PixelPosEarthEss[0], $PixelPosEarthEss[1], 1, 0)
		Sleep(1000)

		ElseIf IsArray($PixelPosWaterEss) Then
		MouseClick("left", $PixelPosWaterEss[0], $PixelPosWaterEss[1], 1, 0)
		Sleep(1000)
		EndIf

		EndIf
WEnd
EndFunc
(sleep zu testzwecken verkürzt)
habe leider immernoch das problem, dass nur auf $PixelPosAirEss geklickt wird.
(soll falls es nicht da ist auf $PixelPosEarthEss oder $pixelPosWaterEss klicken)
habe das script schon compiled was aber auch nicht half.
weisst du vllt wo das problem liegt?
habe übrigens keinen speziellen include befehl gegeben
05/25/2013 20:03 YatoDev#7
es liegt am else .....
If
Else
EndIf
=
Wenn
wenn was anderes
Ende wenn

naja so ungefähr also er findet bei dir den pixel also brauch er die else abfrage nicht mehr zu bearbeiten
05/25/2013 20:11 WJNeeson#8
benutz am besten select
05/25/2013 20:33 RF1T2#9
Quote:
Originally Posted by »FlutterShy™ View Post
naja so ungefähr also er findet bei dir den pixel also brauch er die else abfrage nicht mehr zu bearbeiten
ne wenn er $airEss nich findet dann wartet er nur bis er es tut. aber klickt nicht auf $earthEss oder $waterEss

oder habe ich die jetzt falsch verstanden?
05/25/2013 20:55 WJNeeson#10
er schaut ob airess gefunden ist , falls nicht schaut er ob wateress gefunden ist , falls keins von beiden gefunden wurde schaut er ob earthess gefunden wurde
allerdings wäre das hier besser:
PHP Code:
Func Start()
While 
1
    $PixelPosAirEss 
PixelSearch(0,0,@DesktopWidth, @DesktopHeight0x70AED60)
    
$PixelPosEarthEss PixelSearch(0,0,@DesktopWidth, @DesktopHeight0xA86D580)
    
$PixelPosWaterEss PixelSearch(0,0,@DesktopWidth, @DesktopHeight0xCB81950)
    
Select
        
Case IsArray($PixelPosAirEss)
            ;
Anweisung
        
Case IsArray($PixelPosEarthEss)
            ;
Anweisung
        
Case IsArray($PixelPosWaterEss)
            ;
Anweisung
    EndSelect
WEnd
EndFunc 
05/25/2013 22:11 RF1T2#11
klappt! :)
das hauptproblem war jedoch ein anderes: die farbe von wateress und earthess sind nicht vorgekommen da das objekt in bewegung ist.das ist aber ein anderes problem dem ich mich lieber selbst annehme :D

dass es nun funtioniert weiss ich daher, dass wenn ich den screenshot,von dem ich die farben habe, in paint öffne übermalt das script alle gewünschten bereiche.

vielen vielen dank an euch für die hilfe :)