Hilfe zu String Funktionen

» Siedler Map Source Forum » Siedler DEdK Script Forum » Hilfe zu String Funktionen

Seiten: 1

Ludwig
#1
23.01.2017 17:14
Beiträge: 440

Hilfe zu String Funktionen

Benötige Hilfe !
Da meine LUA - Kenntnisse immer noch recht bescheiden sind, habe Probleme mit den String - Funktionen.
Besonders mit > string.format < . Im Wiki ist sie nur recht spärlich beschrieben und im Forum habe ich auch kein für mich passendes Beispiel gefunden.
Mein Problem: ich habe eine Reihe von Funktionen deren Name sich nur durch eine Zahl unterscheidet.
Angebot1()
Angebot2()
usw.
Der Spieler soll nun über > GameCallback_GUI_ChatStringInputDone < eine Zahl eingeben, mit der dann der Funktionsaufruf erstellt wird.
Ich habe kein Problem, wenn der Spieler den kompletten Befehl z.B. Angebot1() eingeben würde.
Bisher verwende ich
function Auswahl()
XGUIEng.ShowWidget(XGUIEng.GetWidgetID("ChatInput",1)
XGUIEng.SetWidgetPosition(XGUIEng.GetWidgetID("ChatInput",400,100)
GameCallback_GUI_ChatStringInputDone = function (_M)
_M = tonumber( _M )
if _M == 1 then
Angebot1()
elseif _M == 2 then
Angebot2()
elseif _M == 3 then
Angebot3()

usw.
Das geht, erscheint mir aber unschön, da sehr lang (es gibt 10 Angebote).
Kann mir jemand helfen meine Kenntnisse zu erweitern und eine elegantere Lösung zu finden.
Gruß
Ludwig

Settlerman
#2
23.01.2017 17:41
Beiträge: 238

Konnte man nicht mit .. Sachen in Lua anhängen? Probier es mal mit Angebot.._M() .

Edit: Davor vlt noch Abfragen ob der Input eine Nummer zwischen 1-10 ist.

mcb
#3
23.01.2017 17:44
Beiträge: 1472

Ja:

function GameCallback_GUI_ChatStringInputDone(str)
   str = tonumber(str)
   assert(str > 0 and str < 11)
   _G["Angebot"..str]()
end


Über _G kann man auf die Globalen Variablen in einem table zugreifen. Ich baue den Funktionsnamen nur noch zusammen, und rufe die Funktion auf.

Ludwig
#4
23.01.2017 18:28
Beiträge: 440

Danke,
werde das gleich mal probieren.
Ludwig
Habe das so gemacht, klappt leider nicht ! Was ist da Falsch ?

function Auswahl()
	XGUIEng.ShowWidget(XGUIEng.GetWidgetID("ChatInput"),1)
	XGUIEng.SetWidgetPosition(XGUIEng.GetWidgetID("ChatInput"),400,100)
	GameCallback_GUI_ChatStringInputDone(str)
	str = tonumber(str)
	assert(str > 0 and str < 11)
	_G["Angebot"..str]()
end

Dieser Beitrag wurde von Ludwig am 23.01.2017 um 18:37 editiert.

mcb
#5
23.01.2017 21:13
Beiträge: 1472

Du definierst keine neue Funktion für GameCallback_GUI_ChatStringInputDone.

function Auswahl()
	XGUIEng.ShowWidget(XGUIEng.GetWidgetID("ChatInput"),1)
	XGUIEng.SetWidgetPosition(XGUIEng.GetWidgetID("ChatInput"),400,100)
	function GameCallback_GUI_ChatStringInputDone(str)
		str = tonumber(str)
		assert(str > 0 and str < 11)
		_G["Angebot"..str]()
	end
end

Ludwig
#6
23.01.2017 22:07
Beiträge: 440

Lösung gefunden

Nach einigem Probieren wie folgt gelöst:

function Auswahl()
	XGUIEng.ShowWidget(XGUIEng.GetWidgetID("ChatInput"),1)
	XGUIEng.SetWidgetPosition(XGUIEng.GetWidgetID("ChatInput"),400,100)
	GameCallback_GUI_ChatStringInputDone = function (_M)	
		z = tonumber( _M )
		text = string.format("Angebot%s",z )
		text = tostring(text)
		_G[text]()
	end
end


So geht es.
Ludwig

Peter-FS
#7
24.01.2017 07:22
Beiträge: 1086

Gültige Eingabe?

Hallo Ludwig,

ich würde aber die Gültigkeit der Eingabe wieder prüfen und einfügen.

assert(z>0 and z<11)


Funktioniert zwar vermutlich auch so, da die nicht vorhandene Funktion nicht ausgeführt wird, aber so wäre es eindeutig und führt zu keinem Fehler.

____________________
Man muss nicht alles wissen, man muss nur wissen wo es steht!

Ludwig
#8
24.01.2017 08:34
Beiträge: 440

Hallo Peter,
irgendwo ist da der Wurm drin. Das ist ja wohl auch nicht normal, dass ich da erst tonumber anwenden muß und dann später tostring. Aber anders habe ich das nicht hin bekommen. Die assert Abfrage mußte ich raus nehmen, da es mit Abfrage nicht ging. Mein Problem ist eben, dass ich die Anwendung der sog. Formatangaben nicht im Griff habe. Mir fehlen eben die genauen Kenntnisse zur Syntax der String - Befehle.
Danke noch mal für alle Hinweise.
Gruß
Ludwig

Peter-FS
#9
24.01.2017 12:36
Beiträge: 1086

vielleicht so

function Auswahl()
	XGUIEng.ShowWidget(XGUIEng.GetWidgetID("ChatInput"),1)
	XGUIEng.SetWidgetPosition(XGUIEng.GetWidgetID("ChatInput"),400,100)
	GameCallback_GUI_ChatStringInputDone = function (_M)	
	    z = tonumber( _M )
	    if z>0 and z<11 then
                text = string.format("Angebot%s",z )
	        text = tostring(text)
                _G[text]()
            else
                Message("Falsche Eingabe")
            end
	end
end



____________________
Man muss nicht alles wissen, man muss nur wissen wo es steht!

Ludwig
#10
24.01.2017 15:10
Beiträge: 440

Das habe ich auch schon gedacht, denke das es auch geht. Grund dürfte bei StringFormat das %s sein was wohl auf eine numerische Zahl weist, später für den Befehl wird aber ein String benötigt. Es fehlen mir eben die Kenntnisse über die Formatangaben (Bedeutung und richtige Anwendung). Bin im Moment erst einmal froh, eine Lösung gefunden zu haben und werde auch noch weiter knobeln. Für mich ist das ja der Sinn der Sache das ich noch was lerne und das Gehirn etwas anrege.
Ludwig

Ludwig
#11
25.01.2017 19:04
Beiträge: 440

Die Probleme gehen weiter

Es läuft nun wie gewünscht aber ich kann den Fehler nicht abfangen, wenn der Spieler nur Return drückt ohne eine Zahl eingegeben zu haben. Ich glaube mich zu erinnern, schon einmal einen Beitrag dazu gelesen zu haben. Finde den aber nicht mehr.
Was enthält die Variable _M wenn kein Wert eingegeben wurde.
Bitte nochmals um Hilfe.
Gruß
Ludwig

mcb
#12
25.01.2017 19:27
Beiträge: 1472

Ich würde jetzt vermuten nil oder "". Genau weist dus, wenn du einfach mal mit dem Debugger nachsiehst

Ludwig
#13
25.01.2017 20:35
Beiträge: 440

Bisher nichts gefunden.
Ausprobiert : Nil, "", if z>0 and z<11 then / else falsch, Message(" Die Eingabe ist ".._M).
Hat alles nichts gebracht.
Ludwig

Peter-FS
#14
26.01.2017 13:40
Beiträge: 1086

Chat

Soweit ich noch weiß, wird die GameCallback_GUI_ChatStringInputDone bei Return oder ESC gar nicht ausgeführt.

____________________
Man muss nicht alles wissen, man muss nur wissen wo es steht!

mcb
#15
26.01.2017 13:46
Beiträge: 1472

Grade mal ausprobiert, wird tatsächlich nicht Aufgerufen.
Du könntest aber Theoretisch abfragen, ob das ganze noch angezeigt wird:

XGUIEng.IsWidgetShown("ChatInput")==1

Seiten: 1

SiteEngine v1.5.0 by nevermind, ©2005-2007
Design by SpiderFive (www.siedler-games.de) - English translation by juja

Impressum