"Ablauf Script" Frage(n) zur (idealen) Umsetztung

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

mactep

Betreff: "Ablauf Script" Frage(n) zur (idealen) Umsetztung

BeitragMi, Apr 16, 2014 20:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

für ein Projekt benötige ich etwas Hilfe.Wenn ich jetzt z.b. eine Datei mit folgendem inhalt habe Code:


VK_DOWN
VK_UP
VK_LEFT
VK_RIGHT
WAIT_1000
VK_H
VK_A
VK_L
VK_L
VK_O




Ziel :
-Jede Zeile einzeln abzurufen und den jeweiligen Befehl zu Starten


Also bei Code:
VK_LEFT
soll der Befehl kommen um einen Tastendruck zu Simulieren.

Bei Code:
WAIT_1000
soll das Programm 1000ms warten bis es weiter macht...usw. bis zum Datei ende.



Ist etwas Blöd zu erklären,hoffe ihr versteht was ich meine und könnt mir einige Tipps zur Umsetzung geben.

Vielen Dank für eure Zeit`

Lg Michael

Xeres

Moderator

BeitragMi, Apr 16, 2014 20:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Was für Tipps erwartest du denn? Wo siehst du die Schwierigkeiten oder Probleme?
Dateien lesen, Aktionen in einer Datenstruktur speichern, Aktion ausführen - klingt jetzt nicht besonders herausfordernd, wenn du nichts zu den Rahmenbedingungen schreibst.
Soll das nur ein Programm steuern oder tatsächlich per win API richtige Tastendrücke simulieren?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

mactep

BeitragMi, Apr 16, 2014 21:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
danke für deine Antwort.

Ja, ich möchte per WinAPI Tastendrick Simulieren.Habe das ganze schon getestet.
Benötige halt hilfe bei der Ausführung und umsetzung des Scriptes.Weis nicht genau wie ich vorgehen soll.

Brauche und will da jetzt keinen "Ganzen" Code dafür aber für "Schnipsel" zur Umsetzung währe ich Dankbar.

So lerne ich halt am schnellsten wenn du /jemand dass nachvollziehen kann Idea
 

PhillipK

BeitragMi, Apr 16, 2014 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Also einfach mal ins blaue ein paar tipps:

Step1: Du brauchst ein paar variablen bzw ein array, wo du "anweisungen" reinspeicherst.
Jede anweisung kann ein int sein (fortlaufende zahl) zb ist VK_A = 1,VK_B = 2 undsoweiter undso fort.
Diese werte musst du dir im programm zb über CONST merken.

Dann brauchst du was zum auslesen.
Beispiel: Lese jede zeile der datei aus und checke den ersten part (bis _ ). Nach den schlagworten dort filterst du und leitest an processing-funktionen weiter.

Die "Vk"-checkfunktion prüft nun den nachfolgenden part ( A oder B als beispiel) und gibt die entsprechende CONST zurück ( also, wenn VK_A = 1, dann gibts die 1 wieder bzw die const dafür)
Die werte die du von jeder zeile erhälst kommen per return zurück und werden in den array geleitet.
Ist die datei entsprechend verarbeitet, gehst du in den mainloop.
Der mainloop prüft immer den nächsten wert im array und leitet ihn an verarbeitungsfunktionen weiter.
Um das wiederum übersichtlich zu halten, werden key-bereiche (also der VK krams) an eigene funktioenn weitergeleitet. Wiederrum alles prüfen und die entsprechende funktion ausführen die die taste sendet.

Kleiner tipp am rande: Das was du machen willst lässt sich super mit Autoit3 umsetzen (script krams)

Der code für deinen test da sähe wie folgt aus:
Code:
Send("{Down}{up}{left}{right}")
Wait(1000)
Send("hallo")

Links musst du dir selber suchen, da basic fremd.

Grundsätzlich also: Was du machen möchtest ist möglich, läuft aber sehr wahrscheinlich auf Winapi funktionen, mega große abfragebäume und zeitaufwand hinaus. Aber es gibt auch alternativen, kommt halt drauf an - willst du den pc steuern? Alternative suchen. Brauchst du speziell was in basic, zb für ein minispiel in einem spiel? Fragestellung präzisieren. Willst du deinen pc scriptsteuern und willst es umbedingt in Blitzbasic? Dann mach dich auf arbeit gefasst ^^

Nachtrag:
Noch ein bissl beispiel. Ist wahrscheinlich keine korrekte blitzbasic syntax (ich schreibs wie in blitzmax), aber als "pseudocode" dürfts reichen.

Code:

;Const daten
Const VK_A:int = 1
Const VK_H:int = 8
Const VK_L:int = 12
Const VK_o:int = 15

Const WAIT:int = 500 ; sprung auf 500 damit der bereich von 0-499 für VK reserviert bleibt.

;-------------------

Local workdata:int[] = new int[1000] ;1000 anweisungen platz
Local dataCount:int = 0

Local file:String = "script.txt"

Local data:String[] = ReadLines(file) ; die entsprechende datei zeilenweise als array

For local i:int = 0 to Len(data)-1
       Local predata:String = GetFirstPart(Data[i]) ; GetFirstPart schneidet den bereich VOR dem _ ab und gibt es zurück. Funktion ebenfalls selbst schreiben!
      if predata = "VK" then
            workdata[dataCount] = GetVKCode(GetLastPart(Data[i])) ; GetLastPart schneidet den bereich NACH dem _ ab und gibt es zurück. Funktion ebenfalls selbst schreiben!
            dataCount = dataCount + 1
      elseif predata = "WAIT" then
            workdata[dataCount] = WAIT
            workdata[dataCount+1] = GetWaitTime(GetLastPart(Data[i]))
            dataCount = dataCount+2
       endif
next


; Hauptschleife

Local processed:int = 0

While processed < dataCount
       If workdata[processed] < 500 ; VK bereich
              ProcessKey(workdata[processed])
              processed = processed + 1
       elseif workdata[processed]= WAIT ; sleep befehl
              Sleep(workData[processed+1])
              processed = processed +2
       else
              Print("Unable to process code: "+workdata[processed])
              processed = processed + 1
        endif
wend

; Beispiel: Key-code string zu int umwandeln. Möglichkeit 1: Simples if abfragen
; eine andere idee wäre hier, den string als asciicode zurück zu geben und entsprechenden die CONST's anzupassen. Der befehl hierfür ist meines wissens Asc("A")
Function GetVKCode:int(data:String)
       if data = "A" then return VK_A
       if data = "H" then return VK_H
       if data = "L" then return VK_L
       if data = "O" then return VK_O
       return -1
end function

Function ProcessKey(vkCode:int)
         If vkCode = VK_A then
                ; a senden
         elseif vkCode = VK_H then
                ; h senden
         elseif vkCode = VK_L then
                ; l senden
         elseif vkCode = VK_O then
                ; o senden
         endif
End Function

Ps: Falls in BlitzBasic Select / Case bäume existieren, bieten die sich natürlich an.
Pss: Du kannst shift zb emulieren, indem du bei der "shift" anweisung eine variable auf 1 setzt und den entsprechenden großbuchstaben in dem fall sendest.
 

mactep

BeitragMi, Apr 16, 2014 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

das Hilft weiter vielen Herzlichen Dank!

Der Hintegedanke:
Für ein MMORPG (Elder Scrolls Online) möchte ich eine "Emote Station" Bauen:

Arduino mit Keypad oder IR Ferbedinung <--> Sendet per Knopfdruck an mein Prog per Comport einen Befehl.
Diesen Befehl Verarbeite ich dann weiter und führe die gewünschte Aktion aus.Sachen wie

    /Hi
    /sleep
    /dance
    /drum
    /flute
    etc. (evtl ein AFK Script Laughing )



Hab das ganze schon Ingame Getestet (ohne BANN!) funktioniert Wunderbar. Zur leichteren Bedienung möchte ich halt die befehle in eine Datei schreiben um dann von meinem Prog. verwendet zu werden.

Vielen Dank für deine Hilfe !

DAK

BeitragMi, Apr 16, 2014 22:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Solange du keinen echten Programmfluss einbauen willst (Schleifen, ifs und Ähnliches), sollte das ganz einfach sein, so wie PhilipK geschrieben hat.
Du kannst es dir noch einfacher machen, indem du das Programm einfach zeilenweise ausliest und für jede Zeile vergleichst, was für ein Befehl das ist:

BlitzBasic:
stream = ReadFile("input.txt")
While Not Eof(stream)
Line = ReadLine(stream)
If (Line="VK_A") Then
;Simuliere Tastendruck A
ElseIf (Line="VK_B") Then
;Simuliere Tastendruck B
;...
EndIf
Wend


Das eigentliche Tastendruck-Simulieren machst du hiermit
Gewinner der 6. und der 68. BlitzCodeCompo
 

PhillipK

BeitragMi, Apr 16, 2014 23:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du überwiegend auf "slash emotes" aus bist, halte ich es für sinnvoller wenn du eine verarbeitung für deine "befehle" schreibst, dh die strings selbst ausliest und keine anweisungsscripts baust.

Diese "anweisungsscripts" sind dann sinnvoll, wenn du wirklich etwas automatisieren willst. Die "auslagerung" in dateien kann zu verschiedenen problemen führen - nicht zuletzt wird deine festplatte bei falscher umsetzung leiden Wink Zuviele zugriffe sind einfach blöde.

Wäre es dahingehend nicht sinnvoller, eine tastenbelegung oder ähnliches in eine datei auszulagern und intern befehle damit zu koppeln? Zb kann die datei wie folgt aussehen:
"KEY_Eins = Hi"

"hi" ist in dem fall ein schlagwort, was eine fest einprogrammierte key reihenfolge hat:

Code:
Function Hi()
      Send("enter")
      Send("/")
      Send("H")
      Send("i")
      Send("enter")
end function

oder ähnliches.
Wobei Send die funktion übernimmt die entsprechende taste per win api zu senden und spezialfälle wie Shift, Strg und Enter gesondert abfragt.

Warum?
Wenn du deine befehle als anweisungs-folge auslagern willst, sehe ich das problem kommen, das du die datei beim tastendruck öffnest^^
Bots oder was auch immer du planst können ebenfalls fest einprogrammiert werden.
Alternativ: Eine gui, per Graphics() oder ähnlichem, in der du deine sachen belegen kannst.
Ich denke einfach, das es schneller sein wird und fehleranfälligkeit runtersetzt wenn du deine Befehle fest einprogrammierst und nur irgendwie zuweist. Nicht zuletzt weil das "erstellen" deiner anweisungs-folgen auch einfach nervig sein wird.

Wie DAK bereits sagte, diehnt mein ansatz btw nicht für komplexere programmstrukturen. Aber ich glaube das dies auf deine problemstellung eh nicht zutrifft.
 

mactep

BeitragMi, Apr 16, 2014 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für die Zahlreiche Unterstützung !

Fange morgen an, mal gucken was rauskommt.
Bin jedoch zuversichtlich dass ich es jetzt geschnallt hab wie ich vorgehen muss.

An alle ein Herzliches Dankö !!

DAK

BeitragDo, Apr 17, 2014 7:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Noch eine kurze Anmerkung zu PhillipKs letztem Post:
Du kannst es schon auch auf die Festplatte auslagern, solange du es beim Programmstart ein mal einliest und zwischenspeicherst, so dass du nicht bei jedem Mal neu auf die Festplatte zugreifst.
Es spricht jedoch nichts dagegen (wenn es dir hauptsächlich um Strings geht, die per Tastatur gesendet werden sollen), in deinem Code Strings direkt einzubauen. Also dass du statt

Code:
VK_ENTER
VK_SLASH
VK_H
VK_I
VK_ENTER


Code:
VK_ENTER
"/hi"
VK_ENTER


machst und alles in Anführungszeichen einfach zeichenweise parst und die passende Taste drückst.


Das auf-die-Platte-Auslagern macht aber nur wirklich Sinn, wenn öfteres Neukompilieren nicht in Frage kommt (weil du z.B. die Strings sehr oft änderst, von einem anderen Programm ändern lässt, oder du das Programm an jemanden weiter gibst, der kein BB hat und das Programm somit nicht neu kompilieren kann). Ansonsten wird es einfacher sein, die Befehle fix einzubauen.
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group