PDA

View Full Version : [java] Robot & getPixelColor


n0n4m3
11-07-2009, 18:47
allora, sto creando un programma che, da come si puo intuire dal titolo, faccia delle cose al posto mio :P

il problema è il seguente: ho bisogno che questo vada in una certa posizione dello schermo e mi prenda il colore del pixel, poi passi al pixel alla sua destra e faccia la stessa cosa. tutto funziona se fatto girare su eclipse o con una finestra/immagine davanti ad eclipse (mi da giustamente una serie di pixel bianchi e ogni tanto uno nero, dovuto alle scritte). il problema arriva quando voglio fargli fare questo aprendo una finestra, sulla quale poi deve fare cio' che gli dico. allora, ecco il codice:


public static void searchForMovement(Robot myRobot)
{

Color[] firstShot = new Color[215];
Color[] secondShot = new Color[215];

for(int i = 0; i < 214; i++)
{
myRobot.mouseMove((106 + i), 504);
firstShot[i] = myRobot.getPixelColor((106 + i), 504);
}

for(int i = 0; i < 214; i++)
{
System.out.println(firstShot[i].toString());
}

myRobot.delay(1500 + (int)(Math.random() * 1000));

for(int i = 0; i < 214; i++)
{
myRobot.mouseMove((106 + i), 504);
secondShot[i] = myRobot.getPixelColor((106 + i), 504);
}

}

l'output, che ottengo dal secondo for, aprendo la finestra desiderata (gioco) dopo aver fatto partire il programma è il seguente:

java.awt.Color[r=0,g=0,b=0]
java.awt.Color[r=0,g=0,b=0]
java.awt.Color[r=0,g=0,b=0]
java.awt.Color[r=0,g=0,b=0]
java.awt.Color[r=0,g=0,b=0]
java.awt.Color[r=0,g=0,b=0]
java.awt.Color[r=0,g=0,b=0]
java.awt.Color[r=0,g=0,b=0]
java.awt.Color[r=0,g=0,b=0]
java.awt.Color[r=0,g=0,b=0]
java.awt.Color[r=0,g=0,b=0]
java.awt.Color[r=0,g=0,b=0]
java.awt.Color[r=0,g=0,b=0]
java.awt.Color[r=0,g=0,b=0]

[...]

java.awt.Color[r=0,g=0,b=0]
java.awt.Color[r=0,g=0,b=0]

se ora voglio fargli fare la stessa cosa funziona sia se nn sovrappongo niente ad eclipse, sia se sovrappongo un'immagine/firefox/else. ecco il risultato:
java.awt.Color[r=221,g=224,b=231]
java.awt.Color[r=221,g=224,b=231]
java.awt.Color[r=221,g=224,b=231]
java.awt.Color[r=221,g=224,b=231]
java.awt.Color[r=221,g=224,b=231]
java.awt.Color[r=221,g=224,b=231]
java.awt.Color[r=221,g=224,b=231]

[...]

java.awt.Color[r=221,g=224,b=231]
java.awt.Color[r=221,g=224,b=231]

il problema è ke anche se ho messo (obsoletamente) il myRobot.MouseMove(x, y) nn vedo il mouse muoversi se ho il gioco aperto, mentre se è chiuso il mouse si sposta linearmente...qualche idea?

PS: ho provato a passare dal createScreenCapture per fare uno screenshot, ma poi ho solo il metodo getRGB per poter ottenere il colore che tuttavia per due pixel rossi ottengo un int differente -.- (forse l'int che ottengo da getRGB contiene informazioni anche a proposito della sua posizione)...qualche idea per poter ovviare a questo?

Darecon
11-07-2009, 19:00
Non vorrei dire una stupidata, ma non e' che il gioco prende "possesso" dei dispositivi di input (keyboard e mouse) con le directinput, e quindi non ti fa muovere il mouse? Quindi tu prendi il colore di un solo pixel?
Magari e' una stupidata pero'.. :mc:

n0n4m3
11-07-2009, 19:13
in effetti hai ragione...per poter interagire con il gioco servono sia mouse che tastiera...si puo comunque obbligarlo a muoverlo in un qualche modo?

provero' allora nel modo seguente:
public static void searchForMovement(Robot myRobot)
{

BufferedImage print1 = myRobot.createScreenCapture(new Rectangle(1400, 900));
myRobot.delay(1500 + (int)(Math.random() * 100));
BufferedImage print2 = myRobot.createScreenCapture(new Rectangle(1400, 900));

int[] pixelArrayPrint1 = new int[215];
int[] pixelArrayPrint2 = new int[215];


for(int i = 0; i < 214; i++)
{
pixelArrayPrint1[i] = print1.getRGB((106 + i), 504);
pixelArrayPrint2[i] = print2.getRGB((106 + i), 504);
}

}


cmq quello che in pratica deve fare è vedere se una certa barra si muove...questa barra è inizialmente blu per metà e rossa per l'altra...io devo far si che se si muove allora il programma mi deve premere un tasto, se invece è fermo deve premerne un'altro...quindi anche in questo modo avrei problemi con la tastiera?

Darecon
11-07-2009, 19:21
Credo tu abbia comunque problemi..

Non so come aiutarti pero'..