Wieder eines dieser schrecklichen Probleme, an die man sich zeitraubend Schrittchen für Schrittchen herantasten muss Warum nur?!
Ich möchte doch NUR ein kleines Alert-Fenster aufpoppen lassen, und zwar exakt (!!!) in der Mitte des Bildschirms.
Theoretisch habe ich die Lösung gefunden:
local screen = api.gui.util.getById("mainView")
--local parent = screen:getParent() -- @ eis_os: Auch das habe ich probiert, und die komplette tpfui._getRoot-Funktion, alles vergeblich :-(
--while(parent) do
-- screen = parent
-- parent = screen:getParent()
--end
local screenSize = screen:getContentRect()
state.window = api.gui.comp.Window.new(_("alertboxTitle"),api.gui.comp.TextView.new(_("alertboxText")))
state.window:addHideOnCloseHandler()
state.window:setIcon(icon or "ui/icons/windows/attention.tga")
state.window:setId(winId)
local newSize = api.gui.util.Size.new(500,150)
state.window:setSize(newSize)
print ("screen size", screenSize.w, screenSize.h)
local x = math.floor((screenSize.w - 500) * .5 +.5)
local y = math.floor((screenSize.h - 150) * .5 +.5)
state.window:setPosition(x, y)
game.gui.playSoundEffect("attention")
Alles anzeigen
Aber nur theoretisch ...
Das Fenster klappt auch. Aber nur in der Auflösung 1920 x 1080 liegt es in der Mitte. Wähle ich z.B. meine Standardgröße 2560 x 1440, liegt es zu weit rechts. Wenn man die Gegenprobe macht und das Fenster einmal am rechten Rand ausrichtet (also screenSize.w - 500), liegt es nicht am rechten Rand, sondern überschreitet ihn. Daraus ist zu folgern, dass die GUI-Grundfläche kleiner sein muss als die Bildschirmauflösung, aber gleichzeitig über sie hinausläuft. Aber eben nicht in allen Auflösungen. Was ist da los - und wie bekomme ich den richtigen Wert? Oder ist das einfach nur ein böser Bug? Wobei es in den hauseigenen UG-Routinen ja zu funktionieren scheint, denn die Ingame-Fenster (z.B. die Warnmeldung oben im Spielfenster) werden exakt zentriert.
Und nein, es hat nichts mit Vulcan und OpenGL zu tun, hab ich auch schon getestet.