Scrollen, bezogen auf den Charakter-Pivot statt auf dem Grafik-Mittelpunkt

  • #1, by roof-cut-mediaFriday, 07. June, 14:47 A week ago
    Hallo,
    ich habe einige breite Szenen, die mit der Position des Charakters mitscrollen.
    Wenn der Charakter in der Mitte des Screens stehen bleibt und eine Stand- oder Redeanimation abgespielt wird, bei denen die Einzelframes wechseln, die alle in unterschiedlicher Grafikbreite angelegt wurden, wackelt die Kamera hin und her und versucht sich immer am Mittelpunkt des aktuellen Einzelframes zu orientieren.
    Gibt es eine Möglichkeit, die Orientierung der Kamera am Standpunkt des Charakters festzumachen statt an seiner momentanen Grafikmitte?

    Viele Grüße
    Rouven

    Newbie

    6 Posts


  • #2, by esmeraldaFriday, 07. June, 19:26 A week ago
    Mit einem Skript ginge das schon, denke ich.

    Aber grundsätzlich ist es eine gute Idee, alle Animationen eines Charakters in der gleichen Größe zu halten. Da hat man auch weniger Stress bei der Positionierung der Frames.

    Abgesehen davon die Grafiken anzupassen, sehe ich folgende Möglichkeiten:
    1. schalte die Zentrierung auf den Charakter aus, wenn der Charakter nicht läuft - automatisiert mit einen Skript.
    function disableScroll()
    
     
    
      if game.CurrentCharacter.AnimState ~= 1 then
    -- wenn der Charakter nicht läuft (1 = walk)
       game.ScrollCenterCharacter = false
    
      else
    
       game.ScrollCenterCharacter = true
    
      end
    
     
    
    end
    
    
    
    registerEventHandler("mainLoop", "disableScroll")

    (da könnte man noch eine Bedingung vorschalten, die bei Beginn der scollenden Szenen umgeschaltet wird)

    oder

    2. schalte die Zentrierung bei den scollenden Szenen mit dem Aktionsteil bei Beginn der Kulisse aus und bastle für diese Szenen ein eigenes Scrollen.
    function NewScroll()
    
      if game.ScrollCenterCharacter == false then  -- wenn Zentrieren auf Charakter ausgeschaltet ist
    
      local pos = game.CurrentCharacter.Position  -- Charakterposition speichern
    
      local scrollpos = pos.x - game.WindowResolution.x/2  -- Scrollposition auf X-Achse berechnen (obere linke Ecke des Bildschirms)
    
       if scrollpos < 0 then scrollpos = 0 end
    
       
    
       if game.ScrollPosition.x ~= scrollpos then
    
        game.ScrollToPoint = {x = scrollpos, y = game.ScrollPosition.y}  -- zur neuen Position scrollen (nur X-Achse)
    
       end
    
      end
    
    end
    
    
    
    registerEventHandler("mainLoop", "NewScroll")

    Wobei hier das Scrollen unmittelbar einsetzt, sobald sich der Charakter bewegt, ohne die sonst eingebaute Pufferzone.


    Edit: Da fällt mir ein: das Aus- und Anschalten der Zentrierung nach Lösung Nr. 1 könnte man auch ohne Skript in die jeweils ersten Frames der Lauf- bzw. Stand-Animation legen.

    Key Killer

    522 Posts

  • #3, by rouven-schumacherMonday, 10. June, 15:45 5 days ago
    Vielen lieben Dank - auch für die schnelle Anwort!

    Das Script funktioniert zwar, wie es soll, sieht aber leider sehr mechanisch aus, da die Kamera immer abrupt stehen bleibt und fertigscrollt, sobald sich der Charakter wieder bewegt (je nach Laufrichtung dann sogar entgegengesetzt).

    Ich glaube, die Lösung wäre, nicht das Scrollen der Kamera zu unterbrechen, sondern zu unterbrechen, dass die Kamera weitere Punkte geliefert bekommt, an denen sie sich ausrichtet. Dass also beim Stehen des Charakters die Kamera zum letzt gegebenen Grafik-Mittelpunkt fährt und weich fertig scrollt - und sobald der Charakter weiterläuft, die Kamera sich weiter ausrichtet.

    Kannst du mir hier bitte nochmal helfen, falls möglich?

    Newbie

    1 Posts

  • #4, by esmeraldaMonday, 10. June, 18:37 5 days ago
    Du benutzt also die Lösung Nr. 1, ok.

    Ein anderer Nutzer (Einzelkämpfer) hat eine Funktion geschrieben, mit der man checken kann, ob die Szene gerade scrollt. Wenn man diese Funktion mit einbaut und das Zentrieren nur umstellt, wenn die Szene nicht scrollt (also fertiggescrollt ist) sollte es funktionieren.

    Nur habe ich den Verdacht, dass es dann wieder Sprünge geben wird, wenn während des Fertigscrollens wieder eine Animation mit verschieden großen Frames durchgeführt wird.

    function disableScroll()
    
      if isSceneScrolling() == false then
    
       if game.CurrentCharacter.AnimState ~= 1 then
    
         game.ScrollCenterCharacter = false
    
       else
    
         game.ScrollCenterCharacter = true
    
       end
    
      end
    
     end
    
    
    
    registerEventHandler("mainLoop", "disableScroll")
    
    
    
    
    
    
    
    -- Call "isSceneScrolling()" to check if a scene is currently scrolling
    
    
    
    is_scrolling_h = false
    
    is_scrolling_v = false
    
    last_scene = game.CurrentScene
    
    last_pos = game.ScrollPosition
    
    
    
    function checkScrolling()
    
      cur_scene = game.CurrentScene
    
      cur_pos = game.ScrollPosition
    
    
    
      if cur_scene == last_scene then
    
        is_scrolling_h = (cur_pos.x ~= last_pos.x)
    
        is_scrolling_v = (cur_pos.y ~= last_pos.y)
    
      else
    
        last_scene = cur_scene
    
        is_scrolling_h = false
    
        is_scrolling_v = false
    
      end
    
     
    
      last_pos = cur_pos
    
    end
    
    
    
    registerEventHandler("mainLoop", "checkScrolling")
    
    
    
    -------------------------------------------
    
    
    
    function isSceneScrolling(dir)
    
      if dir == "h" then
    
        return is_scrolling_h
    
      elseif dir == "v" then
    
        return is_scrolling_v
    
      else
    
        return (is_scrolling_h or is_scrolling_v)
    
      end
    
    end

    Key Killer

    522 Posts

Write post