AWT Robot Klasse Screenshot nach Pixelmustern in bestimmten Radius um Bildschirmmittelpunkt absuchen

FawKes100

Aktives Mitglied
Moin!
Habe in letzter Zeit ein wenig wieder in Java gearbeitet und wollte um es ein wenig weiter auszubauen gerne einen "kleinen Bot" schreiben. Will ich nicht zum cheaten oder so schreiben, sondern zum Üben vom Programmieren! 🙂 Der Bot soll sich auf einer Seite einloggen (funktioniert) dann auf "Spielen" klicken (funktioniert) und aus dem Hafen fahren (es handelt sich um das Spiel Piratestorm) und das aus dem Hafen fahren funktioniert ebenfalls schon. Doch nun fangen die Probleme an... Um die Karte nach Npcs abzusuchen muss der Bildschirminhalt irgendwie analysiert werden. Dazu mache ich erstmal einen Screenshot, doch ich habe nicht so wirklich eine Idee, wie ich auf diesem Screenshot so wirklich nach einem bestimmten Pixelmuster suchen soll. Ich könnte mir vorstellen, dass das mit einem Array funktioniert, doch eine wirkliche Idee, wie man es umsetzen könnte habe ich noch nicht. Hier übrigens den Code, den ich schon geschrieben habe:
Java:
//package robot;
/*
* RobotDemo.java
*/
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import java.io.*;

import javax.imageio.ImageIO;
import javax.swing.*;
public class RobotDemo{
    public static void main(String[] args) throws IOException, AWTException{
        final Robot robot = new Robot();
       
       
        robot.mouseMove(450, 1080);
        robot.mousePress(InputEvent.BUTTON1_MASK);
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        robot.delay(10000);
        robot.mouseMove(550, 80);
        robot.mousePress(InputEvent.BUTTON1_MASK);
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        robot.delay(10000);
        robot.mouseMove(850, 550);
        robot.mousePress(InputEvent.BUTTON1_MASK);
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        robot.delay(30000);
        robot.mouseMove(650, 650);
        robot.mousePress(InputEvent.BUTTON1_MASK);
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        robot.delay(100);
        robot.mouseMove(1480, 807);
        robot.mousePress(InputEvent.BUTTON1_MASK);
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        robot.delay(100);
        for (int i=1; i<=2; i++)
        {
             BufferedImage image = robot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
             Color pixelColor = new Robot().getPixelColor( i*100, i*50 );
             new Thread(new Runnable(){
                 public void run() {

                 }
Hoffe ihr könnt mir mit dem wahrscheinlich simplen Problem helfen...
             }).start();
             JOptionPane.showMessageDialog(null, "Roboter ist fertig");
        }

       
        new Thread(new Runnable(){
            public void run() {

            }
        }).start();
        JOptionPane.showMessageDialog(null,"Robot Demo ist fertig.");
    }
}
 
Hi, danke für die schnelle Antwort erstmal. Zu dem Link, den du geschickt hast der führt zu einem Fehler, das gesuchte Thema konnte nicht gefunden werden. Meine Frage bezieht sich darauf, wie ich ein BufferedImage nach Pixelmustern, die ich vorher als "Beispielbilder" einlese durchsuchen kann.
 
Hey,
mit der methode:
Java:
image.getRGB(x, y);
kannst du dir den rgb Wert von einem bestimmten Pixel an der Stelle (x,y) auslesen.
Ich kenn das Spiel nicht und weiß daher nicht was du suchst, aber damit könntest du dir die Farben holen...
Wie wärs wenn du mal den Screenshot hochlädst 🙂
 
Das habe ich ja auch schon mit robot.getRGB(x,y) gemacht nur es müssen ja mehrere Pixel sich vom Hintergrund beispielsweise abheben... Aber hier mal der Screenshot: Farming.png
Es müssen diese Schiffe darauf gesucht und bestmöglichst erkannt werden. Anschließend muss das Schiff in der Mitte durch einen Mausklick dahin fahren und dann muss die leertaste gedrückt werden, damit das Ziel angegriffen wird. Die Frage ist also nicht nur, wie das Bufferedimage durchsucht werden kann (möglichst effizient um nicht Pixel für pixel durchzugehen, sondern größere Pixelgruppen gleichzeitig, sondern auch wie man dann die Koordinaten an die Maus weitergibt, damit die zu dem Schiff fährt...
 
Oh... es könnte sein, dass ich das ausversehen zweimal erstellt habe weil der letzte Satz sich irgendwie in die Mitte von dem Codetext verschoben hat und ich es dann nochmal bearbeitet hatte... naja egal...
 
Du solltest du einen groben Farabschnitt der Schiffe, Monster, (oder was auch immer du Brauchst) also z.B. rgb wert von 0 zu 20 für ein Schiff oder so 😀 und dann immer jeden 10ten Pixel oder so abfragen, ob er in eins der Farb-Muster passt. Wenn ja soltest du noch sicherheishalber einen kleinen Bereich um ihn absuchen und wenn die auch stimmen, dann kannst hast du dein Objekt 😀

Dann merkst du dir einfach den ersten Pixel und bewegst die Maus wie gewohnt mit dem Robot dahin.
Wenn das noch nicht ganz stimmt, kannst du zu den x und y Werten ja solange was draufrechnen / abziehen bis das richtig kalibriert ist 😀 (Also ausprobieren)
 
Ich habe nochmal kurz eine Frage zu dem Abfagen: Gibt es nicht die Möglichkeit dass man bei der bedingung sagt, wenn die Farbwerte nicht denen des ozeans und auch nicht denen der Insel entsprechen, dass dann der Angriff ausgeführt wird? Achso und ne kleine Frage noch zu der Bedingung der farben: Wie frage ich die ab? Ich kann ja Pixel für Pixel durchgehen, dass ist mir klar, doch wie kann ich dann nachfragen ob die so sind, also wie kann ich die werte dann im Programm abgleichen? Ich weiß wie ich sie abfrage, weiß aber nicht wie das Programm dann entscheidet, ob es der richtige Farbwert ist oder der falsche...
 
Tja, da musst du dir die werte selber aus den screenshots holen (vilt mit Paint, gimp, etc.)😀 Ich würd die bereiche dann in ein Enum packen und eben entsprechend dem was sie darstellen sollen benennen 😀

Die Pixel kannst du ja durchgehen, wie ichs dir gesagt hab, also erstmal immer alle 5 oder so 😀 die objekte werden ja warscheinlich größer sein als 5 Pixel 😀

Und wie du die Pixel dann aus dem Bild abfragst, hab ich dir oben gezeigt 😉
 
Hi, hab mal wieder ein paar Fragen:
Was ist ein Enum?
Und zu dem was ich schon im letzten post wissen wollte: Ich weiß wie der Befehl aussieht um die Farbe abzufragen, dass ist nicht das problem 😀
Mein Problem ist, dass ich nicht weiß, wie ich abfrage, ob der Farbcodex an pixel x y die vorgegebenen werte hat.
Code:
if (image.getRGB(x,y) {}
Ich muss da ja noch die farbwerte mit angeben, die da sein sollen. Hoffe es ist jetzt verständlicher 😀
 
Hey, danke sehr für den Link 🙂
Also so wie ich das jetzt verstanden habe: Ich lade die daten von Screenshots in das Programm, und frage dann die Farbwerte von den einzelnen "Zielen" ab. Das würde ich hinkriegen. Doch nun zu dem Enum: Wie kann ich die daten übermitteln, oder kann ich einfach die Befehle, um an die Farbwerte zukommen in das Enum schreiben? Oder falls ich die daten nicht automatisch übergeben lassen kann, sondern die Farbwerte manuel eingeben muss, wie schreibe ich dass dann in das Enum?
Noch ne weitere Frage: Sollte ich zum abfragen der Farbwerte vom Bildschirm mit einzelnen pixeln oder mit einem Array von Pixeln machen?
 

Neue Themen


Zurück
Oben