Hallo,
ich verzweifle gerade Etwas sehr:
Ich will mir für ein Kochminispiel in einem Flashgame ein kleine Programm bauen, das das für mich erledigt.
Nur will es einfahc nicht so recht das tun, was ich von ihm will bzw. nicht gut genug.
Aktuell habe ich diesen Code:
So ungefähr soll das aussehen was das Programm machen soll (ich habe hier von Hand gespielt und mit Absicht Alles recht langsam gemacht):
easyupload.io
Also der Reihe nach:
oben 4 mal klicken um zur Seite mit der "Slime Soup zu blättern".
Um nun eine Slime Soup zu kochen:
###
auf das Bild der Slime Soup klicken,
unten auf cook klicken um den Kochvorgang zu starten (bis hierher funktioniert es noch Prima!)
wiederhole 3 mal:
Dann warten bis der Pfeil im roten ist und auf cook klicken.
bzw. besser schon klicken während er gerade ins Rote reingeht.
Nun kommt noch ein Dialogfeld das sagt wie gut die Suppe geworden ist.
Das wegklicken.
###
Alles klappt soweit, nur das abpassen wann der pfeil in die nähe vom roten kommt und dann rechtzeitig klicken, das ist eine katastrophe und klappt gar nicht.
meist wartet er erst bis der pfeil ein paar mal links rechts hin und her ist um dann zu klicken wenn der pfeil irgendwo ausserhalb ist, man würde annehmen dass er völlig random klickt.
Ich verstehe meinen Fehler nicht wirklich.
Eingangs bestimme ich erstmal wo der Bereich ist wo mittig rot+drum orange ist, der ganze bereich.
ich weiß dass er die praktisch pixelgenau bestimmt, diese grenzen für x.
fürs eigentliche pfeilabpassen will ich eigentlich eine art shcrankensystem benutzen.
weil ichs gemessen habe, weiß ich dass der querschnitt des pfeils in der prüfhöhe genau 14 pixel breit ist.
drum habe ich sinnbildlich shcranken platziert, eine direkt in der mitte vom roten, 2 schranken +-16 entfernt und 2 schranken +-2*16=32 pixel entfernt.
sodass der Pfeil nie 2 Shranken gleichzeitig berühren kann.
dann betrachte ich 2 fälle:
berührt der pfeil irgendwie die schranke bei mitte-16, dann warte ich bis er sich weiterbewegt hat und entweder die mitte-32 oder die mitte shcranke berührt.
hat er die mitteshcranke berührt weiß ich dass er sich von links nahc rechts bewegt und klicke sofort.
im anderen fall bewegt er sich gerade von der mitte nahc links und dieser prüffall wird verworfen.
genau prüfe ich auch rechts:
erst warten bis mitte+16 berührt wird.
dann wieder warten.
wird zuerst mitte berührt, dann kommt der pfeil von rechts richtung mitte und wir klicken.
wird zuerst mitte+32 berührt, dann geht der pfeil von der mitte weg nach rechts und wir verwerfen die prüfung.
und so wird halt so lange geprüft bis einer der "guten" fälle eintrifft, dann wird sofort geklickt und mit einigen Änderungen bei bool variabeln alle möglichen shcleifen beendet und gebreakt.
So sollte es in der realität laufen, faktisch tut das programm irgendwie was es will, zumindest was das klicken im passendne moment angeht :-/
Kan sich jemand vielleicht vorstellen woran das liegen könnte?
Scheinbar mache ich da ja irgendwas grundlegend verkehrt und weiß nicht wirklich was :-/
PS: die Farberkennung ist recht simpel, da wirklich jeder der Farbtöne auf dem Band, vom mittigen rot bis zum ganz gelben aussen, immer rot ca 255, blau ca. 0 hat.
und der pfeil hat blua werte wesentlich größer als null, also sehr gut unterscheidbar auftrund des blauwerts.
ich verzweifle gerade Etwas sehr:
Ich will mir für ein Kochminispiel in einem Flashgame ein kleine Programm bauen, das das für mich erledigt.
Nur will es einfahc nicht so recht das tun, was ich von ihm will bzw. nicht gut genug.
Aktuell habe ich diesen Code:
Java:
package a;
import java.awt.Color;
import java.awt.Robot;
import java.awt.event.InputEvent;
public class PotRoom {
Robot bot;
public PotRoom(Robot bot) {
this.bot = bot;
try {
// switch to slime soup recipe's site
for (int i = 0; i < 4; i++) {
// 4 mal
click(1020, 290);
Thread.sleep(500);
}
// cooking slime soups
for (int i = 0; i < 1; i++) {
// choose slime soup
click(880, 234);
Thread.sleep(500);
// start cooking process
click(766, 758);
Thread.sleep(100);
for (int j = 0; j < 3; j++) {
// clicks the cook button at the perfect time
findAndHitWhenInMiddle();
System.out.println("hit arrow in middle!");
Thread.sleep(100);
}
System.out.println("Done cooking for this round!");
// click ok button
click(760, 428);
Thread.sleep(500);
}
Thread.sleep(500);
// leave potRoom
click(758, 74);
Thread.sleep(500);
} catch (Exception e) {
}
}
public void findAndHitWhenInMiddle() {
try {
int borderleft = 691;
int borderright = 846;
int xorangeleft = 0;
int xorangeright = 0;
// find orange left and right border
for (int i = borderleft; i <= borderright; i++) {
//Pixel is Orange?
if ((xorangeleft == 0) && (isOrange(i, 704))) {
xorangeleft = i;
} else if ((xorangeleft != 0) && (xorangeright == 0) && (!(isOrange(i, 704)))) {
xorangeright = i;
}
}
int xmiddle = (int) ((xorangeleft + xorangeright) / 2);
boolean done = false;
while (!(done)) {
int direction = 0;
// left site
if (isObject(xmiddle - 16, 693)) {
System.out.println("Touching xmiddle-16!");
boolean waiting = true;
while (waiting) {
if (isObject(xmiddle, 693)) {
System.out.println("Touching xmiddle!");
direction = 1;
// click cook button
click(766, 758);
Thread.sleep(500);
done = true;
}
if (isObject(xmiddle - 2 * 16, 693)) {
System.out.println("Touching xmiddle-2*16!");
direction = -1;
}
if (direction != 0) {
waiting = false;
}
bot.delay(5);
}
}
if (done) {
break;
}
// right side
if (isObject(xmiddle + 16, 693)) {
System.out.println("Touching xmiddle+16!");
boolean waiting = true;
while (waiting) {
if (isObject(xmiddle, 693)) {
System.out.println("Touching xmiddle!");
direction = 1;
// click cook button
click(766, 758);
Thread.sleep(500);
done = true;
}
if (isObject(xmiddle + 2 * 16, 693)) {
System.out.println("Touching xmiddle+2*16!");
direction = -1;
}
if (direction != 0) {
waiting = false;
}
bot.delay(5);
}
}
Thread.sleep(10);
}
} catch (Exception e) {
}
}
// pfeil ist 14 pixel breit in der Höhe y=693
public boolean isObject(int x, int y) {
return ((bot.getPixelColor(x, y).getBlue()) > 4);
}
public void click(int x, int y) {
bot.mouseMove(x, y); // ggbfls. mit custom funktion ersetzen
bot.delay(100);
bot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
bot.delay(100);
bot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
}
}
So ungefähr soll das aussehen was das Programm machen soll (ich habe hier von Hand gespielt und mit Absicht Alles recht langsam gemacht):

Easyupload.io - Upload Files and Share Them Easily
Uplaod files easily and share them with your friends and colleagues. File upload solution for everyone. Upload big files and get a link to share effortlesly.

Also der Reihe nach:
oben 4 mal klicken um zur Seite mit der "Slime Soup zu blättern".
Um nun eine Slime Soup zu kochen:
###
auf das Bild der Slime Soup klicken,
unten auf cook klicken um den Kochvorgang zu starten (bis hierher funktioniert es noch Prima!)
wiederhole 3 mal:
Dann warten bis der Pfeil im roten ist und auf cook klicken.
bzw. besser schon klicken während er gerade ins Rote reingeht.
Nun kommt noch ein Dialogfeld das sagt wie gut die Suppe geworden ist.
Das wegklicken.
###
Alles klappt soweit, nur das abpassen wann der pfeil in die nähe vom roten kommt und dann rechtzeitig klicken, das ist eine katastrophe und klappt gar nicht.
meist wartet er erst bis der pfeil ein paar mal links rechts hin und her ist um dann zu klicken wenn der pfeil irgendwo ausserhalb ist, man würde annehmen dass er völlig random klickt.
Ich verstehe meinen Fehler nicht wirklich.
Eingangs bestimme ich erstmal wo der Bereich ist wo mittig rot+drum orange ist, der ganze bereich.
ich weiß dass er die praktisch pixelgenau bestimmt, diese grenzen für x.
fürs eigentliche pfeilabpassen will ich eigentlich eine art shcrankensystem benutzen.
weil ichs gemessen habe, weiß ich dass der querschnitt des pfeils in der prüfhöhe genau 14 pixel breit ist.
drum habe ich sinnbildlich shcranken platziert, eine direkt in der mitte vom roten, 2 schranken +-16 entfernt und 2 schranken +-2*16=32 pixel entfernt.
sodass der Pfeil nie 2 Shranken gleichzeitig berühren kann.
dann betrachte ich 2 fälle:
berührt der pfeil irgendwie die schranke bei mitte-16, dann warte ich bis er sich weiterbewegt hat und entweder die mitte-32 oder die mitte shcranke berührt.
hat er die mitteshcranke berührt weiß ich dass er sich von links nahc rechts bewegt und klicke sofort.
im anderen fall bewegt er sich gerade von der mitte nahc links und dieser prüffall wird verworfen.
genau prüfe ich auch rechts:
erst warten bis mitte+16 berührt wird.
dann wieder warten.
wird zuerst mitte berührt, dann kommt der pfeil von rechts richtung mitte und wir klicken.
wird zuerst mitte+32 berührt, dann geht der pfeil von der mitte weg nach rechts und wir verwerfen die prüfung.
und so wird halt so lange geprüft bis einer der "guten" fälle eintrifft, dann wird sofort geklickt und mit einigen Änderungen bei bool variabeln alle möglichen shcleifen beendet und gebreakt.
So sollte es in der realität laufen, faktisch tut das programm irgendwie was es will, zumindest was das klicken im passendne moment angeht :-/
Kan sich jemand vielleicht vorstellen woran das liegen könnte?
Scheinbar mache ich da ja irgendwas grundlegend verkehrt und weiß nicht wirklich was :-/
PS: die Farberkennung ist recht simpel, da wirklich jeder der Farbtöne auf dem Band, vom mittigen rot bis zum ganz gelben aussen, immer rot ca 255, blau ca. 0 hat.
und der pfeil hat blua werte wesentlich größer als null, also sehr gut unterscheidbar auftrund des blauwerts.