Denkblockade für mein Programmablauf

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Guten Abend,

als Stütze für mich habe ich folgende Notiz in meinen Algorithmus geschrieben (sprich Kommentar):
"""
1. Get settings
2. Get hwnd data
3. Take Screenshot (&cnvt color-space)
4. Set ROI
5. Create mask
6. Mix mask & screenshot
7. Match template
8. Get template coords
9. If templ found:
- calc position
- move crosshair while distance > 10
"""
Sprich, es holt sich zunächst Daten, bearbeitet sie für eine bessere Verarbeitung, sucht nach einem Template und berechnet davon die Koordinate. Anschließend soll es das Fadenkreuz auf das Ziel richten. Dabei wird ein Vektor erzeugt - von der Mitte des ROI's (entspricht Mitte des Fadenkreuzes) bis zum Ziel. Damit wird die Länge berechnet. Denn es soll das Fadenkreuz solange bewegen, bis die Vektorlänge weniger als 10px beträgt und somit das Fadenkreuz so ziemlich auf dem Ziel ist.

Doch, hier kommt für mich der Knackpunkt. Nachdem es immer wieder nicht richtig funktionierte - erst vermutet die Berechnungen sind falsch, dann, dass ein Modul das Problem sei, etc. - ist mir aufgefallen, dass mein Fehler nur bei 9.II liegen kann.

Damit mein Vorhaben allerdings realisierbar wird, dachte ich mir, dass 9.II seperat - also über einen Thread - verlaufen muss. Geht ja allerdings auch nicht, da 9.II von den vorherigen Schritten abhängig ist. Ich stecke hier also gedanklich fest...

Habt ihr Tipps/Ideen/Inweiße/etc. ,die mir bei meinem Problem weiterhelfen können?

Grüße,
xXSkyWalkerXx1
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das while ist falsch. Ohne den ganzen brass oben drüber weißt du doch gar nicht, wie groß die Distanz ist. Und “Fadenkreuz bewegen” ist recht allgemein. Wie bewegst du das denn? Wieso muss sich das annähern, warum kannst du nicht einfach direkt die gewünschte Bewegung durchführen?
Benutzeravatar
__blackjack__
User
Beiträge: 13182
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@__deets__: Annähern weil die anderen Mitspieler sonst sofort merken das da einer bescheisst‽ Natürlich nur eine Vermutung.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Dass das while ni ganz stimmig ist, ist mir bewusst, da der wichtige Parameter (die aktuelle,berechnete Zielposition) sich während des Ablaufs dieser While-Schleife nicht ändert. Das Fadenkreuz bewege ich mit der CronusMax API.
"Annähern" aus dem Grund, damit der Algorithmus weiß, wann er am Ziel ist - die Distanz sollte natürlich weniger als 10px sein, die 10 ist nur ein Bsp.

Also nein, nicht damit andere den Beschmuh nicht bemerken. ;D
Aber nette Idee! ^^
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Code: Alles auswählen

# Set button if distance crosshair->enemy (2D) is > 0.
if distance > 0:
	cronusmax.EnterApiMode()
	sleep(0.016)# sleep = time.sleep
	cronusmax.set_Rotation(enemyPosPolar['x'], enemyPosPolar['y'])# Set RX,RY of gamepad
	sleep(0.016)# Hier Problem
	cronusmax.ExitApiMode()
Es werden die Werte für die RX&RY Btns gesetzt und nach 16ms wird die API wieder verlassen.
D.h. die Btns werden auch nur 16ms gesetzt. (16ms, weil laut Community so viel Zeit benötigt wird, damit das Gerät das Signal/den Befehl erhält - und das stimmt auch)
Das Problem ist, dass ich so schnell wie möglich die API verlassen muss, damit mein Gamepad-Input nicht weiter durch die API blockiert wird.
(Solange wie das Gerät in API-Mode ist, ignoriert es die Signale des Gamepads)
Eigentlich soll es ja die Werte setzen (diese bleiben autom. solange bis API- Mode verlassen wird) und erst dann den API-Mode verlassen, wenn die Distanz (Fadenkreuz zu Gegner) kleiner als 1 ist.

Bis aber die Position (in Polarwerte) des Gegner neu berechnet wurde, vergehen ~40ms (gesamte Laufzeit) - lasse ich die Werte solange gesetzt, zielt es zu lang nach x,y Richtung.
Was kann ich also hier machen? Liegt es vllt nur an der Performance - muss ich diese durch Codeoptimierung verbessern?
Antworten