For...Next und Types o.O
Übersicht

OldSkool90Betreff: For...Next und Types o.O |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich war gerade dabei ein paar Types zu erstellen und bissl mehr. Als alles lief wie es sollte, da dachte ich mir: "Mensch, Ein Objekt ist doch langweilig"...also versuchte ich folgendes:
Code: [AUSKLAPPEN] SuperStrict Global gx:Int,gy:Int,a:Int gx = 1600 gy = 1200 Type LightSource Field x1:Int Field x2:Int Field y1:Int Field y2:Int Field xSrc:Int Field ySrc:Int Field xDir1:Int Field yDir1:Int Field xDir2:Int Field yDir2:Int Method DrawLightSource() DrawOval x1,y1,(x2-x1),(y2-y1) EndMethod Method DrawLightDirection() DrawLine xSrc,ySrc,(xDir1+(xDir1-xSrc)*1000),(yDir1+(yDir1-ySrc)*1000) DrawLine xSrc,ySrc,(xDir2+(xDir2-xSrc)*1000),(yDir1+(yDir1-ySrc)*1000) DrawLine xSrc,ySrc,(xDir2+(xDir2-xSrc)*1000),(yDir2+(yDir2-ySrc)*1000) DrawLine xSrc,ySrc,(xDir1+(xDir1-xSrc)*1000),(yDir2+(yDir2-ySrc)*1000) EndMethod EndType Type Wall Field x1:Int Field x2:Int Field x3:Int Field x4:Int Field y1:Int Field y2:Int Field y3:Int Field y4:Int Method DrawWall() DrawRect x1,y1,(x2-x1),(y2-y1) EndMethod EndType Local Light:LightSource = New LightSource For a = 0 To 2 Local Entity:Wall = New Wall Entity.x1 = Rnd(gx) Entity.x2 = Entity.x1+gx/10 Entity.y1 = Rnd(gy) Entity.y2 = Entity.y1+gy/10 Next SetGraphicsDriver GLMax2DDriver() Graphics gx,gy,32,60 While Not KeyHit(key_escape) Cls Light.x1 = MouseX()-10 Light.x2 = Light.x1 + 20 Light.y1 = MouseY()-10 Light.y2 = Light.y1 + 20 Light.xSrc = MouseX() Light.ySrc = MouseY() Light.xDir1 = Entity.x1 Light.yDir1 = Entity.y1 Light.xDir2 = Entity.x2 Light.yDir2 = Entity.y2 Light.DrawLightSource() Entity.DrawWall() Light.DrawLightDirection() Flip Wend End Dann erzählt mir der Compiler aber ,dass Entity nicht existiere. Nun bin ich leicht verwirrt. Gibt es gar keine Methode um mit Hilfe von Types mehrere Objekte zu erstellen? möglichst in einer For Next Schleife?...Das erste Problem, dass ich hatte war, dass es kein "each" mehr gibt...sehr sehr großer Nachteil. ![]() |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du erstellst zwar mit New eine neue Instanz, aber überschreibst diese in der Schleife dauernd. In BlitzMax musst du die Types selbst in Listen verwalten. Schau dir ein paar Tutorials auf bb.com an. | ||
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 ![]() |
|
---|---|---|
danke für den hinweis ![]() aber ich habe bereits ein tutorial angeschaut und da sah es für mich aus als würde ich in listen alles manuell eintragen müssen...was nicht wirklich praktisch ist o.O kannst du mir ein ganz bestimmtes tutorial empfehlen? das ewige suchen macht mich ganz krank^^ |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich empfehle learning by doing ... was anderes hat sich noch nie als wirklich effektiv erwiesen.
Für diesen Fall ein Tipp: Überladung vom New Parameter. BlitzMax: [AUSKLAPPEN] Type TWall |
||
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 ![]() |
|
---|---|---|
okayokay als erstes danke ich dir^^
zum zweiten hoffe ich dass ich das anwenden kann. denn dieses mit self und so ist noch nicht in mein vokabular übergegangen^^ aber naja ich kanns auch später hinterfragen...erst tun dann fragen, so hab ich auch b3d gelernt ![]() |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zu der Fehlermeldung:
"Identifier not found", nicht wahr? Das ist die Sache mit der Sichtbarkeit der Variablen bei Strict/SuperStrict: BlitzMax: [AUSKLAPPEN] SuperStrict 'Vorbildlich! Du gibst sogar immer den Variablentyp an. :-) Für Objektlisten kann man z.B. die "TList" nehmen. Mit "For ObjektReferenz=EachIn Liste" kann man alle Objekte in der angegebenen Liste durchgehen. Die Trennung von Objekt und Liste schafft zwar in diesem Fall ein wenig Mehrarbeit, hat aber einige Vorteile. So können z.B. Objekte, die in keiner Liste sind, auch automatisch freigegeben werden, wenn sie nicht mehr gebraucht werden. Außerdem könnte man sich für eine Liste entscheiden. (Es gibt ja nicht nur Linked Lists) mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
OldSkool90 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
wow so viel auf einmal ![]() ich glaube nicht, dass es primär daran liegt, dass entity local existiert...denn wenn ich entity global dimensioniere erhalte ich den gleichen fehler...was sehr(!) verwirrend ist ![]() |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlitzMax: [AUSKLAPPEN] Local Entity:Wall Der Compilerfehler ist nun verschwunden. Die Variablensichtbarkeit ist bei Strict/SuperStrict leicht anders als ohne Strict/SuperStrict/bei BlitzBasic: Variablen, die in einer Schleife erstellt werden, bleiben in der Schleife. Das "Global" in der Schleifendeklaration sorgt nur dafür, dass die Variable am Ende der Schleife, Funktion etc. nicht verschwindet, sondern beim nächsten Durchlauf immer noch ihren Wert behält. Außerhalb ist sie aber wieder nicht sichtbar. mfG mpmxyz BlitzMax: [AUSKLAPPEN] SuperStrict |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
OldSkool90 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
achsoooo O.o
na das muss man erstmal rausfinden xD aber ich denke mein problem lässt sich tatsächlich nur mit listen lösen. mal schaun was sich machen lässt ![]() |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn dir der Ansatz von Xeres zu weit weg ist vom deinem Code, dann mach das Eintragen in die Liste doch so:
BlitzMax: [AUSKLAPPEN] Global WallListe:TList Das Malen geht dann so: BlitzMax: [AUSKLAPPEN] For Local Entity:Wall = EachIn WallListe Die Idee von Xeres ist natürlich die genialste, aber für den BMax-Typen-Neuling unverständlich. Es existieren unter BMax bereits standardmäßig einige Methoden, wenn du einen neuen Typ erfindest. Diese Methoden sind nicht sichtbar. Sie heißen z.b. New(), Delete(), Sort(), .... und machen etwas, wenn du z.B. schreibst... BlitzMax: [AUSKLAPPEN] Local Entity:Wall = New Wall Nun kannst du diese Methoden um eigene Zeilen erweitern, wenn Du die Methode im Typ hinschreibst. Genau das hat Xeres getan. Die Methode New() wird um die Zeile TWall.list.AddLast(Self) erweitert. Im Grunde bedeutet sie nix anderes, als dass jedes neue Element dieses Types gleich in eine Liste wandern soll. |
||
- Zuletzt bearbeitet von Midimaster am Sa, Feb 20, 2010 18:24, insgesamt 2-mal bearbeitet
OldSkool90 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wow DANKE!!! Das ist genau das Problem, das ich gerade mit den Listen hatte ![]() |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
@OldSchool90: ich habe gerade meine letzte post nochmal erweitert. Schau mal zurück! | ||
OldSkool90 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
achso^^ der code von Xeres hatte mich schon bissl verwirrt.
Jetzt habe ich deine Idee aufgegriffen und naja...es werden mehrere "Wall" Objekte angezeigt, ABER die Linien von der Lichtquelle zum Objekt hin sind nur einmalig also nicht bei allen 3 Wall dingern vorhanden...hier der neue Code Code: [AUSKLAPPEN] SuperStrict
Global gx:Int,gy:Int,a:Int gx = 1600 gy = 1200 Type LightSource Field x1:Int Field x2:Int Field y1:Int Field y2:Int Field xSrc:Int Field ySrc:Int Field xDir1:Int Field yDir1:Int Field xDir2:Int Field yDir2:Int Method DrawLightSource() DrawOval x1,y1,(x2-x1),(y2-y1) EndMethod Method DrawLightDirection() DrawLine xSrc,ySrc,(xDir1+(xDir1-xSrc)*1000),(yDir1+(yDir1-ySrc)*1000) DrawLine xSrc,ySrc,(xDir2+(xDir2-xSrc)*1000),(yDir1+(yDir1-ySrc)*1000) DrawLine xSrc,ySrc,(xDir2+(xDir2-xSrc)*1000),(yDir2+(yDir2-ySrc)*1000) DrawLine xSrc,ySrc,(xDir1+(xDir1-xSrc)*1000),(yDir2+(yDir2-ySrc)*1000) EndMethod EndType Global WallList:TList = CreateList() Type Wall Field x1:Int Field x2:Int Field x3:Int Field x4:Int Field y1:Int Field y2:Int Field y3:Int Field y4:Int Method DrawWall() DrawRect x1,y1,(x2-x1),(y2-y1) EndMethod EndType Local Light:LightSource = New LightSource For a = 0 To 2 Local Entity:Wall = New Wall Entity.x1 = Rnd(gx) Entity.x2 = Entity.x1+gx/10 Entity.y1 = Rnd(gy) Entity.y2 = Entity.y1+gy/10 ListAddLast WallList, Entity Next SetGraphicsDriver GLMax2DDriver() Graphics gx,gy,32,60 While Not KeyHit(key_escape) Cls Light.x1 = MouseX()-10 Light.x2 = Light.x1 + 20 Light.y1 = MouseY()-10 Light.y2 = Light.y1 + 20 Light.xSrc = MouseX() Light.ySrc = MouseY() For Local Entity:Wall = EachIn WallList Light.xDir1 = Entity.x1 Light.yDir1 = Entity.y1 Light.xDir2 = Entity.x2 Light.yDir2 = Entity.y2 Next Light.DrawLightSource() For Local Entity:Wall = EachIn WallList Entity.DrawWall() Light.DrawLightDirection() Next Flip Wend End |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
kein wunder...
du hast zwar 3 Wände erstellt. Aber dein Lichtobjekt gibt es ja nur 1x und es kann auch nur 1 Satz xDir1,... aufnehmen. Du scannst zwar alle Wände durch, aber am Ende weiss das Lichtobjekt nur die Koordinaten der letzten Wand... Hier musst du dir jetzt was überlegen, wie sich das Lichtobjekt mehrere Sätze Lichtrichtungen zu allen Wänden merken kann...oder du machst das erst später in Echtzeit: Scannst alle Wände durch und berechnest die Richtung vom Licht hierher (geht aber auch nur gut, solange es nur 1 Licht gibt...) |
||
OldSkool90 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ups ich hab ja xDir in den LightSource Type geschrieben xDD kein wunder.
also müsste ich diese auch in eine Liste packen oder xDir und yDir in den Wall Type schreiben oder? |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
das bringt dich nicht wirklich weiter. Warum willst du den die Beziehungen Xdir,... überhaupt speichern? Du könntest doch bei der DrawLightDirection() einfach auch alle Wände durchscannen:
BlitzMax: [AUSKLAPPEN] Method DrawLightDirection() |
||
OldSkool90 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Okay das geht^^ Hätte nicht gedacht, dass man das so machen kann...Ich muss wohl noch mit Methoden und Listen üben um solche Denkfehler nicht noch einmal zu machen.
Wenn ich jetzt noch mit drawpoly die schatten zeichne und alles klappt mit den types, bin ich überwältigt ![]() Hier der neue Code bisher ohne Schatten: Code: [AUSKLAPPEN] SuperStrict
Global gx:Int,gy:Int,a:Int gx = 1600 gy = 1200 Global WallList:TList = CreateList() Type LightSource Field x1:Int Field x2:Int Field y1:Int Field y2:Int Field xSrc:Int Field ySrc:Int Field xDir1:Int Field yDir1:Int Field xDir2:Int Field yDir2:Int Method DrawLightSource() DrawOval x1,y1,(x2-x1),(y2-y1) EndMethod Method DrawLightDirection() For Local Entity:Wall = EachIn WallList xDir1 = Entity.x1 yDir1 = Entity.y1 xDir2 = Entity.x2 yDir2 = Entity.y2 DrawLine xSrc,ySrc,(xDir1+(xDir1-xSrc)*1000),(yDir1+(yDir1-ySrc)*1000) DrawLine xSrc,ySrc,(xDir2+(xDir2-xSrc)*1000),(yDir1+(yDir1-ySrc)*1000) DrawLine xSrc,ySrc,(xDir2+(xDir2-xSrc)*1000),(yDir2+(yDir2-ySrc)*1000) DrawLine xSrc,ySrc,(xDir1+(xDir1-xSrc)*1000),(yDir2+(yDir2-ySrc)*1000) next EndMethod EndType Type Wall Field x1:Int Field x2:Int Field x3:Int Field x4:Int Field y1:Int Field y2:Int Field y3:Int Field y4:Int Method DrawWall() DrawRect x1,y1,(x2-x1),(y2-y1) EndMethod EndType Local Light:LightSource = New LightSource For a = 0 To 2 Local Entity:Wall = New Wall Entity.x1 = Rnd(Rnd(gx)) Entity.x2 = Entity.x1+gx/10 Entity.y1 = Rnd(Rnd(gy)) Entity.y2 = Entity.y1+gy/10 ListAddLast WallList, Entity Next SetGraphicsDriver GLMax2DDriver() Graphics gx,gy,32,60 While Not KeyHit(key_escape) Cls Light.x1 = MouseX()-10 Light.x2 = Light.x1 + 20 Light.y1 = MouseY()-10 Light.y2 = Light.y1 + 20 Light.xSrc = MouseX() Light.ySrc = MouseY() Light.DrawLightSource() For Local Entity:Wall = EachIn WallList Entity.DrawWall() Light.DrawLightDirection() Next Flip Wend End Vielen Dank an Xeres, mpmxyz und besonders an Midimaster ![]() |
||
OldSkool90 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hier mal ein Update:
(Bei 30 oder 40 Objekten sinkt die Leistung jedoch) Code: [AUSKLAPPEN] SuperStrict
Global gx:Int,gy:Int,a:Int Global ShadowPoly1:Float [] 'Wie ich es doch hasse xD Global ShadowPoly2:Float [] Global ShadowPoly3:Float [] Global ShadowPoly4:Float [] Global ShadowPoly5:Float [] Global ShadowPoly6:Float [] Global ShadowPoly7:Float [] Global ShadowPoly8:Float [] Global LineToggle:Int = 0 gx = 1600 gy = 1200 Global WallList:TList = CreateList() Type LightSource Field x1:Int Field x2:Int Field y1:Int Field y2:Int Field xSrc:Float Field ySrc:Float Field xDir1:Float Field yDir1:Float Field xDir2:Float Field yDir2:Float Method DrawLightSource() DrawOval x1,y1,(x2-x1),(y2-y1) EndMethod Method DrawLightDirection() For Local Entity:Wall = EachIn WallList xDir1 = Entity.x1 yDir1 = Entity.y1 xDir2 = Entity.x2 yDir2 = Entity.y2 ShadowPoly1 = [xDir1,yDir1,(xDir1+(xDir1-xSrc)*1000),(yDir1+(yDir1-ySrc)*1000),(xDir2+(xDir2-xSrc)*1000),(yDir1+(yDir1-ySrc)*1000)] ShadowPoly2 = [xDir1,yDir1,xDir2,yDir1,(xDir2+(xDir2-xSrc)*1000),(yDir1+(yDir1-ySrc)*1000)] ShadowPoly3 = [xDir1+gx/10,yDir1+gy/10,(xDir2+(xDir2-xSrc)*1000),(yDir2+(yDir2-ySrc)*1000),(xDir1+(xDir1-xSrc)*1000),(yDir2+(yDir2-ySrc)*1000)] ShadowPoly4 = [xDir1,yDir1+gy/10,xDir1+gx/10,yDir1+gy/10,(xDir1+(xDir1-xSrc)*1000),(yDir2+(yDir2-ySrc)*1000)] ShadowPoly5 = [xDir1,yDir1,(xDir1+(xDir1-xSrc)*1000),(yDir1+(yDir1-ySrc)*1000),(xDir1+(xDir1-xSrc)*1000),(yDir2+(yDir2-ySrc)*1000)] ShadowPoly6 = [xDir1,yDir1+gy/10,xDir1,yDir1,(xDir1+(xDir1-xSrc)*1000),(yDir2+(yDir2-ySrc)*1000)] ShadowPoly7 = [xDir1+gx/10,yDir1,(xDir2+(xDir2-xSrc)*1000),(yDir1+(yDir1-ySrc)*1000),(xDir2+(xDir2-xSrc)*1000),(yDir2+(yDir2-ySrc)*1000)] ShadowPoly8 = [xDir1+gx/10,yDir1+gy/10,xDir1+gx/10,yDir1,(xDir2+(xDir2-xSrc)*1000),(yDir2+(yDir2-ySrc)*1000)] If LineToggle = 1 DrawLine xSrc,ySrc,(xDir1+(xDir1-xSrc)*1000),(yDir1+(yDir1-ySrc)*1000) DrawLine xSrc,ySrc,(xDir2+(xDir2-xSrc)*1000),(yDir1+(yDir1-ySrc)*1000) DrawLine xSrc,ySrc,(xDir2+(xDir2-xSrc)*1000),(yDir2+(yDir2-ySrc)*1000) DrawLine xSrc,ySrc,(xDir1+(xDir1-xSrc)*1000),(yDir2+(yDir2-ySrc)*1000) EndIf SetColor 75,75,75 DrawPoly ShadowPoly1 DrawPoly ShadowPoly2 DrawPoly ShadowPoly3 DrawPoly ShadowPoly4 DrawPoly ShadowPoly5 DrawPoly ShadowPoly6 DrawPoly ShadowPoly7 DrawPoly ShadowPoly8 SetColor 255,255,255 Next EndMethod EndType Type Wall Field x1:Int Field x2:Int Field x3:Int Field x4:Int Field y1:Int Field y2:Int Field y3:Int Field y4:Int Method DrawWall() DrawRect x1,y1,(x2-x1),(y2-y1) EndMethod EndType Local Light:LightSource = New LightSource For a = 0 To 5 Local Entity:Wall = New Wall Entity.x1 = Rnd(gx) Entity.x2 = Entity.x1+gx/10 Entity.y1 = Rnd(gy) Entity.y2 = Entity.y1+gy/10 ListAddLast WallList, Entity Next SetGraphicsDriver GLMax2DDriver() Graphics gx,gy,32,60 SetClsColor 155,155,155 HideMouse() While Not KeyHit(key_escape) Cls Light.x1 = MouseX()-10 Light.x2 = Light.x1 + 20 Light.y1 = MouseY()-10 Light.y2 = Light.y1 + 20 Light.xSrc = MouseX() Light.ySrc = MouseY() Light.DrawLightSource() For Local Entity:Wall = EachIn WallList Light.DrawLightDirection() Next For Local Entity:Wall = EachIn WallList Entity.DrawWall() Next Flip Wend End |
||
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sieht schon gut aus. Als nächstes solltest du nur noch die Schatten zeichnen, die wirklich sichtbar sind, das sollte die Leistung steigern. | ||
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7 |
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das Geschwindigkeitsproblem kommt von "DrawPoly". Das ist nicht gerade die schnellste Funktion.
Übrigens: Die Arrays kannst du auch lokal in der Methode "DrawLightDirection" deklarieren, da die nur dort genutzt werden. Dann gibt es keinen Grund, etwas zu hassen. ![]() mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group