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

  • #10, 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


  • #11, by sebastianWednesday, 11. April 2018, 17:13 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'".

    sollte innerhalb einer funktion stehen, die du an den textStarted Event registrierst:

    registerEventHandler("textStarted", "mytotalcoolfunction")


    Dann musst du noch checken, ob der Text von einem Charakter stammt 

      if text.Owner:getId().tableId == eCharacters  then
      ....

    und es fehlt bei mir noch der Punkt, wo dann schlussendlich die neu berechnete Textposition angewendet wird:

    text.Position = pos

     

    Thread Captain

    2346 Posts

  • #12, by klockbox-1Wednesday, 11. April 2018, 17:24 6 years ago
    Ah okay. Das klingt machbar. Schonmal einen dicken Dank von mir. smile

    Ich meld mich nochmal, wenns klappt oder falls ich nochmal deine Hilfe bräuchte.

    Newbie

    27 Posts

  • #13, by esmeraldaWednesday, 11. April 2018, 20:30 6 years ago
    Ich poste mal zur Info mein Script, das ich aus AFRLmes und Sebastians Scripten zusammengestückelt habe. (ich weiß leider nicht, wie ich das in diese schöne Box bekomme)

    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
     
    -- set textbox position. Dont allow the textbox to be displayed out of the game window

    rib = pos.x+(dim.x/2)+10
    leb = pos.x-(dim.x/2)-10

    if leb < 0 then
    pos.x = pos.x - leb
    elseif rib > 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 * 206 / 100)-dim.y-20 --set it 20px higher than the character size (size in percent) - original size 206 px
    if pos.y <= 0 then pos.y=0 end

    text.Position = pos    -- set text position

        return true 
      end
     return false
    end
     
    registerHookFunction("setTextPosition", "adaptedTextPosition")


    Die Berechnung der savezone hab ich etwas abgeändert, die in Sebastians Script hatte ich nicht ganz verstanden...

    Mein Problem ist noch die Positionierung des Textes auf der y-Achse. mit Character.Size bekommt man nur die Größe in Prozent, basierend auf der Skalierung. Ich habe nichts gefunden, womit man die tatsächliche Größe in Pixeln abrufen kann. (In meinem Testspiel ist der Hauptcharakter 206 Pixel hoch, also habe ich das mal eingegeben.)

    Gibt es eine Möglichkeit, die aktuelle oder ursprüngliche Größe des Charakters in Pixeln abzurufen?

    Key Killer

    508 Posts

  • #14, by sebastianWednesday, 11. April 2018, 21:37 6 years ago
    Die code Zeile text.CurrentText:gsub() scheint vom Forum abgeändert zu werden. Sie sollte so innerhalb der () aussehen:

    Bei mir scheint char.Size die Größe zu kriegen, die ich brauche. Nichts in Prozent, sondern Pixel. Aber laut wiki ists wirklich %. Hmm... VIelleicht aufgrund meiner Pixelspiel größe fast Irrelevant. 

    Thread Captain

    2346 Posts

  • #15, by esmeraldaWednesday, 11. April 2018, 21:47 6 years ago
    du hast recht, der Teil hinter gsub ist beim Einfügen verändert worden.

    Ich hab für char.Size ein print ausgeführt, das hat "100" ausgespuckt - was der Skalierungsgröße in Prozent entspricht (Charaktergröße 206 px, Bildgröße 300 px)

    Bei mehrzeiliger Textausgabe zerschießt es mir übrigens die Positionierung. Liegt das an der Herausfilterung der Zeilenumbrüche? (dieses gsub(), das ich nicht kenne ;-))

    Key Killer

    508 Posts

  • #16, by sebastianWednesday, 11. April 2018, 22:22 6 years ago
    du hast recht, der Teil hinter gsub ist beim Einfügen verändert worden.

    Ich hab für char.Size ein print ausgeführt, das hat "100" ausgespuckt - was der Skalierungsgröße in Prozent entspricht (Charaktergröße 206 px, Bildgröße 300 px)

    Bei mehrzeiliger Textausgabe zerschießt es mir übrigens die Positionierung. Liegt das an der Herausfilterung der Zeilenumbrüche? (dieses gsub(), das ich nicht kenne ;-))
    ja, scheint wirklich Prozentual zu sein. Mein Glück war wohl hier, dass meine Charaktergröße annähern auch 100 Pixel ist.
    Sprich hier wäre wohl die Größe der Sprite * CharacterSize% zu nehmen um das zu korrigieren.
    "char_size" als Value bei jeder Person mit individueller Größenangabe:
    pos.y = pos.y-(char.Size * char.Values["char_size"].Int / 100)-dim.y-20 

    Die Textdimensionsfunktion funktioniert nur bei manuellen Zeilenumbrüchen, da der textstring einfach nur eingelesen wird und anhand einer Font gegengecheckt wird. Der automatische Linebreak wird nicht berücksichtigt, weil das Die Engine zusätzlich noch macht.
    Apropos Font. Die müsste eigentlich vorher auch noch festgelegt werden, damit die Dimensiorungsfunktion anhand dieser Buchstaben gecheckt wird:
    graphics.font = Fonts[fontid]
    graphics.fontDimension(txt)

    Thread Captain

    2346 Posts

  • #17, by esmeraldaWednesday, 11. April 2018, 23:00 6 years ago
    Ja, wegen der Charaktergröße hatte ich auch schon AFRLme auf Discord genervt :-)

    Netterweise musste ich den Font nicht einstellen, es wurde jedenfalls der richtige berechnet.

    Ich benutze manuelle Zeilenumbrüche. Trotzdem bekomme ich bei mehrzeiligen Text als Höhe die Höhe einer einzigen Zeile ausgeworfen. Und dementsprechend wird auch die Position zu niedrig berechnet, so dass der Text auf dem Charakter liegt. Breite dagegen funktioniert wunderbar.

    Wie machst du das bei deinen Sprechblasen? Kann man die Zeilen zählen?

    Key Killer

    508 Posts

  • #18, by sebastianWednesday, 11. April 2018, 23:18 6 years ago
    Zeilen berechnet er momentan auch nur, wenn das \n enthalten ist. Sonst denkt die Engine der Text geht einzeilig weiter.

    du solltest als test kannst du ja mal für txt "zeile1\nZeile2 " nutzen

    Thread Captain

    2346 Posts

  • #19, by esmeraldaFriday, 13. April 2018, 11:13 6 years ago
    Das scheint gar nichts zu bewirken.

    Ich habe statt lokal txt = text.CurrentText:gsub("
    ","\n") jetzt lokal txt = "Zeile1\nZeile2" eingefügt.    (oder habe ich dich missverstanden?)

    lokal dim =  graphics.fontDimension(txt)    bleibt wie zuvor
    mit  print (dim.y)    bekomme ich aber weiterhin nur den Wert der einzeiligen Höhe.

    Das mit den gleichbenannten Variablen für die Charaktergröße funktioniert übrigens wunderbar. :-)

    Key Killer

    508 Posts

  • #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