Fenster und andere Infos in einer Map

» Siedler Map Source Forum » Siedler DEdK Script Forum » Fenster und andere Infos in einer Map

Seiten: 1

Kalle
#1
04.08.2010 23:26
Beiträge: 1150

Fenster und andere Infos in einer Map

Hallo,

ich weiß, das hatten wir schon einmal irgendwo. Aber wer kann mir einfach mal zeigen/erklären, wie ich am besten ein Info-Fenster scripte.

Hintergrund: Sagen wir mal, ich "klicke" einen Brunnen an, dann soll solange ich den Brunnen ausgewählt habe, auf dem Bildschirm ein nicht zu großes Fenster aufgehen, auf dem Informationen stehen (zB "Der Brunnen hat noch 400 Liter". Ich denke da an ein Fenster (nicht unbedingt so groß und wuchtig wie "Mentor", welches Platz für ca. 6 Zeilen a 30 Zeichen hat.

Hat jemand etwas passendes ?

Danke

____________________
Lieber Siedeln statt (fern)sehen.....

andre111
#2
05.08.2010 09:34
Beiträge: 220
Siedler_Team
#3
05.08.2010 13:20
Beiträge: 847

Zitat von Kalle:
Hallo,

ich weiß, das hatten wir schon einmal irgendwo. Aber wer kann mir einfach mal zeigen/erklären, wie ich am besten ein Info-Fenster scripte.


Jau Kalle,
da gibt es zwei Möglichkeiten.
Möglichkeit 1.):

InfoHinweis1 = {
   info1 = function()
   table.insert(rolay,{ soll=0, ist=0, zaehler=1, actionEnd = InfoHinweis1.info2,}) end,
   info2 = function()
   GUI.AddStaticNote(""..tAbs.." "..
   ""..nMentor.." "..
   "@cr "..tAbs.." Ihr habt einen wichtigen Hinweis. "..
   "@cr "..tAbs.." Schaut in euer Auftragsbuch.");
   XGUIEng.ShowWidget( "TutorialMessageBG" ,1 );
   -- end  (fehler, weg da!)
   table.insert(rolay,{ soll=3, ist=0, zaehler=1 , actionEnd = function() 
   XGUIEng.ShowWidget( "TutorialMessageBG" ,0 )
   GUI.ClearNotes();
   end }) 
   end --< muss da hin!
}


Obiger Code öffnet und schliesst solch ein Meldefenster wie andre111 es in seinem Link zeigt.

Die Variablen "..tAbs.." und "..nMentor.." stehen für:

function InitGlobalColor()
   orange = "@color:255,127,0"
   gelb = "@color:255,215,0"
   rot  = "@color:255,0,0"
   blau = "@color:0,0,255"
   lila = "@color:180,82,205"
   hGelb = "@color:238,221,130"
   hBlau = "@color:99,184,255"
   weiss = "@color:255,255,255"
   hGruen = "@color:173,255,47"
   tWeiss  = "@color:255,255,255,100" -- transparent
   tOrange  = "@color:255,127,0,100" -- tranzparent
   tAbs  = "@color:0,0,0,0: ... @color:255,255,255" 
   nMentor = ""..orange.." Mentor "..weiss..""
end


"..tAbs.." sorgt für einen kleinen Abstand vom linken Meldefensterrand, was optisch besser aussieht.
Als Comfort-Funktion werden hier sämtliche rolay-Hilfsfunktionen benötigt. Solltest Du aber haben, oder?

2. Möglichkeit ist das MovieFenster. Darstellungszeit auch wieder über ein rolay gesteuert.
Beispiel:

 
Information_1	= {
   info1 = function()
   table.insert(rolay,{
   soll=2,
   ist=0,
   zaehler=1,
   actionEnd = Information_1.info2,
   })
   end,
   info2 = function()
   MovieFenster(""..nFlodder.."",""..weiss.." Der Wanderer "..tWanderer..", hat sein Zelt am Pass aufgeschlagen. "..
   "@cr Schaut mal bei ihm vorbei. Er hat eine Nachricht für Euch.")
   table.insert(rolay,{
   soll=15, 
   ist=0,
   zaehler=1 ,
   actionEnd = function()
   -- Folgefunktion()
   HideMovieFenster()
   end
   })
   end
}


Aufruf zum ersten Beispiel:

InfoHinweis1.info1()


Aufruf zum zweiten Beispiel:

Information_1.info1()


In Beispiel 2) werden zum rolay auch noch die:

function MovieFenster(_Title,_Text)
   XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "Movie" ), 1 );
   XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "Cinematic_Text" ), 0 );
   XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "MovieBarTop" ), 0 );
   XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "MovieBarBottom" ), 0 );
   XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "MovieInvisibleClickCatcher" ), 0 );
   XGUIEng.SetText( XGUIEng.GetWidgetID( "CreditsWindowTextTitle" ), _Title );
   XGUIEng.SetText( XGUIEng.GetWidgetID( "CreditsWindowText" ), _Text );		
end

function HideMovieFenster()
    XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "Movie" ), 0 );    
end


...Comforts benötigt.
Ich hoffe, das hilfst Dir bei Deinem Problem weiter, Kalle.

____________________
Wer altes Wissen ehrt und neues Wissen erlangt, ist bereit, ein Lehrer zu sein. ( -Konfuzius- )

Dieser Beitrag wurde von Siedler_Team am 05.08.2010 um 17:49 editiert.

Kalle
#4
05.08.2010 14:35
Beiträge: 1150

Hallo Andre111, Hallo SiedlerTeam,

jau, so etwas wie der Screenshot sollte es sein.

Zitat von Siedler_Team:

Als Comfort-Funktion werden hier sämtliche rolay-Hilfsfunktionen benötigt. Solltest Du aber haben, oder?



@SiedlerTeam: Leider nein, ich kenne Rolay zwar von den Infos her, habe mich aber bisher gescheut, damit zu arbeiten, weil ich die Funktion noch nicht ganz geschnallt habe. Dazu aber später mehr, bzw. in einem neuen Thread werde ich bestimmt noch rund um Rolay fragen stellen.

Bekomme ich eine Email mit den nötigen Funktionen? Oder brauche ich diese gar nicht, wenn ich das Fenster nicht zeitgesteuert aufrufen möchte? Wie beschrieben wollte ich das Fenster nur für die Zeit, die das entsprechende Objekt ausgewählt wurde. Sobald der Player etwas anderes anklickt, soll das Fenster wieder verschwinden....

Gruß
Kalle

____________________
Lieber Siedeln statt (fern)sehen.....

Flodder
#5
05.08.2010 15:27
Beiträge: 2608

Zitat von Kalle:

Bekomme ich eine Email mit den nötigen Funktionen?


Sicher! Schick mir einfach ne eMail, wenn Du sie möchtest.
Allerdings:

Zitat von Kalle:

Oder brauche ich diese gar nicht, wenn ich das Fenster nicht zeitgesteuert aufrufen möchte? Wie beschrieben wollte ich das Fenster nur für die Zeit, die das entsprechende Objekt ausgewählt wurde. Sobald der Player etwas anderes anklickt, soll das Fenster wieder verschwinden....


...brauchst Du sie für diese Zwecke nicht, bzw. kannst die Zeitsteuerung des Fensters umgehen.

Entscheidend für das Fenster sind:

XGUIEng.ShowWidget( "TutorialMessageBG" ,1 );


und

XGUIEng.ShowWidget( "TutorialMessageBG" ,0 );


Zustand "1" schaltet das Fenster ein und Zustand "0" wieder aus.
Damit der Text dann auch IM Fenster steht und nicht irgendwo ausserhalb:

GUI.AddStaticNote("Bla... bla... bla...");


...und wenn der Text wieder weg soll:

GUI.ClearNotes();


Die Zeitsteuerung: soll, ist, zaehler ist ja eigentlich nichts weiter als ein Counter, wobei bei (=ist) "0" begonnen werden kann und bei einer frei wählbar zu erreichenden Zeit (=soll) beendet werden soll. Taktrate (=zaehler) wäre hier "1". Also im Sekundentakt.

Das ganze geht natürlich auch Rückwärts.
soll = 0, ist = 600, zaehler= -1,

Für Deine Zwecke:
Mach z.B. nen Job draus. Kommt immer drauf an, was passieren soll.

Ist die Bedingung erfüllt:
XGUIEng.ShowWidget( "TutorialMessageBG" ,0 ); (=Fenster schliessen)
plus
GUI.ClearNotes(); (= Fenstertext löschen)

Fertig!
Das rolay selbst wird für Deine Zwecke also nicht gebraucht, ist aber eine unglaublich vielseitige Funktion, die für alles mögliche gebraucht werden kann. So kann man damit z.B. x-beliebig viele zeitlich zu steuernde Dinge hintereinander in EINER Funktion ablaufen lassen und noch einiges mehr.

____________________
Take a Nudelholz und hau it on the Kopp of a bekloppt Person .... to give you a better Gefühl than vorher.

Flodder
#6
05.08.2010 16:34
Beiträge: 2608

Deine Frage war relativ einfach zu lösen Kalle:
Job starten:

StartSimpleJob("SelektNr1")


Der Job:

function SelektNr1()
   if GUI.GetSelectedEntity("hero") then 
   XGUIEng.ShowWidget( "TutorialMessageBG" ,1 );
   GUI.AddStaticNote("Bla... bla... bla...");
   StartCountdown( 10, Nachricht1Ende, false )
   return true
   end	
end


Für "hero" kannste natürlich jede Entity nehmen, die einen Namen hat.
Das Fenster samt Text steht dann 10 Sekunden, was natürlich angepasst werden kann. Der Counter läuft im Hintergrund und ist nicht sichbar, weil false.

Ist der abgekaufen, soll folgendes passieren:

function Nachricht1Ende()
   XGUIEng.ShowWidget( "TutorialMessageBG" ,0 );
   GUI.ClearNotes();
   -- Folgefunktion
end


Nach 10 Sekunden verschwindet das Fenster samt Text und eine neue Funktion kann gestartet werden.

Sollen mehrere Abfragen Parallel laufen, dann eben mehrere Jobs aufrufen. Solange Countdown auf false steht, geht das. Setzt Du den auf true, kann nur ein Counter zur Zeit laufen.

Eine andere Möglichkeit wäre, das Fenster über:

local mouseX, mouseY = GUI.Debug_GetMapPositionUnderMouse()
...und so weiter
zu steuern.

Für obiges, etwas einfachere Beispiel brauchste:

function StartCountdown(_Limit, _Callback, _Show)
   assert(type(_Limit) == "number")
   assert( not _Callback or type(_Callback) == "function" )
   Counter.Index = (Counter.Index or 0) + 1
   if _Show and CountdownIsVisisble() then
   assert(false, "StartCountdown: A countdown is already visible")
   end
   Counter["counter" .. Counter.Index] = {Limit = _Limit, TickCount = 0, Callback = _Callback, Show = _Show, Finished = false}
   if _Show then
   MapLocal_StartCountDown(_Limit)
   end
   if Counter.JobId == nil then
   Counter.JobId = StartSimpleJob("CountdownTick")
   end
   return Counter.Index
end
function CountdownTick()
   local empty = true
   for i = 1, Counter.Index do
   if Counter.IsValid("counter" .. i) then
   if Counter.Tick("counter" .. i) then
   Counter["counter" .. i].Finished = true
   end
   if Counter["counter" .. i].Finished and not IsBriefingActive() then
   if Counter["counter" .. i].Show then
   MapLocal_StopCountDown()
   end
   if type(Counter["counter" .. i].Callback) == "function" then
   Counter["counter" .. i].Callback()
   end
   Counter["counter" .. i] = nil
   end
   empty = false
   end
   end
   if empty then
   Counter.JobId = nil
   Counter.Index = nil
   return true
   end
end
function CountdownIsVisisble()
   for i = 1, Counter.Index do
   if Counter.IsValid("counter" .. i) and Counter["counter" .. i].Show then
   return true
   end
   end
   return false
end


Getestet und funktioniert.

____________________
Take a Nudelholz und hau it on the Kopp of a bekloppt Person .... to give you a better Gefühl than vorher.

nevermind
Siedler Map Source Admin (Web)
#7
05.08.2010 18:19
Beiträge: 483

Zitat von Flodder:
Das rolay selbst wird für Deine Zwecke also nicht gebraucht, ist aber eine unglaublich vielseitige Funktion, die für alles mögliche gebraucht werden kann.



Was kann ein "Rolay" was ein Countdown nicht kann? Mal abgesehen davon, das ein "Rolay" auch mit HiRes laufen kann.

Antwort liefere ich mal selbst, korrigiert mich bitte wenn ich falsch liege.

1. Der Rolay kann rückwärts zählen.
Mal eine dumme(?) Frage: Was bringt mir das? Ob ich nun von 0 bis 100 oder von 100 bis 0 zähle ist doch so ziemlich egal, die Zeit die vergeht ist die selbe.

2. Der Rolay kann auch +5 oder -3 oder wie es einem beliebt zählen.
Noch 'ne dumme(?) Frage: Was bringt mir das? Wenn ich von 0 bis 100 in 5er Schritten zählen will, dauert das genauso lange wie wenn ich von 0 bis 20 zähle.

3. Der Rolay kann jede Sekunde eine "action" Funktion aufrufen.
Dumme(?) Frage: Was bringt mir das? Da kann ich diese action Funktion doch gleich als eigenen SimpleJob starten.

4. Der Rolay hat eine sonderAction.
Und wieder dumme(?) Frage: Was bringt mir das? Kann ich auch mit zweimal StartCountdown() und weniger Aufwand machen.

Mein persönliches Fazit: Ich sehe nicht, warum der "Rolay" so viel vielseitiger ist als ein Countdown. Ich sehe lediglich, dass die Verwendung des "Rolay" dank der table-Syntax und mangelnder Dokumentation nur umständlich zu verwenden und schwer verständlich ist.

Überzeugt mich vom Gegenteil.

____________________
LUA_ERRSYNTAX: [string "?"]:1: `=' expected near `<eof>'

Seiten: 1

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

Impressum