[solved] Text - Abstand zum Bildrand/Distance to screenborders

  • #1, by klockbox-1Monday, 09. April 2018, 17:39 6 years ago
    Moin.

    Ich hätte da mal wieder ne kleine Frage.
    Und zwar wollte ich fragen ob es möglich ist für normale Sprechertexte einen minimalen Abstand zum Bildschirmrand zu definieren.
    Momentan werden längere Sätze (Zentriert über dem Charakter) bis zum mehr oder weniger exakten Bildschirmrand angezeigt, was das lesen stellenweise ein wenig anstrengend macht.

    /

    Hi!
    I'm back again with a little question.
    Is it possible to define a minimal space from the normal 'spoken' texts to the screenborders.
    Right now some of the lines (that are usually centred over the characters) are displayed to the exact borders of the screen, wich makes reading a little tiresome.

    Newbie

    27 Posts


  • #2, by constantinMonday, 09. April 2018, 20:24 6 years ago
    geht es darum, automatische zeilenumbrüche zu setzen? das kannst du bei den fonts einstellen. 

    Forum Fan

    167 Posts

  • #3, by esmeraldaMonday, 09. April 2018, 22:56 6 years ago
    Ich denke, es geht darum, dass der Text, der eigentlich zentriert wäre, nach innen geschoben wird, wenn der Charakter am Bildrand steht. Aber nur genau soweit, dass der Text genau am Bildrand endet bzw. beginnt. Wenn man hier einen Mindestabstand einstellen könnte - ich weiß leider auch nicht wie - wäre es besser lesbar und würde nicht so abgeschnitten aussehen.

    Klar kann man Zeilenumbrüche setzen (direkt im Text oder automatische im Font-Bereich), aber gerade beim Hauptcharakter, der ja meist frei herumlaufen kann, ist nicht zu vermeiden, dass der Text ab und zu direkt am Rand landet. Falls man einen Mindestabstand setzen kann, wüsste ich auch gern wie.

    Key Killer

    513 Posts

  • #4, by sebastianTuesday, 10. April 2018, 00:52 6 years ago
    Theoretisch ließe sich per lua ein Hook nutzen, der die Text-X-Position des Charakter texts +/- X setzt, sofern eine gewisse Position Unter- / Überschritten wurde.

    Im Wiki gibts schon von AFRLme ein Script zum neu positionieren. Dies müsstest du ggf. leicht anpassen. 

    Thread Captain

    2346 Posts

  • #5, by esmeraldaTuesday, 10. April 2018, 08:51 6 years ago
    Es muss ja in der Engine schon eine Funktion geben, die etwas ähnliches macht, sonst würde der Text ja nicht nach innen geschoben. Wenn man da ran käme und den Wert der Seitenbegrenzung ändern könnte, wäre natürlich ideal.

    Dein Vorschlag, die Änderung der Textposition mit einer Abfrage der Character Position zu verknüpfen hört sich machbar an, werde ich mal testen. Ich habe dabei allerdings das Problem, dass ich keinen automatischen Zeilenumbruch habe, sondern immer manuell im Text Umbrüche einfüge. Dadurch sind die Texte sehr unterschiedlich lang, da wird es schwierig, den richtigen Wert zum Verschieben zu finden.

    Key Killer

    513 Posts

  • #6, by sebastianTuesday, 10. April 2018, 09:17 6 years ago
    nene, schon die Position des Textes nutzen, welche beim starten eines Charactertextes definiert ist, nicht die Charakter Position.

    Basierend auf dem Script von AFRLme :

    local savezone

    function setTextPosHook(text)
     -- if text owner is a character then...
     if text.Owner):getId().tableId == eCharacters then

    (insert here the detection of your savezone calculation) 
      
      text.Position = {x=text.Positiin.x+savezone, y=text.Position.y
      return true
     end
    end
     
    -- let's create the event listener for handling position of displayed text
    registerHookFunction("setTextPosition", "setTextPosHook")


    In der Tat ist hier dann ein Problem in deinem Fall, dass du keine maximale Zeilenbreite hast. 
    Es gibt schon eine Methode die Dimension eines dargestellten Textstrings zu erfassen:

    www.visionaire-studio.com/luadocs/#graphics108

    Dies nutze ich zum Beispiel selbst in meinem Sprechblasen-Skript da diese momentan auch nur mit manuellen Zeilenumbrüchen sinnvoll klappen. 

    Man müsste also die Dimensions-Berechnung im obigen Skript miteinbeziehen und die Hälfte davon von text.Position.x abziehen oder draufrechnen, um den linken oder rechten Rand zu bekommen. Und diesen wiederrum gegenchecken, ob er z.B. 10px nicht unter oder überschreiten von 0 bzw. game.WindowResolution.x


    Thread Captain

    2346 Posts

  • #7, by esmeraldaTuesday, 10. April 2018, 11:23 6 years ago
    Ich denke, ich brauche schon die Charakterposition als Grundlage, sonst bekomme ich eine statische Position des Textes, basierend auf der Startposition des Charakters. (jedenfalls erscheint mir das bei meinen Tests so)

    Ich habe mal AFRLmes Script für die Textpositionierung unterhalb des Characters als Basis genommen:

    function adaptedTextPosition(text)
      -- show texts of character Hero 10 pixel below character position
      local owner = text:getLink(VTextOwner)
      if owner:getId().tableId == eCharacters and owner:getName() == 'Hero' then
        local pos = owner:getPoint(VCharacterPosition)
        pos.y = pos.y + 10
        text:setValue(VTextPosition, pos)
        return true
      end
      return false
    end
    registerHookFunction("setTextPosition", "adaptedTextPosition")

    Die Characterposition brauche ja sowieso, um abzufragen, ob sich der Charakter in der Nähe des Bildschirmrandes aufhält.

    Mit wild geschätzten Werten hatte es schonmal geklappt. Jetzt muss ich mal schauen ob ich mit fontDimension(text) was anfangen kann... 


    Vielen Dank schonmal für deine Hilfe - und ich würde mich wirklich freuen, wenn du zu den Speechbubbles ein Tutorial machst!

    Key Killer

    513 Posts

  • #8, by klockbox-1Tuesday, 10. April 2018, 14:10 6 years ago
    Oha, da scheint das Problem ja doch komplizierter zu sein als ich dachte...

    Aber schonmal danke für die Ideen, auch wenn ich zugegebenermaßen größtenteils nur Bahnhof verstehe.

    Newbie

    27 Posts

  • #9, by sebastianTuesday, 10. April 2018, 23:51 6 years ago
    Die Characterposition brauche ja sowieso, um abzufragen, ob sich der Charakter in der Nähe des Bildschirmrandes aufhält.

    Mit wild geschätzten Werten hatte es schonmal geklappt. Jetzt muss ich mal schauen ob ich mit fontDimension(text) was anfangen kann... 

    Vielen Dank schonmal für deine Hilfe - und ich würde mich wirklich freuen, wenn du zu den Speechbubbles ein Tutorial machst!

    Die Characterposition sollte auch gehen, da du nach wie vor die Fontdimension nutzt um schlussendlich die "korrekte" Position zu ermitteln:

    -- setup the vars (savezone is 14 px around the spoken text)
    local txt = text.CurrentText:gsub("<br/"..">","\n") -- get the current active text and convert the line breaks
    local dim = graphics.fontDimension(txt) -- calculate the textbox height/width depending on the text
    local char = text.Owner -- get character and
    local pos = char.Position -- his/her position  
    -- set textbox position. Dont allow the textbox to be displayed out of the game window
    pos.x = pos.x-((dim.x+14)/2)
    if pos.x game.WindowResolution.x-dim.x-14 then pos.x = game.WindowResolution.x-dim.x-14 end  
    pos.y = pos.y-char.Size-dim.y-20 --set it 20px higher than the character size
    if pos.y < 0 then pos.y=0 end


    Thread Captain

    2346 Posts

  • #10, by esmeraldaWednesday, 11. April 2018, 15:53 6 years ago
    Danke für das Script!
    Ich stelle mal wieder fest, dass ich mich deutlich mehr mit Lua beschäftigen sollte... (warum gibt es auch so viele mögliche Schreibweisen, das ist doch verwirrend!)  :p

    Key Killer

    513 Posts

  • #11, by klockbox-1Wednesday, 11. April 2018, 17:04 6 years ago
    Ich sollte mich auch langsam mal ransetzten...

    Ist das Script final bzw. kann ich das so übernehmen? Ich bekomm immer die Fehlermeldung "error 8: 'then' expected near 'game'".

    Newbie

    27 Posts