Lichtkreis simulieren?

  • #1, by tutnichtwehTuesday, 01. August 2017, 22:02 7 years ago
    Ich würde gern eine Art Lichtkreis simulieren um darzustellen wie eine Fackel einen Raum "dynamisch" beleuchtet.

    Die einfachste Möglichkeit wäre sicher, eine Overlay-Grafik zu erstellen, welche den Charakter (der die Fackel hält) verfolgt.

    Gibt es eine einfache Möglichkeit das umzusetzen?

    Newbie

    11 Posts


  • #2, by constantinWednesday, 02. August 2017, 07:59 7 years ago
    hallo
    du könntest das vielleicht mit den shader effects machen. 

    dafür müsstest du das main script als definition script definieren. ich weiß aber nicht genau, wie man eine fackel oder ein flackern simulieren kann. 

    liebe grüße,
    constantin

    Forum Fan

    167 Posts

  • #3, by constantinWednesday, 02. August 2017, 07:59 7 years ago
    hallo
    du könntest das vielleicht mit den shader effects machen. 

    dafür müsstest du das main script als definition script definieren. ich weiß aber nicht genau, wie man eine fackel oder ein flackern simulieren kann. 

    liebe grüße,
    constantin

    Forum Fan

    167 Posts

  • #4, by constantinWednesday, 02. August 2017, 08:00 7 years ago

    der link oben ist falsch dargestellt. es sollte kein abstand zwischen "Shader_" und "(CMS)" sein, dann funktioniert er.

    Forum Fan

    167 Posts

  • #5, by esmeraldaWednesday, 02. August 2017, 09:15 7 years ago
    Eine weitere Möglichkeit wäre, für den Charakter ein zweites Outfit anzulegen, in dem Fackel und Fackelschein enthalten sind und dann das Outfit zu wechseln, wenn der Charakter die Fackel trägt. Wäre vermutlich nicht ganz so effektvoll wie mit Shader.

    Edit:
    In dem Thread geht es um den Shader und das Script für eine Taschenlampe, das lässt sich vielleicht anpassen.

    https://www.visionaire-studio.net/forum/thread/flashlight-no...

    Key Killer

    514 Posts

  • #6, by MachtnixWednesday, 02. August 2017, 13:20 7 years ago
    Ich habe Taschenlampeneffekt mit einer „Lightmap“ oder einem halbtransparenten Bild gemacht: ein doppelt so breites, halbtransparentes  Graustufenbild mit einem Loch wird per Lua an den Charakter „geschweißt“ (setPosition o.ä.). Dadurch ist um die Figur immer ein ovalen Lichtfleck. Doppelt so breit ( und doppelt so hoch) wie Kulisse deshalb, weil die Figur das Bild quasi über den Rand mitnimmt. 

    Lichtkegel habe ich noch nicht hingekriegt, weil beim Richtungswechsel auch die Lichtrichtung angepasst werden muss. 

    Thread Captain

    1097 Posts

  • #7, by tutnichtwehWednesday, 02. August 2017, 20:06 7 years ago
    Danke Constantin Göttfert und esmeralda - Shader werde ich mir bei Gelegenheit mal anschauen. Ich vermute das ist nochmal ein ganz eigenes "Kapitel", daher werde ich wahrscheinlich erstmal eine einfachere Methode verwenden.

    für den Charakter ein zweites Outfit anzulegen
    Das war meine erste Idee. Erschien mir aber, ob der vielen Bilder die meine Charakteranimationen schon jetzt beinhalten, zu umständlich.


    Ich habe Taschenlampeneffekt mit einer „Lightmap“ oder einem halbtransparenten Bild gemacht
    Danke Machtnix! Exakt so hatte ich mir das vorgestellt und hätte es genauso gelöst! Hast du vielleicht ein Codeauschnitt für mich? (Abfrage Charposition würde reichen)
    Bin noch sehr neu in LUA, und einiges, was ich ausprobiert habe, hat nicht geklappt. Und das obwohl ich nicht zum ersten mal etwas programmiere. Kann es sein das Visionaire in verschiedenen Versionen auch unterschiedliche LUA-Versionen verwendet und so gewisse Tutorials/Codeschnipsel nicht mehr "aktuell" sind. Oder zu aktuell für "meine" Vis4.2.5?

    Lichtkegel habe ich noch nicht hingekriegt, weil beim Richtungswechsel auch die Lichtrichtung angepasst werden muss.
    Da hab ich doch glatt eine Idee. smile

    Bei Mausklick (für Bewegung) die Position von Maus und Charakter abfragen.
    Positionen "vergleichen" und je nachdem die Grafik spiegeln. Oder halt verschiedene Grafiken laden.

    Müsste doch funktionieren oder?


    Vielen Dank für eure Antworten!


    Newbie

    11 Posts

  • #8, by MachtnixWednesday, 02. August 2017, 20:22 7 years ago
    Code werde ich suchen, wenn ich wieder in Windows bin. Den Lichtkegel nach links und rechts könnte man verhältnismäßig leicht schaffen, aber bei acht Winkeln wird's kompliziert. Auch deshalb, weil der Lichtkreis mind. einmal HINTER der Figur liegen muss. 

    Thread Captain

    1097 Posts

  • #9, by tutnichtwehThursday, 03. August 2017, 02:15 7 years ago
    Okay, ich habs damit auch nicht so eilig.
    Hm stimmt, kommt halt drauf an wie komplex man das machen will.

    EDIT: Ich muss mich dringend mit LUA auseinandersetzen, das Actionpartgeklickere macht mich wahnsinnig.

    Newbie

    11 Posts

  • #10, by MachtnixThursday, 03. August 2017, 21:10 7 years ago
    -- dieses Script wird bei Kulissenbeginn alle 200 ms abgefragt
    
    
    
    Elfe_Taschenlampe = getObject("Characters[Elfe]"):getPoint(VCharacterPosition)
    
    
    
    Obj_Kegel = getObject("Objects[Lichtstrahl_rechts]")
    
    Pos_Kegel = getObject("Objects[Lichtstrahl_rechts]"):getPoint(VObjectPosition)
    
    
    
    x_pos = Elfe_Taschenlampe.x  --Position der (aktiven) Spielfigur
    
    y_pos = Elfe_Taschenlampe.y
    
    
    
    -- bis hier ok, Drehung (Wechsel auf links) klappt noch nicht, Grund: nur Abfrage der Position, nicht der Richtung!
    
    
    
    Pos_Kegel.x = x_pos - 500 -- Position des Lichtkegels, angepasst auf Szene
    
    Pos_Kegel.y = y_pos - 600
    
    
    
    Obj_Kegel:setValue(VObjectOffset, {x=Pos_Kegel.x,y=Pos_Kegel.y}) -- Setzt das Lichtkegelbild auf die Position der Figur


    Schnell mal zusammengschustert (aus allen möglichen Einzelteilen...):

    Ich frage die Position der Spielfigur ab, übertrage die beiden Werte x und y in zwei Variablen und benutze die Variablen für die Position des halbtransparenten PNG-Lichtbildes.

    Eigentlich total simpel, aber bei Lua muss man eben erst alle Objekte bekanntmachen (mit get) und dann wieder neu setzen (mit set). Deswegen kann der Editor durchaus bequemer sein, weil einem diese Arbeit vorher von den Entwicklern abgenommen wurde... smile  Deshalb finde ich das "Aktionpart-Geklicke" nicht schlimm. Wenn man erst zehn Objekte und deren Eigenschaften miteinander verquicken muss, weiß man, wie nervig Lua sein kann... wink

    Sieht aber sch.... aus, weil der ovale Lichtkegel immer gleich bleibt und z.B. an der Wand einfach blöd aussieht. Deshalb habe ich diese Lösung nicht weitergeführt.
    Etwas besser geht es, wenn man einen dreieckigen Lichtkegel (ausgehend von der Figur) benutzt; dann fallen geometrische Unstimmigleiten nicht so ins Gewicht. Insgesamt ist diese Methode zwar einfach, funktioniert aber nur bei links-rechts wirklich gut.
    Als Kompromiss benutzte ich dann zwei Szenenbilder - ein dunkles und ein helles. Klar, das ist kein echtes "Taschenlampenlicht", aber Shader kann ich in 4.2.5 noch nicht benutzen. So richtig glücklich bin ich mit keiner Lösung.

    Datei von filehorst.de laden

    Thread Captain

    1097 Posts

  • #11, by tutnichtwehFriday, 04. August 2017, 19:49 7 years ago
    Vielen Dank erstmal, für deine ausführliche Antwort!

    Ich hab den Code an mein Projekt angepasst aber leider funktioniert es nicht wie gewüscht.
    Da die Größe der Grafik doppelt so groß sein müssen, wie die Kulisse, geh ich davon aus, dass die Werte hinter dem Minus

    Pos_Kegel.x = x_pos - 500 -- Position des Lichtkegels, angepasst auf Szene
    
    Pos_Kegel.y = y_pos - 600


    auf die Größe der Kulisse gesetzt werden müssen um auf den Charakter zentriert zu sein, oder?

    Zur Zeit verschiebt sich die Grafik weder, wenn ich diese Werte änder, noch wenn sich der Charakter bewegt.

    Die Aktion wird bei mir durch die Startaktion das erste Mal ausgeführt. Der "FGD_light_spot" ist ein simples Objekt, welches als Bild meine Overlay-Grafik verwendet.

    Was hab ich da falsch gemacht?

    ---------

    Deswegen kann der Editor durchaus bequemer sein, weil einem diese Arbeit vorher von den Entwicklern abgenommen wurde...
    Der Editor ist super, für das was er leistet! Das erspart wirklich eine Menge Arbeit. Vor allem auf das Ressourcenmanagement hätte ich keine Lust.
    Wenn man allerdings bei Befehlen wie:

    getObject("ActiveAnimations[animation name]"):setValue(VAnimationLastFrame, 1)
    

    anstelle einzelner Zahlen am Ende (um den Frame anzugeben), auch eine Variable verwenden kann, finde ich das sehr viel leichter als stattdessen eine verschachtelte If-Else Struktur zusammen zu klickern.


    ---------
    Sieht aber sch.... aus
    An das Problem mit den Wänden hab ich bisher noch gar nicht gedacht - aber das sieht dann natürlich wirklich  nicht so toll aus...
    Sind Projekte nicht aufwärtskompatibel, oder warum wechselst du nicht zu Vis5, sollten Shader dort möglich sein?

    Hübsche Elfe hast du da! wink

    Newbie

    11 Posts