Bildsuche in Vollbildanwendung

  • Hallo AutoIt Gemeinde,

    um mein Problem besser zu verstehen und um Missverständnissen vorzubeugen bzgl. irgendwelchen Game-Bots, hole ich an dieser Stelle etwas aus:

    ich bin gerade dabei, mir einen Virtuellen Flipper zu bauen. Kann man sich vorstellen wie einen echten Flipper, nur mit LCD Monitoren :)
    Aktuell bin ich in der Phase, die Software dafür dementsprechend zum laufen zu kriegen, was auch soweit funktioniert.
    Das kann man sich wie folgt vorstellen:
    Als Frontend benutzte ich ein Programm Namens PinballX. Hier kann ich mit den Flippertasten Links und Rechts die Tische wählen und mit dem Button Start einen Tisch auswählen.
    Unter anderem soll hier das Spiel Pinball FX2 angebunden werden. Zwischen "Flipper TIsch wählen" und "Flipper Tisch wird angezeigt" soll alles automatisiert ablaufen.
    Aktuell habe ich dies bei Pinball FX2 (gibts übrigens mit einem Tisch kostenlos bei Steam) wie folgt gelösst:
    Mein Script erkennt, welcher Tisch gewählt wurde und lädt die dazu passende Steuerdatei. In dieser Datei stehen einfache Tastaturkommandos und SLeep Befehle, die wiederum im Script in einer Schleife verarbeidet werden.
    Im Ablauf bedeutet dies:
    Das Script wird durch wählen des TIsches gestartet mit dem Parameter, welcher Tisch gewählt wurde
    Daraufhin weiß das Script, welche Steuerdatei es benutzen soll
    Das Spiel Pinball FX2 wird geladen
    Mit Processexists prüfe ich, ob das Spiel geladen ist
    Wenn der Process läuft, wird die Steuerdatei ausgeführt
    In der Regel kommt zuerst ein sleep 15000 da gewartet werden muss, bis die ganzen Herstellerlogos verschwinden. Am Ende kommt dann folgendes Menü:
    [Blockierte Grafik: http://s7.directupload.net/images/140821/wyau4gjf.png]
    Hier sieht man nun die Tische.
    Mit Befehlen wie "drücke 3 mal Pfeil runter, 3mal Pfeil rechts, 2xEnter" wird dann ein Tisch gestartet und es kann gespielt werden.
    Das funktioniert auch soweit sehr gut.
    Nun folgendes Problem: Wird ein Tisch gekauft bzw. kommt ein neuer dazu kann es passieren, dass sich dieser Tisch (also das Symbol) zwischen andere rein mogelt. Dementsprechend ändert sich bei einer Anzahl X Tischen der "Tastaturweg" und diese müssen dann wieder angepasst werden. Dies würde ich gerne umgehen.
    Idee hier ist, ein Bild von jedem Tisch zu machen (Der Hintergrund muss natürlich entfernt werden), nach der Bildposition suchen zu lassen und darauf zu klicken. So würde es keine Rolle spielen, wo sich das Tisch Symbol befindet.
    Ich habe schon etwas mit ImageSearch herum gespielt, jedoch bekomme ich einfach nicht das Pinball FX2 Fenster abgegriffen.

    Und bevor die Anmerkung kommt -ich kenne die Foren Regeln:

    Zitat

    Folgende Inhalte sind absolut nicht erwünscht
    Programme, die einem Spieler bei jeglicher Art von Computerspiel (auch Einzelspieler) einen Vorteil verschaffen ("Bots")


    Ich möchte mir keinen Vorteil verschaffen, nur eine sauber Lösung für mein Flipper Cabinet bauen, nicht mehr und nicht weniger.

    Ich hoffe Ihr könnt mir weiterhelfen und freue mich auf euren Input.

    kind regards
    LordKingPin

  • Gibt es gut erkennbare unterschiede zwischen den tischen? zb auf einer einer bestimmten y-Koordinate auf verschiedenen x-Positionen. Dann geht das ja mit PixelGetColor()... Ich glaube das ist noch eine einigermaßen plausible lösung:D

  • Das Problem ist hier der DX (DirectX Layer) vom Spiel. Kann auch ein oGL Layer sein aber das tut jetzt nichts zur Sache. Der DX Layer rendert über der Desktopebene, aus dem Grund kann man auch bei den meisten Spiel mit der Taste Prnt-Scrn (Druck / S-Abf) keinen Screenshot machen, sondern kriegt nur ein schwarzes Bild.
    Das schwarze Bild ist der Desktop Layer, dieser wird schwarz gerendert.

    Um ImageSearch / PixelSearch anwenden zu können brauchst du entweder Borderless Fullscreen (Fenster-Vollbild) oder du spielst im Fenstermodus.

  • Ich habe schon etwas mit ImageSearch herum gespielt, jedoch bekomme ich einfach nicht das Pinball FX2 Fenster abgegriffen.

    Ist bei allen Spielen (genauer gesagt bei allen DirectX/OpenGL-Anwendungen) so, und nicht ohne Grund ;). Der DirectX- bzw. OpenGL-Layer kann nicht so einfach abgegriffen werden, da musst du den Layer schon hooken.

    (Soviel von mir.)

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski