Ignore:
Timestamp:
Apr 15, 2010, 9:52:08 PM (15 years ago)
Author:
Rick van der Zwet
Message:

Basic object detection working, next object workflow and action list based uppon that.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • java-automator/src/nl/rickvanderzwet/farmville/ScreenRecognition.java

    r111 r112  
    33 * License BSDLike http://rickvanderzwet.nl/LICENSE
    44 * XXX: Do not look at this code, it's dirty and _NOT_ the way Java should be written.
     5 * XXX: Dragging sucks needs to be be around
    56 */
    67
     
    1011import java.awt.event.*;
    1112import java.awt.image.BufferedImage;
     13import java.awt.image.IndexColorModel;
    1214import java.awt.image.RasterFormatException;
    1315
    14 import javax.swing.BorderFactory;
    15 import javax.swing.JButton;
    1616import javax.swing.JFrame;
    1717import javax.swing.JLabel;
     
    4040        static Point mouse;
    4141        static BufferedImage bi;
     42        static BufferedImage rawPattern;
     43        static BufferedImage pattern;
    4244        static Robot bot;
    4345
     
    4951        static Button redButton;
    5052        static Button greenButton;
    51 
    52         Point boxLeftTop, boxRightBottom = new Point (0,0);
     53        static Button sampleShotButton;
     54
     55
     56        static Point boxLeftTop = new Point (0,0);
     57        static Point boxRightBottom = new Point (0,0);
    5358        Boolean drawBox = false;
    5459        static Boolean draggingBox = false;
     
    102107                blueButton.setLabel("Stop clicking");
    103108                blueButton.addActionListener(this);
     109               
     110                sampleShotButton = new Button("sampleShot");
     111                sampleShotButton.setName("sampleShot");
     112                sampleShotButton.setLabel("Sample shot");
     113                sampleShotButton.addActionListener(this);
    104114                buttons.add(redButton);
    105115                buttons.add(blueButton);
    106116                buttons.add(greenButton);
     117                buttons.add(sampleShotButton);
    107118               
    108119
     
    111122
    112123                       
    113                 setSize(400,300);
     124                setSize(600,300);
    114125                addWindowListener(new WindowAdapter() {
    115126                        public void windowClosing(WindowEvent e){
     
    124135
    125136        public void actionPerformed(ActionEvent event) {
    126                 System.out.println("ActionPerformed");
    127137                Component c = (Component)event.getSource();
     138                System.out.println("ActionPerformed: " + c.getName());
    128139                if (c.getName() == "redButton") {
    129140                        if (freezeImage) {
     
    141152                                        }
    142153                                };
    143                                 Timer foo = new Timer(3000, freezeScreen);
     154                                Timer foo = new Timer(500, freezeScreen);
    144155                                foo.setRepeats(false);
    145156                                foo.start();
     
    153164                                ((Button) c).setLabel("Start clicking");       
    154165                        }
     166                } else if (c.getName() == "sampleShot") {
     167                        System.out.println("Point to use: " + boxLeftTop + boxRightBottom);
     168                       
     169                        /* Make sure we can select both ways */
     170                        Integer xStart = (boxLeftTop.x < boxRightBottom.x) ? boxLeftTop.x : boxRightBottom.x;
     171                        Integer yStart = (boxLeftTop.y < boxRightBottom.y) ? boxLeftTop.y : boxRightBottom.y;
     172                       
     173                        Integer xWidth = Math.abs(boxRightBottom.x - boxLeftTop.x);
     174                        Integer yWidth = Math.abs(boxRightBottom.y - boxLeftTop.y);
     175                        //pattern = bi.getSubimage(xStart - 20 , yStart - 50, xWidth, yWidth);
     176                        rawPattern = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_INT_RGB);             
     177                        bi.copyData(rawPattern.getRaster());
     178                        xStart -= 20;
     179                        yStart -= 50;
     180                        System.out.println("Values used: " + xStart + " ," + yStart + ", " + xWidth + "," +yWidth);
     181                        pattern = rawPattern.getSubimage(xStart , yStart, xWidth, yWidth);
    155182                }
    156183        }
    157 
     184       
    158185        public void paint(Graphics g) {
    159186                super.paint(g);
     
    166193               
    167194                g.drawImage(bi,20, 50, this);
     195                g.drawImage(pattern, 320, 50, this);
    168196
    169197                if (drawBox){
    170198                        g.setColor(Color.RED);
    171                         g.drawRect(boxLeftTop.x, boxLeftTop.y, Math.abs(boxRightBottom.x - boxLeftTop.x), Math.abs(boxRightBottom.y - boxLeftTop.y));
     199                       
     200                        /* Make sure we can select both ways */
     201                        Integer xStart = (boxLeftTop.x < boxRightBottom.x) ? boxLeftTop.x : boxRightBottom.x;
     202                        Integer yStart = (boxLeftTop.y < boxRightBottom.y) ? boxLeftTop.y : boxRightBottom.y;
     203                       
     204                        Integer xWidth = Math.abs(boxRightBottom.x - boxLeftTop.x);
     205                        Integer yWidth = Math.abs(boxRightBottom.y - boxLeftTop.y);
     206                        g.drawRect(xStart, yStart, xWidth, yWidth);
    172207                }
    173208               
    174209                greenButton.setEnabled(foundPlowLocation);
    175                
    176210                bi.createGraphics();
    177211               
     
    192226                                        System.out.println("Location mouse changed " + mouse + "(was: " + prevLocation + ")");
    193227                                        prevLocation = mouse;
     228                                       
     229                                        /* XXX: Make sure we do not cross the boundaries */
     230                                       
    194231                                        bi=bot.createScreenCapture(new Rectangle(mouse.x + mouseSurround,
    195232                                                        mouse.y + mouseSurround));
    196                                         bi = bi.getSubimage(mouse.x - mouseSurround,
    197                                                         mouse.y - mouseSurround,
    198                                                         mouseSurround * 2, mouseSurround * 2);
     233
     234                                        Integer xBase = ((mouse.x - mouseSurround) < 0) ? mouseSurround : (mouse.x - mouseSurround);
     235                                        Integer yBase = ((mouse.y - mouseSurround) < 0) ? mouseSurround : (mouse.y - mouseSurround);
     236                                        bi = bi.getSubimage(xBase, yBase, mouseSurround * 2, mouseSurround * 2);
    199237
    200238                                        /* See is enabled */
     
    242280                                        }
    243281
    244                                         /* Do basic pattern recognition */
     282                                        Boolean patternMatch = false;
     283                                        Point patLoc = new Point(0,0);
     284
     285                                        if (pattern != null) {
     286                                                /* Do basic pattern recognition
     287                                                 * XXX: Does not scale, does not support multiple objects
     288                                                 * XXX: Maybe colour will help us over here as well
     289                                                 */
     290                                                nextx: for (int x = 0; x < bi.getWidth() - pattern.getWidth(); x++) {
     291                                                        nexty: for (int y = 0; y < bi.getHeight() - pattern.getHeight(); y++) {
     292                                                                for (int i = 0; i < pattern.getWidth(); i++) {
     293                                                                        for (int j = 0; j < pattern.getHeight(); j++) {
     294                                                                                if (bi.getRGB(x + i, y + j) != pattern.getRGB(i, j)) {
     295                                                                                        //System.out.println("Fail at (" + x + "," + y + ") [" +
     296                                                                                        //              patLoc.x + "," + patLoc.y + "] " +
     297                                                                                        //              bi.getRGB(x + i, y + j) + "/" + pattern.getRGB(i, j));
     298                                                                                        continue nexty;
     299                                                                                }
     300                                                                        }
     301                                                                }
     302                                                                /* We are successful */
     303                                                                patternMatch = true;
     304                                                                break nextx;
     305                                                        }
     306                                                }
     307                                        }
    245308                                       
    246 
     309                                        if(patternMatch) {
     310                                                System.out.println("Match found at location: " + patLoc);
     311                                        }
     312                                       
    247313                                        if (pixelTreshold == 0) {
    248314                                                pressMouse();
Note: See TracChangeset for help on using the changeset viewer.