[JAVA] Die Robot Class

10/24/2009 15:29 Obilee#1
Ihr möchtet einen Bot in Java Programmieren aber wisst nicht womit ihr Anfangen sollt ? Dann seid ihr hier genau richtig !
Hier will ich euch die Robot Class von Java näher bringen, denn mit ihr kann man eniges Anfangen was man auch für Bots nutzen kann wie die Attacken durch Tastendrücken ausführen, Pixel auslesen um z.b den HP Status dadurch zu erkennen usw.

1. Was ist die Robot Class und was kann sie ?
2. Aller Anfang ist leicht
2.1 Die Robot Class einbinden
2.2 Ein Robot Objekt erstellen
3. Pixel Auswertung und Bearbeitung
4. Übernimmt die Kontrolle !

4.1 Die Maus
4.2 Die Tastatur
4.3 Delay

5. Anmerkung

1. Was ist die Robot Class und was kann sie ?

Die Robot Class stammt von der AWT Class von Java ab, ihre eigenschaft ist es das sie die Kontrolle über die Maus und Tastatur übernehmen kann und man somit einiges Anstellen kann. Außerdem kann sie auch dazu dienen den Bildschirm nach Pixel abzusuchen und zu bestimmen.

Die Robot Class besitzt dazu enige Methoden welche man gut in dieser Grafik sehen kann:
[Only registered and activated users can see links. Click Here To Register...]

Was die Methoden genau machen werd ich gleich erklären.

2. Aller Anfang ist leicht
2.1 Die Robot Class einbinden

Um die Robot Class überhaupt nutzen zu können muss man die KLasse ersteinmal in unser Programm einbinden, dies geschiet unter Java mit dem "import" Befehl.
Da die Robot Class zu "AWT" gehört schreiben wir:

Code:
 import java.awt.Robot;
Somit ist unser Robot importiert und wir können zum nächsten Schritt weiter gehen.

2.2 EIn Robot Objekt erstellen

Um die Methoden der Robot Klasse nutzen zu können muss man vorher ein Objekt erstellen, dieses Objekt ist die Schnittstelle für unsere Werte die wir übergeben wollen und den Methoden der Klasse.

Dafür schreiben wir:

Code:
 Robot Robo = new Robot();
Das erste Robot sagt aus welcher Klasse unser neues Objekt gehören soll, das Robo ist unser Objekt Name, ihr könnt euer Objekt nennen wie ihr wollt ! Das new Robot(); ruft den Konstruktor der Klasse Robot auf und übergibt die Standart Parameter unserem Objekt Robo. Und schon haben wir es geschafft, unser erstes Robot Objekt wurde erstellt.

3. Pixel Auswertung und Bearbeitung
Da Bots öfters mal die Pixel aus dem Bildschirm Auslesen müssen sind unsere Robot Methoden perfekt dafür geeignet.
Dafür verwenden wir folgende Methode:

Code:
 Robo.getPixelColor(x, y);
Das Robo steht für unser Objekt, durch den Punkt können wir danach die Methoden auswählen und nutzen die die Klasse uns zur verfügung stellt, nach dem Punkt kommt immer der Name der Methode. Nach dem Namen gibt es immer ein ( ), um Werte an die Methode zu übergeben. In unserem Fall müssen wir Koordinaten von unserem Bildschirm der Methode übergeben. Diese gibt danach die Pixel Farben von der Koordinate wieder.

Doch um diese Farben speichern zu können brauchen wir noch eine Variable welche auch unsere Daten speichern kann. Dies geht nur durch ein Objekt der Klasse Color. Wie bei Robot müssen wir zuerst die Klasse importieren:

Code:
 import java.awt.Color;
Danach erstellen wir wieder ein Objekt dafür:

Code:
 Color Pixel = new Color(0,0,0);
Somit haben wir ein Objekt mit dem Namen Pixel welche Farbwerte speichern kann, die (0,0,0) sind Werte die man dem Kontstruktor am Anfang übergibt. Wenn man das Objekt jetzt Ausgeben würde, würde man java.awt.Color[r=0,g=0,b=0] sehen. Wobei die Nullen für Rot, Blau, Grün stehen.

So jetzt wieder zum Eigentlichen Thema dem Pixel auslesen.

Damit unsere getPixelColor Methode weiß von wo sie Überhaupt die Pixel auslesen soll müssen wir ihr Koordinaten übergeben, dies machen wir durch den x und y wert. Wir können entwerder Direkt Werte in die Klammern setzen, oder wir werden Variablen dafür.

Hier zwei Beispiele:
Code:
 Pixel = Robo.getPixelColor(100, 100);
Hier übergibt er unserem Pixel Objekt die drei Farbwerte von der Position (100,100)
Code:
 int x = 150, y = 200;
 Pixel = Robo.getPixelColor(x, y);
In dem zweiten Beispiel deklarieren wir die zwei Variablen x und y mit zwei Startwerten. Somit werden die Pixel Werte von der Position 150,200 ausgelesen und unserem Pixel Objekt übergeben.

Doch was kann man damit jetzt Anstellen ?
Man kann damit auf bestimmte Sachen reagieren wie zum Beispiel wir Wissen das falls an einer Stelle die Farbe Rot auftaucht er das Programm beenden soll.

Code:
 Color Rot = new Color(100,0,0);
 Color Pixel = new Pixel(0,0,0);

 Pixel = Robo.getPixelColor(100, 100);
 if(Rot.equals(Pixel))
     System.exit();
Eine kurze Erklärung: Wir erstellten diesmal 2 Objekte von der Klasse Color, die erste dient dazu um zu Wissen was für Werte unsere Farbe "Rot" haben soll, und das zweite dient dazu um unsere Werte die wir Testen iwo Speichern zu können. Danach Speichern wir die Pixel Werte von der Position 100,100 und gucken durch die IF-Verzweigung ob unser Rot die gleichen Werte hat wie unsere Pixel. Falls ja beendet er das Programm mit System.exit();

4. Übernimmt die Kontrolle !
4.1 Die Maus

Wie schon gesagt können wir auch die Kontrolle der Maus übernehmen um z.b bestimmte Knöpfe drücken zu lassen. Dafür nutzen wir die Methoden:
Code:
 Robo.mouseMove(x, y);
 Robo.mousePress(buttons);
 Robo.mouseRelease(buttons);
Wie in den Methoden zuvor nutzen wir wieder unser Robo Objekt welches für uns die Methoden aufruft, in der ersten Methode wird die Maus zur einer Bestimmten Position bewegt indem man in den Klammern wie bei der Pixel-Methode die Koordinaten übergibt. Die Zweite Methode drückt eine Maustaste die wir in der Klammer angeben, und die letzte Methode dient dazu die Taste auch loszulassen ! Denn wer will schon dass das Programm eine Taste für immer gedrückt hält ?

Um wieder was anschauliches zu haben ein kleines Beispiel:

Code:
 Robo.mouseMove(100,300);
Hier bewegt sich unsere Maus zur Position 100,300 und bleibt auch dort bis man die Maus wieder selber bewegt.
Code:
 int x = 200, y = 600;
 Robo.mouseMove(x,y);
Und wieder ein Beispiel wie mein Pixel auslesen, die Maus bewegt sich durch die Varaiblen zur Position 200,600.

Und jetzt Kombinieren wir das ganze mit unseren Maustasten gedrücke =) Vorher müsst ihr aber wieder mal was importieren um die Maustasten nutzen zu können:
Code:
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
Jetzt zum eingemachten;
Code:
Robo.mouseMove(100,300);
Robo.mousePress( InputEvent.BUTTON3_MASK ); 
Robo.mouseRelease(InputEvent.BUTTON3_MASK );
In der ersten Zeile Bewegen wir unsere Maus zur Position 100,300, danach wird in der zweiten Zeile unsere mousePress Methode ausgerufen und ihr unser InputEvent übergeben, also welche Taste gedrückt werden soll. In unserem Fall nehmen wir den BUTTON3, dies ist bei mir die Rechte Maustaste. Dies kann vll. bei euch anders sein kommt auf die Hardware drauf an. Zum schluss wird in der dritten Zeile unsere rechte Maustaste wieder losgelassen.

4.2 Die Tastatur

Das gleiche wie mit der Maus können wir auch mit der Tastatur anstellen, nur das wir hier auch mehrere Tasten gleichzeitig drücken lassen können um zum Beispiel ein Alt + F4 drücken zu lassen.
Für die Tastatur verwenden wir folgende Methoden:
Code:
 Robo.keyPress(keycode);
 Robo.keyRelease(keycode);
Die keyPress Methode ( wie der Name schon sagt ) drückt unsere Taste, dafür müssen wir in den Klammern den keycode der Taste der Methode übergeben, die zweite Methode dient wie schon bei der Maus dazu das die Taste eines Tages auch losgelassen wird.

Ein einfaches Beispiel:
Code:
Robo.keyPress(KeyEvent.VK_V);

Robo.keyRelease(KeyEvent.VK_V);
Es wird die Taste "V" ( nicht zu verwechseln mit v ) gedrückt und danach wieder losgelassen.
Dies kann man unendlich oft wiederholen lassen mit einer while schleife, oder einfach in dem man die Events hintereinander wiederholt:

Code:
 Robo.keyPress(KeyEvent.VK_H);
 Robo.keyRelease(KeyEvent.VK_H);
 Robo.keyPress(KeyEvent.VK_a);
 Robo.keyRelease(KeyEvent.VK_a);
 Robo.keyPress(KeyEvent.VK_l);
 Robo.keyRelease(KeyEvent.VK_l);
 Robo.keyPress(KeyEvent.VK_l);
 Robo.keyRelease(KeyEvent.VK_l);
 Robo.keyPress(KeyEvent.VK_o);
 Robo.keyRelease(KeyEvent.VK_o);
Somit lassen wir das Wort "Hallo" schreiben. Doch um Tastenkombinationen auszuführen müssen wir ein kleines wenig anders vorgehen:
Code:
 Robo.keyPress(KeyEvent.VK_ALT);
 Robo.keyPress(KeyEvent.VK_F4);


 Robo.keyRelease(KeyEvent.VK_ALT);
 Robo.keyRelease(KeyEvent.VK_F4);
Auf den ersten Blick kaum ein unterschied zu sehen, doch wenn man genauer schaut sieht man das zuerst die zwei Tasten gedrückt werden, und danach erst die Tasten losgelassen, und nicht wie vorher "Drücken -> Loslassen". Somit wird zurerst die ALT Taste gedrückt und danach die F4 Taste und erst danach werden beide Losgelassen, und somit haben wir unsere Tastenkombination ausgeführt. Somit ist es auch möglich Sachen aus dem zwichenspeicher einzufügen usw.

4.3 Delay

Da wir bis jetzt die Tasten, die Maus und die Pixelabfragen immer gleich beendet haben, haben wir meistens nicht viel davon.
Das beste Beispiel dafür ist falls wir wollen das sich unsere Spielfigur bewegen soll, falls wir
Code:
Robo.keyPress(KeyEvent.VK_w);

Robo.keyRelease(KeyEvent.VK_w);
benutzen wird sich die Figur nicht ein cm Bewegen weil der Tastendruck so kurz ist dass das Spiel es gar nicht merkt. Was soll man aber dagegen tun ? Eine Lösung ist es einfach die Taste gedrückt zu halten anstatt sie gleich wieder Loszulassen.

Dafür gibt es die Delay Methode:

Code:
Robo.delay(ms);
Durch diese Methode wartet das Programm eine Bestimmte Zeit ab bevor es in die nächste Programmier Zeile geht um diese Auszuführen. Wie man schon sieht gibt man diese Zeitangebe in MS ein. 1000 MS = 1 Sekunde !
Code:
Robo.keyPress(KeyEvent.VK_w);
Robo.delay(2000);

Robo.keyRelease(KeyEvent.VK_w);
In der ersten Zeile wird die Taste w gedrückt, und da wir ein delay eingebaut haben wird diese Taste auch zwei Sekunden gehalten da er Befehl zum Tastenloslassen erst nach dem delay ausgeführt wird.

Dies kann man an sich für alles Verwenden.

5. Anmerkung

Ich habe hier nicht alle Methoden gezeigt weil man diese für den Anfang gar nicht braucht, doch die wichtigsten Sachen sind dabei um anzufangen mit der Klasse rumzuspielen, doch dies sind nur die Grundlagen um damit ein Bot schreiben zu können muss man noch viele andere Dinge einsetzen wie Keyevents usw.

Ihr solltet beim Ausprobieren darauf Aufpassen was ihr Codet! Falls ihr auf die Idee kommt sowas wie zu schreiben:
Code:
do
{
Robo.keyPress(KeyEvent.VK_w);
Robo.keyRelease(KeyEvent.VK_w);
}
while(true);
könnt ihr euren PC schonmal neu Starten da ihr danach gar nichts mehr auf dem Rechner machen könnt da die KOntrolle über die Tastatur ganze Zeit eurem Programm dann gehört :P



Viel spaß !

mfg

obi
10/24/2009 15:49 Rikkami#2
Heftig viel Mühe.

#thanked.
Obi for next Global and Admin
10/24/2009 16:32 wurstbrot123#3
Nützliche Klasse und soweit ich gelesen hab alles gut erklärt.

PS:
Hast einmal ein / vergessen, solltest du
eventuell noch editieren aber ansonsten
top Tutorial und wird bestimmt einigen helfen :)

Quote:
[code]
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
[CODE]
10/24/2009 16:40 Obilee#4
Quote:
Originally Posted by wurstbrot123 View Post
Nützliche Klasse und soweit ich gelesen hab alles gut erklärt.

PS:
Hast einmal ein / vergessen, solltest du
eventuell noch editieren aber ansonsten
top Tutorial und wird bestimmt einigen helfen :)
Danke =)
10/26/2009 16:04 Gianotti#5
nice tutorial obi ;)
11/09/2009 18:56 Dimension0x00#6
gut so... jetzt nur nochmal in c++ ;)
11/09/2009 20:05 Adroxxx#7
Quote:
Originally Posted by Primehawk View Post
gut so... jetzt nur nochmal in c++ ;)
[Only registered and activated users can see links. Click Here To Register...]
11/12/2009 12:56 Bellavista#8
Danke aber kannste vllt mal den komplett code reinstellen und net nur teile davon da ich zwar grundkentnisse hab aber noch relative neu auf dem gebiet bin.
11/13/2009 11:06 Obilee#9
Kann ich nacher mal machn
11/13/2009 15:37 mmcfly#10
ist natuerlich nur bedingt zu gebrauchen, da man mit
Code:
Robo.mouseMove(100,300);
mit einem einfach Resize der applikation untersch. ergebnisse erhaelt ;-)

die Roboter klasse fuer "intelligerente" Sachen zu verwenden ist dann schon mhm schwierig.

so kleine Sachen sind aber schon witzig (grad deine anderen sachen gesehen... gute idee... mal ueberlegen was noch so geht)
11/22/2009 01:11 Diabox#11
Wow, thanks for this! Makes botprogramming in java A LOT easier ;). Danke schon ;)
12/12/2009 00:05 Bobo-y#12
Richtig gut gemacht! Riesen Lob! Bestimmt viel Aufwand!

Thx auf jedenfall verdient!

Mfg Bobo-y
01/06/2010 19:26 nikluetke#13
Schön und gut. Angenohmen man möchte jetzt ein Programm entwickeln welche die Pixel an einer bestimmten Postion ausliest. Wie kann ich auslesen um welche Pixel es sich handeln?

//Ok man kann es mit Paint machen.
01/07/2010 01:08 -strYker#14
Wow , viel Arbeit , danke Obi.
01/07/2010 08:27 D00MR4ZR#15
Thanks on such a nice tutorial, yet too bad its on deutsch only, and I am having troubles understanding it.