return to monkey island Interface

  • #1, z daniel-kirschtFriday, 21. April 2023, 12:26 hodinky A year ago
    Hallo zusammen,

    ich möchte gerne ein Interface darstellen (bspw. return to monkey island), dass beide möglichen ausführbaren Aktionen (linke Maustaste und rechte Maustaste) bei einem Mouse Over in der object Area eines Objekts darstellt. Beide action texts sollten am Cursor haften, solange man sich in der object area mit der Maus befindet.

    Sicherlich nicht ohne LUA-Scripting zu lösen wink

    Hat jemand einen essentiellen Tipp oder gar die Lösung? 
    Idealerweise kann ich die auszugebenden Texte in Visionaire (ohne LUA) schreiben und via LUA eine Funktion definieren, die dann die beiden action texts des jeweiligen Objekts aussließt / erkennt und am cursor darstellt.

    you know? Ich hoffe, ich konnte mich klar ausdrücken, damit man das versteht smile

    Bažant

    2 Posts


  • #2, z esmeraldaFriday, 21. April 2023, 20:49 hodinky A year ago
    Hi.

    Meine erste Idee wäre, den Aktionstext mit der Draw-Funktion nachzubauen. (ich habe gerade ein Script für einen mehrzeiligen Aktiontext in einem anderen Thread geposted  ).
    Statt des Befehls und des Objektnamens könnte man den Text (evtl. vorher als String eines Wertes bei dem Object/Charakter gespeichert) anzeigen. Oder einen Table mit Namen und zugehörigen Texten erstellen und abrufen.

    Zabiják klíčů

    525 Posts

  • #3, z daniel-kirschtMonday, 24. April 2023, 07:15 hodinky A year ago
    Danke für die Unterstützung smile

    Ich habe das Script wie folgt angepasst. Ich habe es einfach nicht hinbekommen, die Values eines Objectes auszugeben. Vielleicht hat da noch jemand einen Tipp?

    Momentan nutze ich einfach weitere "Sprachen", auf die ich dann zugreife um den Text am Cursor anzuzeigen. Einmal für die linke Taste und einmal für die rechte Taste. Der Code ist sicherlich ordentlich kauderwelsch, führt jedoch auch irgendwie ans Ziel wink Für Optimierungen bin ich sehr dankbar.

    Jetzt würde ich gerne folgendes noch machen:
    1. Anstatt auf Sprachen zuzugreifen, würde ich gerne die Values eines Objektes nutzen
    2. Ein Bild bzw jeweils einen anderen Cursor vor die beiden Aktionstexte unter dem regulären Cursor darstellen
    3. Weiß jemand, warum oben links am Bildschirmrand der Text angezeigt wird? Irgendwo muss ich wohl einen Haken gesetzt haben, den ich nicht mehr finde, um es zu deaktivieren grin

    function right(obj) 
      local t = obj:getId().tableId -- store table ID belonging to the linked visOBJ
      
      local txt = game.CurrentObject.ObjectName.TextTextLanguages
      
      for i = 1, #txt do
        if txt.language == Languages["right_en"]:getId().id then
          return(txt.text )
        end
      end
    end

    function left(obj) 
      local t = obj:getId().tableId -- store table ID belonging to the linked visOBJ
      
      local txt = game.CurrentObject.ObjectName.TextTextLanguages
      
      for i = 1, #txt do
        if txt.language == Languages["left_en"]:getId().id then
          return(txt.text )
        end
      end
    end

    function draw()

    local txt = ""
    local activeCommand = left(game.ActiveCommand)
    local currentObject = right(game.CurrentObject)
    local currentObjectLines = graphics.performLinebreaks(currentObject)

    if activeCommand ~= "" then
    txt = activeCommand
    end

    local font_used = Fonts["font_main"] -- set font
    graphics.font = font_used

    local lines = graphics.performLinebreaks(txt)
    local dim = {x=0, y=0}
    local pos = getCursorPos()
    local padding = 50

    pos.y = pos.y + padding -- set y position for activeCommand text

    -- draw the text line by line
    for k,v in ipairs(lines) do
    local tempdim = graphics.fontDimension(v)
    local text_pos = {x = pos.x, y = pos.y}

    text_pos.x = pos.x -- set x position for activeCommand text, left-aligned
    text_pos.y = pos.y + (k-1) * (font_used.Size + font_used.VerticalLetterSpacing)

    if #txt > 0 then graphics.drawFont(v, math.floor(text_pos.x) , math.floor(text_pos.y), 1) end

    if k == 1 then 
      dim.x = tempdim.x -- get the dimension of the longest line
      dim.y = dim.y + tempdim.y
    else
      dim.y = dim.y + tempdim.y + font_used.VerticalLetterSpacing
    end
    end

    pos.y = pos.y + dim.y + 50 -- set y position for currentObject text, 30 pixels below activeCommand text

    if not game.CurrentObject:isEmpty() then
      for k, v in ipairs(currentObjectLines) do
        local text_pos = {x = pos.x, y = pos.y}

        if k > 1 then
          text_pos.y = pos.y + (k - 1) * (font_used.Size + font_used.VerticalLetterSpacing)
        else
          text_pos.x = pos.x + (dim.x - graphics.fontDimension(v).x) / 2 -- set x position for currentObject text, centered below activeCommand text
        end

        graphics.drawFont(v, math.floor(text_pos.x), math.floor(text_pos.y), 1)
      end
    end

    end

    graphics.addDrawFunc("draw()", 1)

    Bažant

    2 Posts

  • #4, z esmeraldaMonday, 24. April 2023, 09:08 hodinky A year ago
    Ich hab mir jetzt deinen Code nicht genauer angeschaut, aber wenn es funktioniert, ist es ja gut.

    Grundsätzlich wäre es einfacher, wenn du Discord nutzen würdest. Der VS-Server ist deutlich aktiver als das Forum hier, d.h. du würdest (wenn du dort auf englisch schreibst) deutlich mehr Feedback bekommen. (Link zum Discord ist in der News-Zeile oben und ganz unten am Seitenende) Außerdem wird dort geposteter Code nicht von einer Forensoftware zerhackt/verändert...

    Einen Value eines Objectes sprichst du über
    Objects["name_objekt"].Values["name_wert"].String   -- für den String
    Objects["name_objekt"].Values["name_wert"].Int   -- für den Integer
    an.

    Ist der Wert bei der Szene angelegt, nicht beim Objekt, ist es
    Scenes["name_der_szene"].Values["name_wert"].String

    Den Namen des Objectes bekommst du über
    game.CurrentObject:getName()

    Ein Bild kannst du auch über die draw funktion hinzufügen
    CursorSprite = graphics.loadFromFile( "vispath:gui/cursors/image_cursor.png" )
    CursorSprite.position = {x = (getCursorPos().x + X_Offset),   y = (getCursorPos().y + Y_Offset)}
    graphics.drawSprite( CursorSprite , 1.0 , 0xffffff)

    Zabiják klíčů

    525 Posts