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

  • #20, by sebastianFriday, 13. April 2018, 13:12 6 years ago
    Bin mir ziemlich sicher, dass ihm die Font nun fehlt anhand er die dimension berechnen soll.
    Bei mit funtioniert folgendes:

    function test()
      graphics.font = Fonts[6]
      local txt = "Zeile1\nZeile2\nZeile3"
      local dim = graphics.fontDimension(txt) 
       
      print(dim.x,dim.y)
    end

    Thread Captain

    2346 Posts


  • #21, by esmeraldaFriday, 13. April 2018, 14:24 6 years ago
    Sorry, ich bin leider ein echter Lua-Dödel. Wie rufe ich die Funkton auf?

    Ich hab sie so eingebaut -> Bild

    Aber ich bekomme immer als Höhe 28 angezeigt (das entspricht meiner Fonthöhe von 25 + 3 Zeilenabstand. Bzw anderen einzeiligen Höhen, wenn andere Fonts angebe)
    Definiere ich txt = "Zeile1\nZeile2\nZeile3" ist die Anzeige 76  28
    bei txt = "Zeile1" bekomme ich 68  28 

    Siehst du, was ich falsch mache?


    Edit: ah ok, aufrufen mit execute script  "test(text)"  aber gleiches Ergebnis 

    Key Killer

    508 Posts

  • #22, by sebastianFriday, 13. April 2018, 15:25 6 years ago
    Sorry, ich bin leider ein echter Lua-Dödel. Wie rufe ich die Funkton auf?

    Ich hab sie so eingebaut -> Bild

    Aber ich bekomme immer als Höhe 28 angezeigt (das entspricht meiner Fonthöhe von 25 + 3 Zeilenabstand. Bzw anderen einzeiligen Höhen, wenn andere Fonts angebe)
    Definiere ich txt = "Zeile1\nZeile2\nZeile3" ist die Anzeige 76  28
    bei txt = "Zeile1" bekomme ich 68  28 

    Siehst du, was ich falsch mache?


    Edit: ah ok, aufrufen mit execute script  "test(text)"  aber gleiches Ergebnis 

    Die testfunktion habe ich jetzt komplett ohne hook genutzt, sondern nur per test() ausgefüllt. Dann gibt es natürlich auch keinen Eigentümer.
    Ich habe jetzt für den Schnellen Test die Funktion folgendermaßen angepasst:

    Eigenes Definition script. Inhalt:
    function test(text)
      graphics.font = Fonts[6]
      local dim = graphics.fontDimension(text) 
      print(dim.x,dim.y)
    end

    Du kannst also den String direkt in der Konsole angeben:
    test("zeile1") <return></return></div>
    test("zeile1\nzeile2") <return></return></div>
    test("zeile1\nzeile2\nzeile3") <return></return></div>

    Thread Captain

    2346 Posts

  • #23, by esmeraldaSaturday, 14. April 2018, 19:19 6 years ago
    Ich habe - denke ich - es genauso gemacht wie du. (Vielen Dank für das schöne Erklärvideo :-) die Execute Lua Funktion hatte ich noch nie genutzt)
    Das Script ist genau das gleiche. Und verschiedene Fonts hab ich auch ausprobiert (otf, ttf und bitmap). Aber es bleibt dabei, ich bekomme immer die gleiche Höhe.

    (wollte ein Gif anhängen, aber das wird nicht abgespielt, wenn ich es als image hochlade - was ja auch Sinn macht)

    dann ein paar Bilder:

    Key Killer

    508 Posts

  • #24, by sebastianSunday, 15. April 2018, 00:05 6 years ago
    (mal in englisch. gegebenenfalls haben Andere auch noch eine Idee) 

    im really not sure what can cause this then.
    Could you try to reactivate your textstarted text hook and print(text.CurrentText) ?
    This would print a real spoken text to the console.
    Try to use a display character text where you inserted manual line breaks and see how this looks like in the console. Maybe linebreaks are handled different under windows.

    Thread Captain

    2346 Posts

  • #25, by klockbox-1Friday, 20. April 2018, 14:29 6 years ago
    Hi Leute!

    Ein Update meinerseits nochmal.
    Ich habe mit Esmeraldas Script die Funktionen erhalten, die ich gesucht habe. Der Text hat jetzt immer einen schönen Minimalabstand zum Rand. Ich habe noch auf euren Hinweis hin eine Liste eingebaut, in der ich die Charaktergrößen eintragen kann, auch wenn die zugegebenermaßen recht unelegant ist (Geht das auch smarter?). Außerdem habe ich noch den Abstand zum Bildschirmrand durch eine Variable ersetzt, die immer ein Fünfzigstel von der Gesamtbreite groß ist, damit das auch bei anderen Auflösungen funktionieren sollte.
    Mit dem Font habe ich glücklicherweise keinerlei Probleme.

    Also nochmal vielen Vielen Dank, dass ihr das so ausführlich Duskutiert hat, so dass ich auch als Anfänger etwas verstehen konnte! smile
    function adaptedTextPosition(text)
      -- show texts min 10 pixel inside the window
     
    if text.Owner:getId().tableId == eCharacters then
    
    -- setup the vars (savezone is 10 px around the spoken text)
    local txt = text.CurrentText:gsub(";","\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
    local leb  -- left border of the text
    local rib  -- right border of the text
    local char_size -- variable for the character size
    local text_safezone -- Sets a distance realtive to the screen width
    
    -- sets the value for the text safezone
    
    text_safezone = game.WindowResolution.x / 50
    
    -- sets char size to the size of the character that is talking
    
    if text.Owner == Characters.Jasper then
    char_size = 776
    elseif text.Owner == Characters["Jasper (Tisch)"] then 
    char_size = 320
    
    elseif text.Owner == Characters.Bauarbeiter then
      if Characters.Bauarbeiter.Outfits == Characters.Bauarbeiter.Outfits.Standard then
      char_size = 854
      elseif Characters.Bauarbeiter.Outfits == Characters.Bauarbeiter.Outfits.Sitzend then
      char_size = 548
      end
    
    elseif text.Owner == Characters.Ferdinand then 
    char_size = 590
    
    end
    
    -- set textbox position. Dont allow the textbox to be displayed out of the game window
    
    rib = pos.x+(dim.x/2)+text_safezone
    leb = pos.x-(dim.x/2)-text_safezone
    
    if leb  game.WindowResolution.x then
    pos.x = pos.x - (rib - game.WindowResolution.x)
    
    else
    end
    
    -- position on y-axis needs adjustments depending on actual size in px
    pos.y = pos.y-(char.Size * char_size / 100)-dim.y-5 --set it 20px higher than the character size
    if pos.y <= 0 then pos.y=0 end
    
    text.Position = pos    -- set text position
    
        return true 
      end
     return false
    end
     
    registerHookFunction("setTextPosition", "adaptedTextPosition")
    

    Newbie

    27 Posts

  • #26, by esmeraldaFriday, 20. April 2018, 19:17 6 years ago
    Du kannst auch in der Engine bei jedem Charakter einen Wert anlegen, den du jeweils char_size nennst. Dann brauchst du nicht im Scipt immer nachtragen, wenn du einen neuen Charakter einbaust. Finde ich persönlich einfacher.
    Dann kannst du deine Abfragen bezüglich der Charaktere streichen, die Definition von char_size im Script auch streichen und die y-Position mittels der Variable berechnen:

    pos.y = pos.y-(char.Size * char.Values["char_size"].Int / 100)-dim.y-20 --set it 20px higher than the character size (size in percent)

    Heißt, du hattest keine Probleme mit dem Font, dass bei dir mehrzeilige Texte richtig positioniert werden? Dann liegt der Fehler wohl definitiv bei mir...


    Hab Sebastians Vorschlag mal ausprobiert. Es wird tatsächlich der Text mit
    ausgegeben, nicht mit \n. Da scheint die Umwandlung nicht zu funktionieren.

    Edit (Korrektur): die Zeilenberechnung funktioniert bei mir doch mit Bitmap-Font (auch wenn der Schnelltest mit dem Execute Lua test("zeile\nzeile2") usw. das falsche Ergenis ausspuckt. Mit otf und ttf geht es nicht.



    Key Killer

    508 Posts

  • #27, by sebastianFriday, 20. April 2018, 21:54 6 years ago
    grad mal n bisschen rumgetestet wie man die Größe des Sprites bekommt ohne eine Extra Variable anlegen zu müssen:

    print(graphics.getAnimationSize(game.CurrentCharacter).y) 

    sollte die Höhe der momentangezeigten Charaktergrafik des spielbaren Charakters ausgeben.
    Also eingebaut in die Formel und für den aktuell sprechenden Charakter:
    pos.y = pos.y-(char.Size * graphics.getAnimationSize(char).y / 100)-dim.y-20 

    Thread Captain

    2346 Posts

  • #28, by klockbox-1Sunday, 22. April 2018, 00:07 6 years ago
    @Esmeralda Hmm. Das wäre wirklich weitaus eleganter gelöst. Ich werd vorher aber nochmal den neuen Lösungsansatz von Sebastian ausprobieren.
    Das mit dem Font tut mir Leid, das hatte ich nicht richtig gelesen. Wir haben in unserem momentanen Projekt keine mehrzeiligen Texte, deswegen kann ich da meinen Erfahrungswert wohl nicht beisteuern.

    @Sebastian Das werd ich auf jeden Fall ausprobieren. Hört sich vielversprechend und am angenehmsten an.

    Newbie

    27 Posts

  • #29, by klockbox-1Monday, 23. April 2018, 14:24 6 years ago
    Hi.
    Nochmal ein kleiner Nachtrag von mir.
    Vorneweg die Frage: Ist meine Liste im Script selber ein Problem, bzw. würde die Liste das Programm unnötig bremsen, weil die Liste relativ lang ist?
    Zunächst gibt
    "graphics.getAnimationSize(game.CurrentCharacter).y" (und game.text.Owner klappt nicht)
    immer die Größe des aktiven Charakters aus, was bei den Dialogen immer wechseln müsste, damit das Script greift. Dazu kommt, dass ich den ansatz mit den eigenen Werten nützlich finde, da manche Charaktere bei uns mit Objekten verbunden sind, die größer als die eigentliche Figur sind, wodurch der Text eigentlich zu hoch gesetzt werden würde.
    Außerdem habe ich bei dem Charakter Bauarbeiter das Problem, dass seine beiden Outfits unterschiedlich groß sind, sprich da brauch ich zwei Werte, die ich abrufen muss, was ich persönlich einfach mit der Auflistung finde.
    Also wenn die Liste kein Problem darstellen sollte, würde ich die einfach so lassen und dann die neuen Charaktere einfach nachtragen.

    Newbie

    27 Posts

  • #30, by klockbox-1Monday, 23. April 2018, 14:24 6 years ago
    Hi.
    Nochmal ein kleiner Nachtrag von mir.
    Vorneweg die Frage: Ist meine Liste im Script selber ein Problem, bzw. würde die Liste das Programm unnötig bremsen, weil die Liste relativ lang ist?
    Zunächst gibt
    "graphics.getAnimationSize(game.CurrentCharacter).y" (und game.text.Owner klappt nicht)
    immer die Größe des aktiven Charakters aus, was bei den Dialogen immer wechseln müsste, damit das Script greift. Dazu kommt, dass ich den ansatz mit den eigenen Werten nützlich finde, da manche Charaktere bei uns mit Objekten verbunden sind, die größer als die eigentliche Figur sind, wodurch der Text eigentlich zu hoch gesetzt werden würde.
    Außerdem habe ich bei dem Charakter Bauarbeiter das Problem, dass seine beiden Outfits unterschiedlich groß sind, sprich da brauch ich zwei Werte, die ich abrufen muss, was ich persönlich einfach mit der Auflistung finde.
    Also wenn die Liste kein Problem darstellen sollte, würde ich die einfach so lassen und dann die neuen Charaktere einfach nachtragen.

    Newbie

    27 Posts