Var in einer Loop ändern

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

nacken012
Posts: 71
Joined: 22 Jul 2016, 14:39

Var in einer Loop ändern

05 Apr 2020, 01:33

Hallo

Ich habe wohl gerade ne kleine Wissens Lücke

Folgendes habe ich vor, ich lese 1 INI Datei aus und bekomme ja Werte zurück und zwar Koordinaten, insgesamt maximal 4

Dann springe ich in einer Loop, wo sie angesteuert werden sollen, aber bei jedem durch gang soll dann die nächste von den maximal 4 Koordinaten
genommen werden, kann also sein je nach Einstellung in den Prefs, entweder 1, 2, 3 oder 4 verschiedene Koordinaten.

Wie steuere ich das in der Loop (hier bei MouseMove

Code: Select all

if (ReadAvatarJohann = "1")
    VarUser := 770
if (ReadAvatarHolzfaeller = "1")
    VarUser := 900
if (ReadAvatarSofie = "1")
    VarUser := 1030
if (ReadAvatarCarl = "1")
    VarUser := 1160
    .....
   Loop, 100
   {
   MouseMove, %VarUser%, 290, 0 ; um diese Zeile geht es
   } 


Ich Danke schon mal
BNOLI
Posts: 548
Joined: 23 Mar 2020, 03:55

Re: Var in einer Loop ändern

05 Apr 2020, 02:32

Ein einfacher Weg wäre die Übergabe der Werte als Parameter einer Funktion ...

Code: Select all

if (ReadAvatarJohann = 1)    ; wenn ich mich recht erinnere werden nur Strings mittels " " deklariert, Zahlen jedoch nicht (?)
    KickAvatar(770)       ; hier der Funktionsaufruf. Der Name (d)einer "User Defined Function" = UDF bleibt deiner Phantasie überlassen.
if (ReadAvatarHolzfaeller = 1)
    KickAvatar(900)      ; die Mauskoordinate wird hier als (erster/ein) Parameter übergeben ...
if (ReadAvatarSofie = 1)
    KickAvatar(1030)    ; ... denn generell ließen sich in einem Funktionsaufruf auch mehrere Parameter übergeben z.B. : KickAvatar("Sofie", 1160)
if (ReadAvatarCarl = 1)
Rückmeldung  :=  KickAvatar(1160)    ; optionale Übergabe eines retournierten Wertes nach Funktionsaufruf in eine Variable.
MsgBox % Rückmeldung    ; Anzeige des retournierten Wertes der Funktion

KickAvatar(Position) {    ; dies ist die aufgerufene Funktion. Der Parameter im Funktionsaufruf wird hier in der Variablen "Position" gespeichert ...
   Loop, 100
       MouseMove, %Position%, 290, 0   ; ... und wäre hier auch nur innerhalb der Funktion abruf-/verwendbar.
   Return  % "Fertig"      ; dieser Befehl ermöglicht das optionale Retournieren eines Wertes (hier ein String).
   }
Code aus dem Gedächtnis geschrieben. Ungetestet. Ich denke das Ganze ließe sich sicher noch weiter verschlanken.
Remember to use [code]CODE[/code]-tags for your multi-line scripts. Stay safe, stay inside, and remember washing your hands for 20 sec !
nacken012
Posts: 71
Joined: 22 Jul 2016, 14:39

Re: Var in einer Loop ändern

05 Apr 2020, 03:32

Vielen lieben Dank, werde das gleich mal einbauen und testen
BNOLI
Posts: 548
Joined: 23 Mar 2020, 03:55

Re: Var in einer Loop ändern

05 Apr 2020, 04:34

Code: Select all

SetIniKey("myGame.ini", "Johann", "Status", 1)   ; (UDF) Funktionsaufruf um in INI-datei "myGame.ini", in der Sektion "Johann" dem Key "Status" den Wert 1 zuzuordnen.
KickAvatar("Johann")
KickAvatar("Holzfaeller")
KickAvatar("Sofie")
KickAvatar("Carl")
SoundBeep


SetIniKey(Filename, Section, Key, Value) {    ; hier die aufgerufene Funktion
   IniWrite, % Value, % Filename, % Section, % Key
   }

KickAvatar(AvatarName) {
   IniRead, Status, myGame.ini, % AvatarName, Status       ; z.B. in INI-Sektion "Sofie" mit INI-Key "Status" = 1
   IniRead, Position, myGame.ini, % AvatarName, Position  ; der INI-Key "Position" muss in der INI-Sektion für "Sofie" natürlich vorhanden sein, heisst: Position = 1030
   If (Status != 1)  ; Status ungleich 1 ...
      Return    ; ... Ausstieg aus der Funktion
   Loop, 100
       MouseMove, %Position%, 290, 0
   }
   
... hier mal mit variabler INI-Abfrage in einer Funktion. Ziel muss es sein, alle vom User manuell zu ändernden Werte/Einstellungen in die INI-Datei auszulagern!
Dazu eine (UDF) INI-Setting Funktion zur Veranschaulichung der Übergabe mehrerer Parameter bei einem Aufruf.
Remember to use [code]CODE[/code]-tags for your multi-line scripts. Stay safe, stay inside, and remember washing your hands for 20 sec !
nacken012
Posts: 71
Joined: 22 Jul 2016, 14:39

Re: Var in einer Loop ändern

05 Apr 2020, 07:24

Also irgendwas mache ich noch falsch, der läuft die 4 User nacheinander durch, fängt aber dann nicht wieder bei Johann an und macht weiter

Hier mal das ganze Script

Code: Select all

#SingleInstance, Force
#NoEnv
SetBatchLines, -1
ListLines Off
Sleep, 100
IniRead,ReadSchloss,Daten/ini/Setup.ini,Schloss,Key1
IniRead,ReadSchlossUser,Daten/ini/Setup.ini,Schloss,Key2
IniRead,ReadSchlossZeit,Daten/ini/Setup.ini,Schloss,Key3

#Include D:\Tools\AutoHotkey 1.1\Compiler\ToolTipOpt.ahk

IniRead,ReadAvatareWechseln,Daten/ini/Setup.ini,AvatareWechseln,Key1
IniRead,ReadAvatarJohann,Daten/ini/Setup.ini,AvatarJohann,Key1
IniRead,ReadAvatarHolzfaeller,Daten/ini/Setup.ini,AvatarHolzfaeller,Key1
IniRead,ReadAvatarSofie,Daten/ini/Setup.ini,AvatarSofie,Key1
IniRead,ReadAvatarCarl,Daten/ini/Setup.ini,AvatarCarl,Key1

ToolTipFont("s16", "arialbd")
CoordMode, Mouse, Screen
Sleep, 500
ToolTip, Plaziere das Schloss und drücke die Space Taste, 35, 120, 9
Gui, 3: -Caption +AlwaysOnTop 
Gui, 3: Show, x70 y160 w400 h400 ;, NA
Gui, 3: Add, Picture, x0 y0 w400 h400, Bilder/Vorschau/SchlossRitter.jpg
Sleep, 500
MouseMove, 512, 969, 0
Sleep, 500
Sleep, %ReadSchlossZeit%
Click, Left, 1
KeyWait, Space, D
ToolTip, , , , 9
Gui, 3: Cancel


Sleep, 200
Var := 0
if (ReadAvatarJohann = 1)
    KickAvatar(770)
if (ReadAvatarHolzfaeller = 1)
    KickAvatar(900)
if (ReadAvatarSofie = 1)
    KickAvatar(1030)
if (ReadAvatarCarl = 1)
Rückmeldung  :=  KickAvatar(1160)
KickAvatar(Position) {    ; dies ist die aufgerufene Funktion. Der Parameter im Funktionsaufruf wird hier in der Variablen "Position" gespeichert ...
      Loop, %ReadSchloss%
;{
Sleep, 100
Sleep, %ReadSchlossZeit%
MouseMove, 1340, 800, 0
Sleep, 50
Sleep, %ReadSchlossZeit%
Click, Left, 1 ; Schloss anklicken
Sleep, 1500
Sleep, %ReadSchlossZeit%
MouseMove, 960, 750, 0
Sleep, 50
Sleep, %ReadSchlossZeit%
Click, Left, 1 ; Abenteuer anklicken
Sleep, 1000
Sleep, %ReadSchlossZeit%
MouseMove, 770, 290, 0
Sleep, 50
Sleep, %ReadSchlossZeit%
Click, Left, 1 ; Alpenwiese anklicken
Sleep, 800
Sleep, %ReadSchlossZeit%
MouseMove, 1074, 838, 0
Sleep, 50
Sleep, %ReadSchlossZeit%
Click, Left, 1 ; Untertanen anklicken
Sleep, 1500
Sleep, %ReadSchlossZeit%
MouseMove, %Position%, 290, 0
Sleep, 50
Sleep, %ReadSchlossZeit%
Click, Left, 1 ; Holzfäller anklicken
Sleep, 1000
Sleep, %ReadSchlossZeit%
MouseMove, 1079, 838, 0
Sleep, 50
Sleep, %ReadSchlossZeit%
Click, Left, 1 ; Auf gehts
Sleep, 1200
Sleep, %ReadSchlossZeit%
MouseMove, 500, 1036, 0
Sleep, 500
Sleep, %ReadSchlossZeit%
Click, Left, 1
Sleep, 500
Sleep, %ReadSchlossZeit%
Click, Left, 1

;-------------- Countdown--------------

#Persistent

; E sind die Minuten, F sind die Sekunden
E := 5
F := 5

StartOver1:
T := 0
W := (E * 60) + F
SubText := Format("{:02}:{:02}", W // 60, Mod(W, 60))
Progress, X50 Y930 M CBFF0000 CTBlack CWDDDDDD P%W% R0-%W%, %SubText%, Wir müssen warten, Countdowner

Loop {
   Sleep, 1000
   T++
   Value := W - T
   SubText := Format("{:02}:{:02}", Value // 60, Mod(Value, 60))
   Progress, %Value%, %SubText%
} Until (T = W)
Progress, Off
MouseMove, 1354, 463, 0
Sleep, 100
Sleep, %ReadSchlossZeit%
Click, Left, 1
Sleep, 2500
MouseMove, 957, 850, 0
Sleep, 100
Sleep, %ReadSchlossZeit%
Click, Left, 1
Sleep, %ReadSchlossZeit%
Return  ;% "Fertig" 
}
BNOLI
Posts: 548
Joined: 23 Mar 2020, 03:55

Re: Var in einer Loop ändern

05 Apr 2020, 12:26

Code: Select all

#SingleInstance, Force
#NoEnv
SetBatchLines, -1
ListLines Off
Sleep, 100
IniRead,ReadSchloss,Daten/ini/Setup.ini,Schloss,Key1    ; seltsame Pfadangabe(n), gilt auch für nachfolgende Pfade ???
IniRead,ReadSchlossUser,Daten/ini/Setup.ini,Schloss,Key2
IniRead,ReadSchlossZeit,Daten/ini/Setup.ini,Schloss,Key3

#Include D:\Tools\AutoHotkey 1.1\Compiler\ToolTipOpt.ahk

IniRead,ReadAvatareWechseln,Daten/ini/Setup.ini,AvatareWechseln,Key1
IniRead,ReadAvatarJohann,Daten/ini/Setup.ini,AvatarJohann,Key1
IniRead,ReadAvatarHolzfaeller,Daten/ini/Setup.ini,AvatarHolzfaeller,Key1
IniRead,ReadAvatarSofie,Daten/ini/Setup.ini,AvatarSofie,Key1
IniRead,ReadAvatarCarl,Daten/ini/Setup.ini,AvatarCarl,Key1   ; keine der per IniRead ermittelten Werte wird im Funktionsaufruf übergeben. Also bleiben alle in der Funktion verwendeten Variablen leer.

ToolTipFont("s16", "arialbd")
CoordMode, Mouse, Screen
Sleep, 500
ToolTip, Plaziere das Schloss und drücke die Space Taste, 35, 120, 9
Gui, 3: -Caption +AlwaysOnTop 
Gui, 3: Show, x70 y160 w400 h400 ;, NA
Gui, 3: Add, Picture, x0 y0 w400 h400, Bilder/Vorschau/SchlossRitter.jpg
Sleep, 500
MouseMove, 512, 969, 0
Sleep, 500
Sleep, %ReadSchlossZeit%
Click, Left, 1
KeyWait, Space, D
ToolTip, , , , 9
Gui, 3: Cancel

Sleep, 200
Var := 0    ; dieser Wert bleibt ohne Wirkung da er weder ausserhalb der Funktion verwendet, noch im Funktionsaufruf übergeben wird.

if (ReadAvatarJohann = 1)
    KickAvatar(770)
if (ReadAvatarHolzfaeller = 1)
    KickAvatar(900)
if (ReadAvatarSofie = 1)
    KickAvatar(1030)
if (ReadAvatarCarl = 1)

Rückmeldung  :=  KickAvatar(1160)   ; da keine Rückmeldung aus der Funktion stattfindet, ist die Übergabe in eine Variable hier sinnlos

KickAvatar(Position) {    ; hier beginnt die aufgerufene Funktion. Der Parameter im Funktionsaufruf wird hier in der Variablen "Position" gespeichert ...
      Loop, %ReadSchloss%   ; dieser Loop um"klammert" keinerlei nachfolgenden Code, deshalb wird lediglich die darauf folgende Zeile gelooped.
;{
Sleep, 100
Sleep, %ReadSchlossZeit%
MouseMove, 1340, 800, 0
Sleep, 50
Sleep, %ReadSchlossZeit%
Click, Left, 1 ; Schloss anklicken
Sleep, 1500
Sleep, %ReadSchlossZeit%
MouseMove, 960, 750, 0
Sleep, 50
Sleep, %ReadSchlossZeit%
Click, Left, 1 ; Abenteuer anklicken
Sleep, 1000
Sleep, %ReadSchlossZeit%
MouseMove, 770, 290, 0
Sleep, 50
Sleep, %ReadSchlossZeit%
Click, Left, 1 ; Alpenwiese anklicken
Sleep, 800
Sleep, %ReadSchlossZeit%
MouseMove, 1074, 838, 0
Sleep, 50
Sleep, %ReadSchlossZeit%
Click, Left, 1 ; Untertanen anklicken
Sleep, 1500
Sleep, %ReadSchlossZeit%
MouseMove, %Position%, 290, 0
Sleep, 50
Sleep, %ReadSchlossZeit%
Click, Left, 1 ; Holzfäller anklicken
Sleep, 1000
Sleep, %ReadSchlossZeit%
MouseMove, 1079, 838, 0
Sleep, 50
Sleep, %ReadSchlossZeit%
Click, Left, 1 ; Auf gehts
Sleep, 1200
Sleep, %ReadSchlossZeit%
MouseMove, 500, 1036, 0
Sleep, 500
Sleep, %ReadSchlossZeit%
Click, Left, 1
Sleep, 500
Sleep, %ReadSchlossZeit%
Click, Left, 1

;-------------- Countdown--------------

#Persistent   ; an dieser Stelle im Code ???

; E sind die Minuten, F sind die Sekunden    ; interessant. War "M" bzw. "S" (was wenigstens annähernd 'sprechend'/selbsterklärend gewesen wäre) schon vergeben?
E := 5
F := 5

StartOver1:
T := 0
W := (E * 60) + F
SubText := Format("{:02}:{:02}", W // 60, Mod(W, 60))
Progress, X50 Y930 M CBFF0000 CTBlack CWDDDDDD P%W% R0-%W%, %SubText%, Wir müssen warten, Countdowner

Loop {
   Sleep, 1000
   T++
   Value := W - T
   SubText := Format("{:02}:{:02}", Value // 60, Mod(Value, 60))
   Progress, %Value%, %SubText%
} Until (T = W)

Progress, Off
MouseMove, 1354, 463, 0
Sleep, 100
Sleep, %ReadSchlossZeit%
Click, Left, 1
Sleep, 2500
MouseMove, 957, 850, 0
Sleep, 100
Sleep, %ReadSchlossZeit%
Click, Left, 1
Sleep, %ReadSchlossZeit%
Return  ;% "Fertig"     ; Return ohne jegliche Funktion 
}    ; hier endet dann die Funktion, wenn diese 'abschließende' Klammer bewusst gesetzt wurde.
Anmerkungen im Code.
Remember to use [code]CODE[/code]-tags for your multi-line scripts. Stay safe, stay inside, and remember washing your hands for 20 sec !

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 5 guests