Erster Versuch eines 2D Schattens

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

OldSkool90

Betreff: Erster Versuch eines 2D Schattens

BeitragMi, Feb 17, 2010 22:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
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?

Xeres

Moderator

BeitragMi, Feb 17, 2010 22:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

OldSkool90

BeitragMi, Feb 17, 2010 23:55
Antworten mit Zitat
Benutzer-Profile anzeigen
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.^^

Xeres

Moderator

BeitragDo, Feb 18, 2010 0:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

OldSkool90

BeitragDo, Feb 18, 2010 0:14
Antworten mit Zitat
Benutzer-Profile anzeigen
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^^

BladeRunner

Moderator

BeitragFr, Feb 19, 2010 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Feb 20, 2010 13:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

mpmxyz

BeitragSa, Feb 20, 2010 14:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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
Local Bla=-1
For Local Bla#=1 To 100 'der Name "Bla" wird in diesem Block von der neuen Variable überschrieben
Local Error=Bla# 'Die Variable "Error" existiert nur in diesem Block. (=Schleife,If-Abzweigung etc.)
Next
Print Bla
'Print Error '<-Die Variable "Error" gibt es hier nicht mehr!

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

BeitragSa, Feb 20, 2010 14:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Wink

BladeRunner

Moderator

BeitragSa, Feb 20, 2010 18:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Feb 20, 2010 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
inzwischen hab ich das verstanden^^ hab es ja in meinem neuen topic auch verwendet Wink

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group