HitBox

01/20/2013 19:16 Serester#1
Hallo an alle,

bin neu hier, begrüße alle und lasse mich begrüßen ;-) .



Bin derzeit auf der Suche nach einer sogenannten Hitbox, also das nicht eine Koordinate als Auslöser dient sondern, ich geb vier Koordinaten an, die jeweils immer parallel zueinander liegen.
Ergibt dann entweder ein Quadrat oder ein Rechteck und wenn sich die gewählte Farbe in diesem Bereich befindet, dann klicke. Habe selbst schon einmal versucht aber es gelingt mir nicht.
Und nach langem suchen auch da keinen Erfolg.

Gibt es da einen einfachen Lösungsweg oder geht das schon wieder ins kompliziertere?



Mit einer Koordinate bekomme ich es hin, nur die Box ist für mich nicht lösbar.



Ich bedanke mich im voraus für eure Hilfe,

lG
01/20/2013 19:48 omer36#2
Deine beschreibung passt irgendwie auf die [Only registered and activated users can see links. Click Here To Register...]
oder meinst du was anderes?


kleines beispiel:
PHP Code:
$pSearch PixelSearch(00191910790xFFFFFF)
If 
IsArray($pSearchThen
    MouseClick
("left"$pSearch[0], $pSearch[1])
EndIf 
01/20/2013 23:46 Serester#3
Dankeschön, so etwas habe ich gesucht.
Gibt es noch eine Möglichkeit, wenn Farbe in Box, dann klicke aber mache Rechteck kleiner und warte, bis Farbe wieder in Box und mache dann wieder kleiner usw.?
Hört sich jetz zwar etwas kompliziert an aber möglich wäre es doch bestimmt, auf
Irgendeine Art.
01/21/2013 11:05 omer36#4
Einfache abfragen erstellen..

[Only registered and activated users can see links. Click Here To Register...]

PHP Code:
HotKeySet("{ESC}","end")


While 
Sleep(100)
    
$bereich1 PixelSearch(0010237670xFFFFFF)
    
$bereich2 PixelSearch(2011597755740xFFFFFF)
    
$bereich3 PixelSearch(4253675394490xFFFFFF)

    If 
IsArray($bereich1Then
        
If IsArray($bereich2Then
            
If IsArray($bereich3Then
                MsgBox
("Info""Pixel gefunden""Gesuchte Farbe gefunden:" & @CR "X: " $bereich3[0] & @CR "Y: " &  $bereich3[1])
                
MouseClick("left"$bereich3[0], $bereich3[1])
            EndIf
        EndIf
    EndIf
WEnd

Func end
()
    Exit
EndFunc 
01/21/2013 12:08 Serester#5
Auch dafür ein dickes Lob.
Hab mir das ganze jetz etwas schwieriger vorgestellt. Ich kann aber ganz normal auch ein then für den Mausklick in Suche 1u2 einbauen, ohne eine weitere Suche, falls ich schon in Suche 3 bin, einbüßen zu müssen, oder?

Also z.b. grünes Quadrat wandert in Suchfeld 1, Maus klickt.

In Suchfeld 2 erscheint aber wieder so ein grünes Quadrat doch das erste grüne befindet sich immer noch im ersten SFenster. Wird jetzt hier auch auf das erste reagiert oder spielt in dem Moment nur die zweite Suche seine Rolle?

Hoffe man versteht es und Danke im voraus!
01/21/2013 13:24 Achat#6
[Only registered and activated users can see links. Click Here To Register...]

[Only registered and activated users can see links. Click Here To Register...]

MfG
01/21/2013 16:06 Serester#7
Ist der else Operator nicht dafür da, wenn Anweisung nicht eintrifft, dann springe zur nächsten. Ist ja ein sonst.
Ist Farbe grün in Suchfeld 1, führe aus, sonst warte bis dato und dann fahre fort zur 2.Suche.
Kann ich die Else's einfach dazu quetschen?
01/21/2013 20:45 Croco™#8
Ich habe ein großes Tutorial über AutoIT gemacht dort sollte deine Frage beantwortet werden:
[Only registered and activated users can see links. Click Here To Register...]
01/21/2013 21:16 omer36#9
PHP Code:

While Sleep(100)
    
$bereich1 PixelSearch(0010237670xFFFFFF)
    
$bereich2 PixelSearch(2011597755740xFFFFFF)

    If 
IsArray($bereich1Then ;wenn farbe im 1. bereich gefunden wird
        MsgBox
("","","Farbe innerhalb des ersten bereichs gefunden")
        ;
führe das aus
        
;und das
        
;und das
        
If IsArray($bereich2Then ;und diese abfrage auch.
            
MsgBox("","","auch im 2. bereich wurde deine farbe gefunden")
            ;
tuhe dies
        
Else ;bereich 1 wurde gefunden, die msg ausgegeben und die 3 zeilen dadrunter ausgeführtaber die abfrage ist fehlgeschlagen
            
;also führe nun das aus
            MsgBox
("","","farbe im 2. bereich nicht gefunden")
        EndIf
    Else;
wenn die farbe im 1. bereich nicht gefunden wurde
        
;führe irgendwas anderes aus
        Sleep
(100);zBnichtsbis halt die farbe im 1. bereich gefunden wurde (eigüberflüssig..)
    EndIf
WEnd 
ist das so verständlich?
am besten die links oben anschauen, wird auch schön erklärt..



oder noch besser, was willst du denn machen?
vllt. gibts bessere/einfachere wege dies zu lösen.
01/22/2013 09:53 Serester#10
Ich brauche diesen, ich nenne es mal Bot zur Hilfe, zum programmieren eines Flash-Games.
Ich habe es vorher mit Java developed, dennoch werden, durch ein transparent jFrame die Farben ziemlich verfälscht.
Also habe ich mir gedacht, probier ich mal Autoit.

Was ich nun brauche sind ca. 15-20 Abfragen, von wegen, ist im ersten Kasten die Farbe grün, wenn ja, dann schalte erste Abfrage auf Standby(um hier keine weitere Ausführung zu tätigen), führe Aktion aus und gehe über zur zweiten Abfrage. Diesmal ist der Kasten kleiner und wartet auch darauf ein grünes Quadrat zu verschlingen un so geht das bis alle Abfragen positiv sind.

Nun wird es doch aber mit so vielen if's und else's ziemlich unübersichtlich, kann dafür auf irgendeine Art und Weise auch switch case verwendet werden?
01/23/2013 21:59 Achat#11
Quote:
Originally Posted by Serester View Post
Was ich nun brauche sind ca. 15-20 Abfragen, von wegen, ist im ersten Kasten die Farbe grün, wenn ja, dann schalte erste Abfrage auf Standby(um hier keine weitere Ausführung zu tätigen), führe Aktion aus und gehe über zur zweiten Abfrage. Diesmal ist der Kasten kleiner und wartet auch darauf ein grünes Quadrat zu verschlingen un so geht das bis alle Abfragen positiv sind.
kann dafür auf irgendeine Art und Weise auch switch case verwendet
Switch case führt alles aus. Ifs kannst du verschachteln

Code:
If $arg1 Then
	_1()
	If $arg2 Then
		_2()
		If $arg3 Then
			_3()
			If $arg4 Then
				_4()
				If $arg5 Then
					_5()
					If $arg6 Then
						_6()
						If $arg7 Then
							_7()
						EndIf
					EndIf
				EndIf
			EndIf
		EndIf
	EndIf
EndIf
€dit: Würde dazu aber eine Funktion mit Parametern benutzen, sonst wird das unübersichtlich.
€dit2: Zeig mal deinen Code.

MfG
01/24/2013 09:06 lolkop#12
Quote:
Originally Posted by Achat View Post
Switch case führt alles aus. Ifs kannst du verschachteln

Code:
If $arg1 Then
	_1()
	If $arg2 Then
		_2()
		If $arg3 Then
			_3()
			If $arg4 Then
				_4()
				If $arg5 Then
					_5()
					If $arg6 Then
						_6()
						If $arg7 Then
							_7()
						EndIf
					EndIf
				EndIf
			EndIf
		EndIf
	EndIf
EndIf
€dit: Würde dazu aber eine Funktion mit Parametern benutzen, sonst wird das unübersichtlich.
€dit2: Zeig mal deinen Code.

MfG
dieser sachverhalt lässt sich auch recht einfach in einer funktion abarbeiten:
Code:
Dim $dataArray[10] = [0,1,2,3,4,5,6,7,8,9]
Dim $conditionArray[10] = [1,1,1,1,1,1,1,1,1,1]

RecursiveWay($dataArray, $conditionArray)
IterativeWay($dataArray, $conditionArray)

Func RecursiveWay($dataArray, $conditionArray, $i=0)
	If $i>=UBound($dataArray) Or Not $conditionArray[$i] Then Return True
	ConsoleWrite($dataArray[$i]&@CRLF)
	Return RecursiveWay($dataArray, $conditionArray, $i+1)
EndFunc

Func IterativeWay($dataArray, $conditionArray)
	For $i=0 To UBound($dataArray)-1
		If $conditionArray[$i] Then
			ConsoleWrite($dataArray[$i]&@CRLF)
		Else
			ExitLoop
		EndIf
	Next
EndFunc
01/24/2013 13:19 Serester#13
Also, dass mit der Funktion verstehe ich Null :D.
Und richtig verschachteln lassen sich die if´s auch nicht.

Das Programm führt Suche 3, wenn sich das Quadrat darin befindet dauerhaft aus. Befindet sich das Quadrat jedoch in Suchbox 1, dann werden alle 3 Bereiche chronologisch und dauerhaft ausgeführt.

Hier, der Code

Code:
HotKeySet("{ESC}","end")

While (100)
    $box1 = PixelSearch(360, 90, 1000, 620, 0x80FF00)
    $box2 = PixelSearch(390, 120, 810, 530, 0x80FF00)
    $box3 = PixelSearch(430, 300, 600, 430, 0x80FF00)

    If IsArray($box1) Then
	   MouseClick("left",1260,100)
	   
        If IsArray($box2) Then
		   MouseClick("left",1230,200)
		   
            If IsArray($box3) Then
                MouseClick("left",1200,300)
            EndIf
        EndIf
    EndIf
WEnd
Func end()
    Exit
EndFunc
Wahrscheinlich versteh ich das ganze nicht richtig.
Habe auch schon versucht umzucoden und alles mögliche versucht aber ohne Erfolg.
:eek::eek::eek:
01/24/2013 13:41 lolkop#14
Quote:
Originally Posted by Serester View Post
Also, dass mit der Funktion verstehe ich Null :D.
Und richtig verschachteln lassen sich die if´s auch nicht.

Das Programm führt Suche 3, wenn sich das Quadrat darin befindet dauerhaft aus. Befindet sich das Quadrat jedoch in Suchbox 1, dann werden alle 3 Bereiche chronologisch und dauerhaft ausgeführt.

Hier, der Code

Code:
HotKeySet("{ESC}","end")

While (100)
    $box1 = PixelSearch(360, 90, 1000, 620, 0x80FF00)
    $box2 = PixelSearch(390, 120, 810, 530, 0x80FF00)
    $box3 = PixelSearch(430, 300, 600, 430, 0x80FF00)

    If IsArray($box1) Then
	   MouseClick("left",1260,100)
	   
        If IsArray($box2) Then
		   MouseClick("left",1230,200)
		   
            If IsArray($box3) Then
                MouseClick("left",1200,300)
            EndIf
        EndIf
    EndIf
WEnd
Func end()
    Exit
EndFunc
Wahrscheinlich versteh ich das ganze nicht richtig.
Habe auch schon versucht umzucoden und alles mögliche versucht aber ohne Erfolg.
:eek::eek::eek:
so könnte das ganze mit der iterativen variante mit deinem code aussehen:

Code:
HotKeySet("{ESC}","end")
Dim $box[3], $coors[UBound($box)][2] = [[1260,100],[1230,200],[1200,300]]
While 1
	$box[0] = PixelSearch(360, 90, 1000, 620, 0x80FF00)
	$box[1] = PixelSearch(390, 120, 810, 530, 0x80FF00)
	$box[2] = PixelSearch(430, 300, 600, 430, 0x80FF00)
	
	For $i=0 To UBound($coors)-1
		If IsArray($box[$i]) Then
			MouseClick("left",$coors[$i][0],$coors[$i][1])
		Else
			ExitLoop
		EndIf
	Next
WEnd
Func end()
    Exit
EndFunc