PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Lichtquellen in Kombination mit Spieler Fackel (XP)



schmoggi
19.02.2012, 20:22
Hey,

Nach langer Abstinenz melde ich mich mal wieder zurück, gleich mit einer Bitte an einen geschulten Scripter!

Es geht um folgendes:

Wie der Titel schon erahnen lässt geht es um Licht und Dunkelheit. Jeder kennt sicherlich den bekannten Licht oder Transparenten Sichtkreis um den Spieler herum. Es simuliert eine Laterne/Fackel oder jegliche andere Lichtquelle in sonstiger Dunkelheit. Mit einem Pic, wo innen eben dieser transparente Bereich ist, lässt sich sowas kinderleicht bewerkstelligen (sicher gibt es auch andere Methoden).
Nun, eine Idee die mir schon Jahre im Kopf herumschwirrte die Kombination eben aus dieser Fackel Simulation und, welch überraschung, aus anderen (ob statisch oder bewegenden) Lichtquellen wie Fackeln oder Wachen auf der Map. Wer sich noch erinnern mag, früher gab es ja nur das oder das andere, aber nicht beide gleichzeitig, zumindest anständig umgesetzt so dass Lichtquellen wirklich Bereiche erhellen.
Irgendwann nahm ich mich der Sache an und probierte ziemlich viel aus, fand am Ende auch tatsächlich eine Möglichkeit heraus, das ganze zu kombinieren. Man schaue sich bitte folgendes Beispiel an:

http://www.imagesload.net/thb/ugly2.png (http://www.imagesload.net/img/ugly2.png)

Wie funktioniert das ganze? Relativ simpel eigentlich, ich nutze da nicht den eigentlich Tint Screen Befehl für das verdunkeln, sondern simuliere stattdessen dies mit einem Picture auf SUB gestellt, welches in dem Fall gelichzeitig die Dunkelheit simuliert und die Fackel des Spielers (der transparente Bereich in der Mitte). Somite können Events, die als Lichtquellen dienen ihren Bereich erleuchten.
Allerdings hat dies zwei Haken.

1. Es ist nicht möglich die Umgebung komplett zu verdunkeln, tut man dies so gibt es auch keinen Lichtquellen mehr zusehen. Das hat wohl offensichtlich was damit zu tun, wie der Maker das ganze mit seinen Viewports, z ebenen etc. regelt.

2. Kommen zwei dieser, auf ADD stehenden, Events (Lichtquellen) zu nah aneinander heran bildet sich ein hässliches Farbkleks Spiel, wie oben rechts zu sehen.

Jedoch sind genau diese zwei Probleme, die mMn dieser Methode das Genick brechen und es, soweit man eben nicht darauf rücksicht nehmen möchte, somit nicht wirklich brauchbar machen... schade :/.
Wenn man heute mal in den weiten des Internets rumstöbert findet man einige Skripte, die genau diese simulierte Lichtspielerei bewerkstelligen, ohne Probleme wie ich sie oben beschrieben habe. Einfach gesagt, soweit ich das richtig verstehe wir da mit nem Bitmap gearbeitet, welches entsprechend die Dunkelheit ist und events oder spezifische X/Y Koordinaten geben Bereiche an, wo dieser Teil des Bitmaps entfernt wird. Wie dem auch sei, das ganze funktioniert und sieht dabei genauso gut aus. Eines davon, das Light Circle Script 1.2, ist so ein Beispiel. Jetzt steht die Frage im Raum, wieso nutze ich nicht dieses? Ganz einfach, Es ist nicht wirklich brauchbar, zumindest für den Zweck wofür ich es brauche. Das trifft auch auf andere zu, die es gibt.

Entweder sind sie "zugemüllt" mit Features wie Tag/Nacht Simulation mit Zeitangabe, Flickering, oder die Lichtbereiche werden direkt vom Skript heraus berechnet und weiß Gott was. Zusätzlich dazu sieht das angesprochene Light Circle Script nicht wirklich schön aus, da kleine quadrate in den transparenten Bereichen zu sehen sind. Also zusammengefasst, nix brauchbares für mich da. Schließlich bin ich auf YouTube auf dieses Video hier gestoßen:

Raziel Light System Script v - 1.5
- YouTube ('http://www.youtube.com/watch?v=rpfNBQiKX1w')

Und ich dachte, wow, genau das was ich brauche (auf den ersten Blick). Leider, wie es der Zufall wollte, habe ich es nach langer Suche nicht finden können. In keinem Forum, nirgends!

----------------------

Somit erstelle ich u.a. hier diesen Thread mit der Bitte, dass sich ein fähiger Skripter doch bitte dem Problem annehmen möge. Dabei habe ich mir folgende Funktionalität vorgestellt:

- Die Form der eigentlichen Lichtquelle (also beispielsweise ein Kreis oder was anderes) sollte als Quelle eine Grafik (z.B. im Ordner "Lichtform" oder Pictures etc.) haben. Das trifft auch auf die Dunkelheit (und gleichzeitig die Spielerfack in dem Fall) zu.
- Wenn ein bestimmter Buchstabe im Namen des Events steht (z.B. #), dann sollte dieses Event eine Lichtquelle sein
- Mit einem Comment am Anfang des Events sollte die Lichtquelle schließlich konfigurierbar sein... also die Stärke bzw. Transparenz.
- Weiterhin sollte es im Script (sowie auch durch ein Call Script im Spiel) einstellbar sein, wie stark die Dunkelheit ist, also auch die Transparenz.
- Die Lichtquellen sollten beweglich sein (möglichst mit z.B. ein Switch ein und ausschaltbar, das heißt die X/Y Position wird ermittelt oder nicht)

- Um Rücksicht auf die Performance zu nehmen, sollten die Lichtquellen nur gezeichnet werden, wenn auch der Spieler wirklich diese zu Gesicht bekommen kann. Das bedeutet so viel, dass besipielsweise
nur Lichter dargestellt werden, wenn Spieler X/Y so viel entfernt ist (logischerweise würde man hier 20/15 nehmen)

Danke fürs Lesen, ich hoffe auf Antworten! Wäre echt super, wenn jemand Interesse zeigen würde, bin sicher dass ich nicht der einzige bin der daran Interesse hätte.

greetz

Cornix
19.02.2012, 23:26
Ich habe für dich einen Weg, jedoch wahrscheinlich keine Lösung.
Da ich mich im Zuge meines Projektes auch dafür interessiere habe ich den Anlass genutzt um ein wenig mit dem Thema zu experimentieren.
Dabei kam ich auf eine Vielzahl von mehr und minder erfolgreichen Methoden.

Das beste was ich im optischen Sinne erreichen konnte war das angehängte Projekt. Das Ergebniss sollte dich wahrscheinlich zufriedenstellen. Allerdings muss ich es dir hier leider ein wenig versalzen denn die Methode welche ich hierfür verwendet habe ist wahrscheinlich praktisch nicht einsetzbar.

Ich untersuche periodisch ob sich eine Lichtquelle bewegt hat, hat sie sich bewegt muss ein neues Bitmap erstellt werden was die neue Schattensituation wiederspiegelt.
Dafür nehme ich zunächst ein komplett weises Bitmap über die Größe des Bildschirms und kopiere dann schwarze Lichtquellen auf das Bitmap an den entsprechenden Position, das resultierende Bitmap lege ich dann mit einem Sprite mit negativem Blending über den Bildschirm. Optisch siehts fantastisch aus wie ich finde, allerdings sollte man auf die Performance nicht stolz sein denn im schlechtesten Fall müsstest du in jedem Frame ein 640x480 Bitmap erstellen und darauf auch noch mehrere Kopier-Operationen ausführen um die Lichtquellen darzustellen.
Mit mindestens 10 fps dauerhaftem Verlust kann man da schon rechnen und das ist einfach ein viel zu hoher Preis.

Ich werde vielleicht demnächst noch weiter darüber nachdenken was man machen kann, für Heute allerdings gebe ich es auf.

schmoggi
19.02.2012, 23:54
Hey,

Danke schonmal für die Antwort. Hmm, ja, hört sich ja nicht so berauschend an. Ein Screenshot hätte übrigens vollkommen gereicht, mehr als das zeigt mir das verschlüsselte Projekt ja auch net an ;).

Ich kann ja mal zu eine weitere Skriptlösung verlinken, um sich mal aus interesse anschauen zu können, wie das andere so gemacht haben : http://www.hbgames.org/forums/viewtopic.php?f=11&t=74494

Das ist son Ding,was wirklich passen würde, wäre net dieser ganze Quatsch mit dem Tag/Nacht Gedöns, bewegliche Quellen gibt es auch nicht. Die Ideal Vorstellung ist das von mir verlinkte You Tube Video, das sieht super aus!
Es ist aufjedenfall möglich, soviel steht ja schonmal fest. Es ist eben eine Sache des "wollens" sich mit sowas auseinander zu setzen. Ich bin ja offensichtlich nicht der einzige, der an sowas interessiert ist. Ich fänds echt klasse, wenn sich jemand (oder auch gern mehrere) an sowas probieren würden, ich denke an fähigen Skriptern wird es nicht mangeln :D.

greetz

Cornix
20.02.2012, 00:58
Ich habe mir das Script einmal schnell angeguckt, das ist im Grunde das selbe was ich getan habe. Ich würde allerdings nicht raten es zu benutzen da man an vielen Stellen erkennen kann, dass ineffizient gearbeitet wurde.
Nicht schlampig, es hat schon ganz gute Qualität und funktioniert sicher auch, allerdings ist die Art und Weise wie einiges gemacht wurde nicht optimal.

Trotzdem, wie es aussieht ist es das gleiche vorgehen. Vielleicht kann ich eine nutzbare Demo ausarbeiten, aber nicht heute denke ich.

schmoggi
20.02.2012, 14:05
Hey,

Hmmm, klingt ja interesannt. Vllt. Hilft das hier auch noch weiter, ist das erwähnte light circle script, dieses hat auch bewegende lichtquellen : http://www.hbgames.org/forums/viewtopic.php?f=11&t=63866&sid=e220984ff75ad90d8c274e66d8a031aa

Beim youtube video sieht man (zumindest auf den ersten blick) dass das prima funktionieren kann ohne zu laggen, wenn odentlich umgesetzt.

greetz

Cornix
20.02.2012, 19:52
Hier ist eine schnelle Skizze was man damit machen kann. "Relativ" effizient und einfach zu bedienen.
Was man ändern kann ist die Stärke der einzelnen Lichtquellen und die generelle stärke der Lightmap selbst. Die generelle stärke der Lightmap kann ohne Probleme zu jedem Zeitpunkt verändert werden, die Stärke einzelner Lichtquellen wäre recht Zeitintensiv von der Arbeit her.
Hier allerdings in diesem Projekt sind diese Funktionen noch nicht eingebaut.

Außerdem gibt es noch keine sich bewegenden Lichtquellen, das wäre von der Performance her eine ziemliche Bremse.

Ich habe zwar eine Idee wie bewegliche Lichtquellen mit diesem System vielleicht umzusetzen wären, allerdings wäre das ganze Prozedere relativ kompliziert. Man müsste nämlich für jede Lichtquelle welche sich bewegt hat, hoffentlich nur eine in den meisten Fällen, überprüfen welche anderen sich Lichtquellen vor der Bewegung mit dieser überschnitten haben. Falls sich welche überschnitten haben sollten müsste die Lightmap an dieser Stelle nämlich neu berechnet werden.
Im Moment geht es nur die gesamte Lightmap auf einmal zu erstellen was zu viel Arbeit ist als dass man diesen Prozess in jedem Frame einmal ausführen könnte.

schmoggi
20.02.2012, 23:38
Hey,

Ich habs mir mal angeschaut... sieht ja eigentlich auf den ersten Blick nicht schlecht aus (oder?), also ich finde zu leistest klasse arbeit ^^ (hier müssten sich noch mehr rgss gurus dazu gesellen). Das Ding ist nun der Lichtkegel für den Spieler selber (der ja auf dem Spieler bleiben sollte beim laufen). MMn könnte darauf momentan Priorität gelegt werden und nicht zu vergessen das darstellen der Lichter, die auch nur wirklich vom Spieler gesehen werden können (Performance schub). Bewegbare Events (NPC'S etc.) können hinten dran.

Ich empfehle dir auch nochmal das Skript dir anzuschauen http://www.hbgames.org/forums/viewto...274e66d8a031aa
Vielleicht kannst du daraus schlüsse ziehen, wie du es vielleicht performanter gestalten kannst, gerade auf die bewegenden Lichtquellen bezogen (in diesem Skript gibt es ja welche).

greetz

Mort_
21.02.2012, 12:20
mh.. interessant.. ich werd den Thread hier auf jeden Fall weiter verfolgen..

ich hab leider auch noch keine Möglichkeit gefunden, wie man bewegliche Lichtquellen in Kombination mit drumherum abgedunkeltem BIldschirm erzeugen könnte..
Eine Lightmap wird wohl grundsätzlich keine optimale Lösung sein - wie Cornix schon erwähnte, würde es mit massiven FPS Verlusten verbunden sein, wenn die Lightmap dauernd neu gezeichnet werden müsste..
Das Light Circles Script scheint dieses Problem mehr oder weniger zu umgehen, indem es eben diese gerasterten Lichteffekte erzeugt.. (was schneller geht) Das Ergebnis ist aber leider nicht sonderlich schön..
Man müsste also einen anderen Weg finden, die Lightmap möglichst "sparsam" neu zu zeichnen.. Cornix Idee, einfach nur an der Stelle zu überarbeiten, an der sich ein Lichteffekt bewegt hat, wäre einen Versuch wert.. Das dürfte für dein Problem, mit nur einer beweglichen Lichtquelle, wahrscheinlich sogar gut funktionieren.. Bei mehreren beweglichen Quellen wird das aber wahrscheinlich wenig sinnvoll sein. Die Überprüfung vorher, welche Bereiche denn nun neu gezeichnet werden müssen, werden dann wohl (inklusive der Neuzeichnung der entsprechenden Bereiche) aufwendiger, als wenn man einfach alles neu zeichenn lässt..

Vielleicht gibs auch noch nen ganz anderen Weg.. das Script in dem Video scheint ja ganz gut zu funktionieren.. Allerdings kann man da auch noch nicht erkennen, ob das wirklich ruckelfrei läuft, bzw. wie es bei mehreren Lichtquellen aussehen würde..

schmoggi
21.02.2012, 14:07
Joa hmm... mit Blick nach vorne gerichtet ist die immer wieder aktualisierende Lightmap Methode vllt. nicht der richtige Weg, das kann gut sein. Ich weiß nicht, wie man technisch (wenn überhaupt umsetzbar) an soetwas herangeht... aber theoretisch gesehen stelle ich mir das System im optimal fall so vor:

Das Skript sieht beispielsweise bei nem Event das # Zeichen im Namen und weiß jetzt, aha, das ist eine Lichtquelle. Die Grafik dieser Lichtquelle (welche ja dann die Form des Lichtbereiches darstellt) ist die Event Grafik selber (oder im Comment ist mit Name=Licht1.png die Grafik angegeben.. das ist relativ egal), also beispielsweise ein normaler Kreis mit nem schönen Farbverlauf von schwarz nach transparent. Im Comment in der Event Befehlsliste steht nun noch Opacity=200, das bedeutet dieser Bereich wird nicht 100% aufgedeckt, sondern eben nur fast (die eigentliche Grafik wird mit einer Opacity von 200 in dem Fall angezeigt). So, nun habe ich mein overlay screen Bitmap, also ein weises/schwarzes bild (640x480), wahlweise mit nem transparenten Bereich in der Mitte (Spieler Fackel). Überschneidet jetzt diese overlay Grafik Events, welche Lichtquellen sind, werden diese Bereiche (welche von der Lichtquellen Grafik vorgegeben sind) nicht überdeckt bzw. sie bleiben transparent (je nach opacity wert).

Zumindest sieht so meine Vorstellung von der Funktionalität aus :/...

EDIT:

Was mir gerade spontan in den Sinn kam:

Wie sähe es aus, wenn man eine Lösung über die Color Screen Tone Funktion versuchen würde? Ist nur eine Idee, vielleicht ist es im Grunde das gleiche was schon versucht wird, ich weiß es nicht.
Darunter stelle ich mir gerade vor, dass man die Change Screen Tone Funktion vom Maker erweitert (oder eben eine neue erstellt), wo eben durch Events etc. festgelegt werden kann, dass bestimmte Bereiche von diesem Tone Change ignoriert werden!?

EDIT 2:

Eben auf YouTube gefunden: http://www.youtube.com/watch?v=qSI_Df0gBks

Zwar ohne schöne verläufe, aber vllt. passiert da noch was.

greetz

Cornix
26.02.2012, 21:56
Der Großteil des Scripts ist bereits fertig, allerdings gibt es noch einen kritischen Bug im Code an einer essentiellen Stelle.
Ich habe noch nicht die Zeit gefunden um den Code ein zweites Mal zu überprüfen um den Fehler zu lokalisieren, denke jedoch, dass es sich wahrscheinlich nur um einen Flüchtigkeitsfehler handeln wird und nichts konzeptionelles. Zumindest hoffe ich es.

schmoggi
26.02.2012, 22:23
Hört sich ja echt klasse an! Bin gespannt, wie das Endergebniss ausschaut. Hoffe, du bist so freundlich und stellst es der Allgemeinheit (u.A. mir) zur Verfügung.

greetz

Cornix
26.02.2012, 22:31
Ich habe nicht nur vor es zu veröffentlichen sondern viel mehr will ich vor allem auch das Konzept dahinter und die Algorithmen erklären. Ich finde das ist eine sehr interessante Angelegenheit.

Ascare
05.03.2012, 02:53
Ich bin schon vorher auf diesen Thread aufmerksam geworden und bin in meinem Spiel auch an einer Stelle in der ich Fackeln, Licht, Wachen etc. habe bzw. brauche.
Also habe ich mich mal nach diesem Light Script aus dem Youtube Video umgesehen, ebenfalls nirgends gefunden (nur Beiträge von dir schmoggi, international auf der Suche nach diesem Script ;)). Ich hab also nach dem Benutzernamen des Youtube Users genauer geschaut und bald herausgefunden das der User aus der brasilianischen Community stammt. Nach durchforsten der brasiliansichen Scriptabteilungen habe ich eins gefunden, das dem von Raziel sehr ähnlich ist. Ich vermute jetzt einfach mal das das Script in dem Youtube Video nicht seins ist, sondern das was ich gefunden habe. Lange Rede, kurzer Sinn.

Ich wollte es hier posten, aber vorher würde ich es gerne aufbereiten (sprich übersetzen, kompatibel machen) und dann für alle User zur Verfügung stellen...morgen oder so.
Übrigens stimmt es das die Lichtkegel Pictures sind, also auch freie Lichtformen.

schmoggi
05.03.2012, 22:55
Hey,

Das kommt unerwartet ^^... aber warum nicht!? Dann hätten wir ja schonmal zwei Skripte und jeder kann nach Belieben/Anforderungen sich eines aussuchen. Außerdem kann man ja dann von einander lernen bzw. verschiedene Herangehensweisen begutachten und mögliche schwachstellen so gekonnt ausmerzen. Ich bin jedenfalls gespannt, auf beide Skripte!

greetz