Erster Versuch eines 2D Schattens
Übersicht

OldSkool90Betreff: Erster Versuch eines 2D Schattens |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
So ich hab mich mal an einen 2D Schatten gesetzt und da auch nur 3-4 Stunden investiert und würde gerne eure Meinung dazu hören. Ist es in einem Array noch echtzeitfreundlich? Könnte man das ganze auch anders lösen? etc etc.
Konstruktive Kritik ist erwünscht...und nein ich halte nichts davon, irgendwelche Zeilen in x Richtung zu verschieben. Bei mir ist und bleibt alles linksbündig. Ich seh sonst nicht durch ![]() Achja es ist das erste mal, dass ich so etwas mache und bin auch an sich noch Anfänger^^ hier der Code: (bitte die Auflösung anpassen^^ und nicht mit dlight# rumspielen...muss das noch hinter paar variablen quetschen, damit es fuktioniert) Code: [AUSKLAPPEN] SetGraphicsDriver GLMax2DDriver() Graphics 1680,1050,32 SetClsColor 200,200,200 Global xRect#,yRect#,wRect#,hRect# Global xLight#,yLight#,wLight#,hLight#,dlight# Global xLine#,yLine# Global shadowx1#,shadowx2#,shadowx3#,shadowx4# Global shadowy1#,shadowy2#,shadowy3#,shadowy4# Global shadowpoly1#[] Global shadowpoly2#[] Global shadowpoly3#[] Global shadowpoly4#[] Global shadowpoly5#[] Global shadowpoly6#[] xRect = 815# yRect = 500# wRect = 50# hRect = 50# wLight = 10# hLight = 10# While Not KeyHit(key_escape) Cls xLight# = MouseX() yLight# = MouseY() dlight# = 1 shadowx1# = xrect+(xrect-xlight)*dlight shadowx2# = xrect+wrect+(xrect+wrect-xlight)*dlight shadowx3# = shadowx2*dlight shadowx4# = shadowx1*dlight shadowy1# = yrect+(yrect-ylight)*dlight shadowy2# = shadowy1*dlight shadowy3# = yrect+hrect+(yrect+hrect-ylight)*dlight shadowy4# = shadowy3*dlight SetColor 255,255,0 DrawOval xLight-wlight/2,yLight-hlight/2,wLight,hLight SetColor 255,0,0 Plot xrect,yrect SetColor 255,0,0 Plot xrect,yrect+hrect SetColor 255,0,0 Plot xrect+wrect,yrect SetColor 255,0,0 Plot xrect+wrect,yrect+hrect DrawLine xlight,ylight,shadowx1,shadowy2 DrawLine xlight,ylight,shadowx2,shadowy2 DrawLine xlight,ylight,shadowx3,shadowy3 DrawLine xlight,ylight,shadowx4,shadowy4 SetColor 0,0,0 DrawRect shadowx1,shadowy1,shadowx2-shadowx1,shadowy3-shadowy2 DrawText shadowx2-shadowx1,0,0 DrawText shadowy3-shadowy2,0,10 DrawText shadowx1,0,20 DrawText shadowy1,0,30 shadowpoly1# = [xrect,yrect,shadowx2,shadowy2,shadowx1,shadowy1] shadowpoly2# = [xrect,yrect,xrect+wrect,yrect,shadowx2,shadowy2] shadowpoly3# = [xrect,yrect+hrect,shadowx4,shadowy4,shadowx3,shadowy3] shadowpoly4# = [xrect+wrect,yrect+hrect,shadowx3,shadowy3,xrect,yrect+hrect] shadowpoly5# = [xrect+wrect,yrect,xrect+wrect,yrect+hrect,shadowx2,shadowy2] shadowpoly6# = [xrect+wrect,yrect+hrect,shadowx2,shadowy2,shadowx3,shadowy3] DrawPoly shadowpoly1# DrawPoly shadowpoly2# DrawPoly shadowpoly3# DrawPoly shadowpoly4# DrawPoly shadowpoly5# DrawPoly shadowpoly6# SetColor 55,0,0 DrawRect xRect,yRect,wRect,hRect Flip Wend End EDIT: Hat denn keiner eine Meinung dazu oder Verbesserungsvorschläge? |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Warum ist die Darstellung nicht unabhängig von der Auflösung?
Soll der Schatten räumlich oder in einer Ebene sein? |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
OldSkool90 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wie meinst du das mit unabhängig von der Auflösung? Weil ich schrieb, dass man die Auflösung anpassen sollte? Das war nur ein Hinweis da ich das Programm in einer Auflösung von 1680:1050 programmiert habe und nicht jeder einen 16:10 Monitor hat.
Ob es räumlich oder auf einer Ebene sein soll? Puh da fragst du was...Ich hatte keine direkte Vorstellung als ich das gecoded hab. Ich habe lediglich versucht den Strahlensatz anzuwenden, aber irgendetwas stört mich bei der Darstellung. Aber ich komm einfach nicht drauf. Vielleicht würde es realistischer aussehen, wen die Schattenquelle dreidimensional wäre, aber ich wollte mich da nicht übernehmen. EDIT: ehm achja... Die Variable dLight# sollte die höhe der Lichtquelle im "Dreidimensionalen" raum simulieren, aber ich habe vergessen sie hinter einige Variablen mit zu rechnen, wodurch die Darstellung ziemlich zerstört wird. Und die roten Linien waren nur meine Denkstütze für den Strahlensatz.^^ |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn man ein kleineres Fenster wählt, muss man erst mal die Koordinaten verschieben, sonst sieht man nichts - ist immer nett wenn man sowas bei seiner Präsentation berücksichtigt.
Es wirkt auf mich gar nicht wie irgendein Schatten, sondern mehr so wie ein Projizierter Quader... Wenn die Lichtquelle im Vordergrund wäre und ein viereckiger Schatten auf der grauen Fläche im Hintergrund projiziert würde, sähe das realistischer aus. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
OldSkool90 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ach das war es was nicht stimmte^^
klar die lichtquelle muss immer oberhalb des objektes sein. aber mir ist noch unklar wie ich den schatten dynamisch mache. denn wenn die lichtquelle über dem objekt ist scheint mir der schatten zu groß. einfach nur den strahlensatz anzuwenden scheint nicht die beste lösung zu sein, leider. EDIT: Okay ich denke ich werde morgen die lichtquelle vergrößern und den Schattenwurf nicht von einem punkt aus berechnen, sondern von den beiden äußersten punkten der lichtquelle. das ganze muss ich einfach mal überdenken. naja iwo müsste ja noch nen physikbuch aus der schulzeit rumliegen. mal sehen was ich falsch mache^^ |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Eins noch: bitte gewöhne dir frühzeitig an mit strict oder superstrict zu arbeiten, da BMax nur so sein volles Potential entfalten kann UND vieles an Fehlern schon im Keim erstickt wird.
Ich persönlich (und viele andere hier auch) weigere mich einen nicht-stricten Code auf Fehler zu analysieren, da sich meist rausstellt dass einfach falsche benannte Variablen etc. die Fehler verursachen, was man mit strict direkt erkannt hätte. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
OldSkool90 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ganz ehrlich...ich weiss nicht einmal was strict und superstrict ist. Momentan versuche ich erstmal die Types in Bmax zu verstehen...fande es in B3D wesentlich leichter, aber dieses OO Zeug soll ja Vorteile haben, auch wenn diese für mich jetzt noch nicht wirklich erkennbar sind.
Aber nochmal zurück zu Strict und Fehleranalyse. Ich habe nie behauptet, dass der Code Fehlerhaft ist, denn er funktioniert. Das einzige Problem ist der Realismus und die Fähigkeit zu überzeugen, dass es sich um einen Schatten handelt. Aber trotzdem danke für dein Feedback ![]() |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du Strict nutzt, musst du deine Variablen deklarieren.
Bei undeklarierten bzw. entsprechend auch bei falsch geschriebenen Variablen spuckt dir sonst der Compiler eine Fehlermeldung aus. Außerdem gibt es eine weitere Änderung bei der Variablensichtbarkeit: BlitzMax: [AUSKLAPPEN] Strict Diese Änderung hat den Vorteil, dass, wenn z.B. in der Schleife große Arrays mit viel Speicherverbrauch erstellt werden, dieser Speicher nach der Schleife wieder freigegeben wird. Bei deinem Code kannst ohne Änderung ein "Strict" drüberschreiben. mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
- Zuletzt bearbeitet von mpmxyz am Sa, Feb 20, 2010 14:58, insgesamt einmal bearbeitet
OldSkool90 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
achso okay^^ naja aber ob ich es nun verwende oder nicht...wenn ich nen fehler mache meckert der compiler ja sowieso und ich muss die variablen entsprechend anpassen. aber okay sicher ist sicher, also werd ichs verwenden. ![]() |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der Punkt isrt dass bei strict/superstrict direkt ein 'Identifier not found' kommt - das programm läuft gar nicht erst.
Ohne Strict/superstrict hingegen erstellt Max stillschweigend eine neue Variable und du hast großes Rätselraten warum dein Code nicht funktioniert. Beispiel: Code: [AUSKLAPPEN] blub = 123
... 100 Zeilen anderes Zeugs.... ... print "das wahnsinnig wichtige Ergebnis ist:"+(2*blubb+234) Das ist ein Fehler der dir mit Strict/Superstrict nicht passieren kann. Nebenbei habe auch ich nie behauptet dass dein Code fehlerhaft ist, ich sagte nur dass ich nonstricten Code nicht anrühre. Ich persönlich empfehle sogar das Arbeiten nur mit Superstrict. Man gewöhnt sich rasch dran und die Vorteile sind enorm. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
OldSkool90 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
inzwischen hab ich das verstanden^^ hab es ja in meinem neuen topic auch verwendet ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group