arbeiten mit Dims und types
Übersicht

erforderlichBetreff: arbeiten mit Dims und types |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hallo,
ich bin immer noch an meinem Level-ausleser dran. Nachdem mich in meinem letzten Thread alle wegen meinen nichtvorhandenen Kenntnissen im Zusammenspiel von Types und Dims fertiggemacht haben, frage ich jetzt einfach mal ob mir jemand, hmm ja, eigentlich schon beinahe ein Tutorial schreiben könnte. Ich bräuchte ein detailliert beschriebenes Beispiel, was als Lösung zu meinem Problem benutzbar sein sollte. Hier steht mein Problem geschrieben. https://www.blitzforum.de/view...mp;start=0 hier nochmal die korrektere Fragegestellung: zitat: "nochmal klipp und klar: Ich habe einen Schalter und eine Tür mit einem array. Logischerweise wird es immer genau so viele Schalter wie Türen geben. Nun habe ich in einer For schleife die dateien geladen. z.B. : Code: door_anzahl = 1 dim door_dim(door_anzahl) for i=0 to door_anzahl door_dim(i) = findchild(map, "door"+i) next somit hätte ich alle tür objekte asuber geordnet rausgefischt. Auf die glecihe Weise auch die Schalter.. Nun will ich in der Hauptschleife die aktionen für alle Objekte mit einer "0" hintendran (z.B.: door_dim(0)) mit anderen Objekten mit einer "0" als anhang vergleichen(z.B.: schalter_dim(0)). Wie kann ich dafür ein komfortable Lösung finden..? Kann ja sein das ich plötzlich ne Tür mehr rein mache, dann erhöhe ich eben die Anzahl werte, un eine Tür wird mehr geladen..(geladen wird sie sowieso, aber eine neue Tür in den Dim reingebracht..) Nun soll door_dim(0) nich mit schalter_dim(1) agieren, sondern sich auf schalter_dim(0) beziehen Das will ich auf eine komfortable Weise Handeln.. Mir is auf den ersten Schlag "For" dazu eingefallen...scheint aber keine Lösung darzubieten.. So, das war jetzt aber ehrlich eine seeehr ausführliche Beschreibung meines Problems.. Ich hoffe dann mal auf Hilfe" (auszug aus dem Thread) Danke für eure hoffentlich vorhandene Hilfe... Ich muss unbedingt weiter kommen!! ![]() Bei unbeantworteten Fragen bitte nich beleidigt meinen Thread vollspammen sondern höflcih Fragen. Danke tschüss |
||
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mit einer For-Schleife sollte das schon möglich sein. Dann gehst du halt wie beim laden wieder alle durch:
Code: [AUSKLAPPEN] For i = 0 to door_anzahl - 1 If schalter_dim(i) = true ;wenn Schalter eingeschaltet If door_dim(i) = false ;wenn Tür zu.. door_dim(i) = true ;Tür aufmachen etc. Endif Else ;wenn Schalter aus If door_dim(i) = true ;wenn Tür auf.. door_dim(i) = false ;Tür zumachen Endif Endif Next Das ganze könnte man aber mit Types auch machen: Code: [AUSKLAPPEN] Type door Field open Field schalter.schalter End Type Type schalter Field status Field door.door End Type ;Laden door_anzahl = 10 For i = 0 to door_anzahl - 1 s.schalter = new schalter s\status = 0 s\door = null d.door = new door d\open = 0 d\schalter = s s\door = d Next ;Updaten For s.schalter = each schalter if s\status = true if s\door\open = false s\door\open = true endif else ... endif Next Naja kommt zwar etwa aufs selbe, aber so hast du jeden Schalter direkt mit ner Tür verbunden weil jeder Schalter Type eine Tür haben kann und jede Tür einen Schalter in dem Fall. Edit: Ist halt nur Pseudo, aber so schwer sollte das eigentlich nicht sein ![]() |
||
erforderlich |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ich bräuchte den teil:
Zitat: Type door
Field open Field schalter.schalter End Type Type schalter Field status Field door.door End Type und den Teil: Zitat: For i = 0 to door_anzahl - 1
mal näher erklärt. wenn das "-1" nicht ausschlaggebend ist, war ich auch schon so weit und es hat nicht geklappt. könntest du, oder jemand anders, hier nicht ein kleines sample erstellen? das wäre überaus nett. |
||
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja das -1 ist nur da weil man bei dims immer bei 0 anfängt zu zählen. Und wenn man ein dim macht mit der grösse 10 dann hat es die Elemente 0 - 9.
Zu den Types: Man kann in einem Type referenzen auf andere Typen haben. Genauso wie du Int, Strings etc. da drin haben kannst gehen halt auch andere (und auch dieselben) Types. In dem Fall hat halt eine Tür ein zugehöriger Schalter und ein Schalter eine zugehörige Tür. Wenn du dann die Tür für einen Schalter ansprechen willst kannst du das so machen: Code: [AUSKLAPPEN] schalter\tuer\variable_von_tuer Wenn jede Tür und jeder Schalter in deinem Level einen eigenen Namen hat dann muss halt in die Level-Datei mitgespeichert werden welche Tür zu welchem Schalter gehört usw. Beim Laden lädst du dann die Objekte mit ihren Namen. Nach dem Laden gehst du halt nochmal jeden Schalter durch. Für jeden Schalter gehst du jede Tür durch und prüfst ob sie den Namen hat den du gespeichert hattest. Wenn dies der Fall ist so gehört die Tür zum Schalter und du kannst dann dem Schalter diese Tür zuordnen: Code: [AUSKLAPPEN] Type schalter Field name ;Name des Schalters Field targetname ; Name des Ziels (Türname) Field target.door ; Das Ziel selber (Tür) Field status ;Ein/Aus End Type Type door Field name ;Name der Tür Field status ;geöffnet/geschlossen End Type ;Schalter Laden For i = 0 to schalter_anzahl - 1 s.schalter = new schalter s\name = ReadString(file) ;Name auslesen s\targetname = ReadString(file) ;Zielname auslesen s\target = null ;Ziel kennen wir noch nicht da noch nicht geladen.. s\status = ReadByte(file) ;Status auslesen Next 'Tueren laden For i = 0 to door_anzahl - 1 d.door = new door d\name = ReadString(file) ;Name auslesen d\status = ReadByte(file) ;Status auslesen Next 'Alle Schalter durchgehen For s.schalter = each schalter For d.door = each door if s\targetname = d\name ;Ziel des Schalters entspricht dieser Tür s\target = d ;Ziel auf diese Tür setzen Endif Next Next Dann hat jeder Schalter entweder Null (wenn die Tür nicht gefunden wurde) oder ein Tür Objekt auf das er dann zugreifen kann: Code: [AUSKLAPPEN] s.schalter = first schalter if s\target <> null print s\target\name endif |
||
erforderlich |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
so
Zitat: For i = 0 to schalter_anzahl - 1
s.schalter = new schalter s\name = ReadString(file) ... kann das doch gar nich funktionieren, denke ich. weil der name ja wieder überschrieben wird. Deshalb spreche ich auch von Dims. Aber wenn man das mischt kommt man in einen Code-dschungel. Aber sonstens ganz gute Ansätze. warum das Zitat: Type schalter
Field name ;Name des Schalters Field targetname ; Name des Ziels (Türname) Field target.door 2 mal? danke vielmals für deine Hilfe! Ich hoffe du weist auch mit Dims weiterzuhelfen. ![]() |
||
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der Name wird nicht überschrieben ![]() Code: [AUSKLAPPEN] s.schalter = new schalter Die Zeile erstellt von dem Type jedesmal ein neues Objekt. Die ganzen Objekte werden dann in einer Art Liste gespeichert auf die man per For Each Schleife halt zugreifen kann (jedes Objekt in der Liste). Einen Type kannst du dir als Vorlage vorstellen. Types beschreiben was für Eigenschaften (Fields) ein Objekt hat. Damit gibts aber noch keine Objekte, die müssen erst noch erstellt werden. Und jedes dieser Objekte hat dann diese Eigenschaften die man per \ abrufen kann: Code: [AUSKLAPPEN] s.schalter = new schalter ;Neues Objekt mit den Eigenschaften von schalter erstellen s\name = "Bla" ;Das name Field des Objekts s ändern s ist dann ein Handle (zeiger) welches auf das neu erstellte Objekt zeigt. Wenn s überschrieben wird existiert das alte Objekt aber immer noch: Code: [AUSKLAPPEN] s.schalter = new schalter s = new schalter Beim ersten mal zeigt s auf das erste neu erstellte Objekt. Bei der zweiten Zeile wieder auf das neu erstellte Objekt. Das alte existiert aber noch nur hat man keine Variable mehr womit man darauf zugreifen kann. Aus diesem Grund gibts dann die For Each Schleife womit du wieder auf jedes Objekt zugreifen kannst. s kann aber auch Null sein, das bedeutet s zeigt auf kein Objekt mehr (weil es gelöscht wurde etc.) und darf nicht mehr für Zugriffe auf die Fields benutzt werden. ---- Bei name und targetname habe ich das $ vergessen, es sollten Strings sein. Das targetname hat nur den zweck herauszufinden welche Tür zu dem Schalter gehört. target selber ist dann wieder ein Objekt vom Type door und kein String. Allein mit dem String kannst du ja auf den Status der Tür nicht zugreifen, per Objekt aber schon. In diesem Fall sagen wir dann nur dass target auf die entsprechende Türe zeigen soll, womit du deren Eigenschaften abfragen/ändern kannst. Das Objekt selber gibt es ja schon und muss nicht neu erstellt werden. Hoffe ich konnte dir weiterhelfen ![]() Types sind zu beginn nicht ganz einfach zu verstehen, aber wenn man sie verstanden hat sind sie sehr leicht zu handhaben. Wenn du Types beherrscht sollte dir der Einstieg in die OOP wie bei BlitzMax zum Beispiel auch leichter fallen. |
||
erforderlich |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
danke. Du hilfst mir sehr weiter.
Zitat: s.schalter = new schalter
s = new schalter das habe ich allerdings nicht verstanden ![]() Eine neues objekt von einem neuen Objekt? Ansonsten: du bist einer der User, die noch wirklich helfen wollen! Danke nochmal ![]() |
||
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bei normalen Variablen sagst du ja z.Bsp:
Code: [AUSKLAPPEN] name$ = "Bla" fl# = 1.3 i% = 10 etc. Das .schalter ist eigentlich genau das selbe, nur halt für Types. Code: [AUSKLAPPEN] s.schalter = null Damit hast du s als schalter definiert statt als String oder Float etc. So eine Objekt Variable zeigt dann auf ein Objekt, bzw. nicht wenn es Null ist. Code: [AUSKLAPPEN] new Typename Erstellt ein neues Objekt vom angegebenen Type und gibt das Handle (zeiger) zurück. Code: [AUSKLAPPEN] s.schalter = new schalter s = new schalter - s als Schalter definieren - Neues Objekt vom Type schalter erstellen und resultat in s speichern - s ist schon definiert, kann wiederverwendet werden - Neues Objekt vom Type schalter erstellen und wieder in s speichern Somit hast du 2 Objekte aber nur noch 1 Variable Code: [AUSKLAPPEN] For s = each schalter Print s\name Next Damit kannst du dann die beiden Objekte in der Liste durchgehen da s in jedem Schleifendurchlauf auf das nächste Objekt zeigt bis alle durchgegangen sind. Code: [AUSKLAPPEN] Delete s Löscht das Objekt worauf s zeigt. Es gibt noch mehr Befehle wie First, After, Last etc. kannst du ja in der Onlinehilfe schauen. PS: Es kommt darauf an wieviel Zeit ich hab, jeder hier hat ja auch noch ein Leben neben dem Programmieren und da ist es halt normal das nicht jeder alles immer so ausführlich erklären mag. Vorallem nicht wenn das Thema dann schon tausend mal durchgekaut wurde. Types sind zwar auch schon sehr oft erklärt worden aber was mit OOP oder ähnlichem zu tun hat erklär ich immer gerne ![]() Ich finde einfach mit OOP geht alles viel leichter wenn man es erstmal begriffen hat. |
||
erforderlich |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
<a name="frage">Tach!</a>
also, ich habe das Auslesen vorgenommen. Klappt prima. hier ist das was ich erreichen will mal detailliert gemalt: http://home.arcor.de/shorty.hanfmann/raum.jpg wenn der spieler im bereich ist, soll die Tür aufgehen... den bereich habe ich festgelegt BlitzBasic: [AUSKLAPPEN] For i = 0 To map\door_anzahl soll ich meinen bisherigen code mal posten? ich mach's einfach mal: BlitzBasic: [AUSKLAPPEN] Function map_update() |
||
- Zuletzt bearbeitet von erforderlich am Do, Apr 14, 2005 22:45, insgesamt 2-mal bearbeitet
erforderlich |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ähhem, ich bräuchte wirklich mal Hilfe ![]() -> s.o. (letzter Beitrag) Danke, für die die mir helfen ^^ |
||
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
1. Dein Code ist nicht sehr übersichtlich. Die langen Namen der Typzuweisungen sind sehr schlimm, mach daraus lieber etwas kürzeres.
2. Ist das dein ganzer Code? Wo ist die deklaration des Typefields? 3. Ich würde das ganze etwas anders angehen, eben wie oben beschrieben, die Türen direkt mit den entsprechenden Schaltern verlinken. |
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
erforderlich |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
1. man kann den Code verstehen wenn man will
2. Ich möchte das jez irgendwie hinbekommen: d.h. soetwas komplexes was ich vorher nich gecheckt habe, peil ich theoretisch schlechter, als wenn jemand anhand meines Anfangs ein praktisches beispiel abgibt ![]() soo...Jolinah !!! , deine Hilfe is gefragt ![]() ![]() sonst tu ich weinen ![]() |
||
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Meine Kommentare sollten kein Angriff, sondern konstruktive Kritik sein. Wenn man seinen eigenen Code nicht unter kontrolle hat (vom Layout her) dann wird man da auch schwer durchblicken (So ist jedenfalls meine Erfahrung).
Nun zu deinem Problem: Meinen zweiten Punkt hast du nicht wirklich beantwortet, wenn du noch nichteinmal weist wie man mit Types anfängt solltest du nicht sofort großes damit vorhaben und dann, weil du verzweifelst, hier nach Hilfe schreien dass dir das einer macht. Ich gebe dir nen Tipp wie ich das immer mache: 1. Nix verstehen 2. Mir das Problem rauspicken und schauen ob ich ein kleines Testprogramm damit zustande bekomme. 3. So lange an dem Testprogramm fummeln und probieren bis es funktioniert. 4. Die gewonnenen Erkenntnisse in das Hauptprogramm einfließen lassen und zufrieden sein es alleine geschafft zu haben. Falls du dir beim Thema Types noch zu unsicher bist, schaue dir in der Onlinehilfe die Tut´s dazu an oder auch meines, wo ich versuche die Grunddinge noch etwas anders zu erklären: Link Versuch zu verstehen, nicht einfach nur sagen: Kann das einer für mich machen. MFG FDM |
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
erforderlich |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
1. Die Online-Hilfe teile kenn ich schon
2. du sollst mir das nich machen. mir nur die funktion um so etwas zu erreichen zeigen. (wie man diese types untereinander unterprüft, etc...) 3. ich sehe das als beleidigung an, nix konstruktive kritik 4. ich kann nich proggen, ich machs nur notbedingt, weil ich keinen Programmierer habe und meine 3d-Modelle testen will. Ausserdem will ich mal in einen eigenen geilen level, wenn auch statisch, rumlaufen... da käme mir diese Auslese programm schon zu gute ![]() 5. dann erklär doch mal wie man das aus meinen Ansätzen her vergleichen kann. schreib doch mal eine Funktion die werte eines Types mit dem werten ausserhalb des Types vergleicht und wenn se "true" sinn, auf einenen anderen, dazugehörigen, Type effekt hat... mach das ma, dann hast du mein Problem gelöst, un ers dann kannst du dich vor mir behaupten. ![]() 6. So gehe ich meine Probleme auch an. Das is ja erst ein Test programm. ![]() 7. Wenn du nicht wirklich was zu meiner fragestellung hinbezutragen hast, sondern nur in kurz-gefassten Antworten rumpöbeln willst, dann schick PNs, bitte... |
||
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
So, das konnte ich nicht auf mir sitzen lassen. Auch wenn du den Code warscheinlich nicht verstehen wirst, er macht folgendes:
Wenn du mit der Spielerperspektive die kleine Kugel berührst (Steuerung Pfeiltasten) welche den Effektradius darstellt, verfärbt sich der Würfel. Der Würfel stellt in diesem Falle die Tür da, das verfärben müsste man nur noch durch "Tür öffnen" ersetzten und fertig. BlitzBasic: [AUSKLAPPEN] Graphics3D 800,600 |
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hab jetzt auch mal sowas gemacht. Ursprünglich wollte ich nur mit einem kleinen Beispiel wie Firstdeathmaker helfen....
Aus eigenem Interesse, weil ich sowas noch nie gemacht habe, hab ich es dann bisschen weiter entwickelt ![]() - Türen schliessen automatisch nach ner gewissen Zeit wieder - Trigger bleiben ne Weile deaktiviert so das sich der Status der Tür nicht dauernd wieder verändert. - Unterschiedliche Geschwindigkeiten fürs öffnen und schliessen Die Trigger hab ich so gemacht: Es sind blöcke wie die Türen selber auch. Wie bei den Türen kollidiert man auch bei Triggern. Nur ist der Alphawert des Triggers 0, also unsichtbar. Sobald man kollidiert wird dann die Tür geöffnet und der Trigger ganz versteckt mittels HideEntity, so dass Kollisionen ausgeschaltet werden. Wenn der Trigger dann resettet wird das Entity wieder eingeblendet (ShowEntity). So merkt man also gar nicht dass da irgendwas ist. Da es erforderlich helfen könnte, hier der Download inklusive gut kommentiertem Sourcecode ![]() http://zehr.de/blitz3d/maploader.zip PS: Hab jetzt damit man die Trigger zum Testen sieht Alpha auf 0.2 gemacht. Und steuern kann man den Player mit Maus und A,W,S,D oder Pfeiltasten. |
||
erforderlich |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Tach!
@ hot-bit: Ja so seh ich das auch ![]() @firstdeathmaker: geht doch ![]() aber warum musst du (wie viele andere User auch) einen immer direkt beleidigen?? Zitat: Auch wenn du den Code warscheinlich nicht verstehen wirst, er macht folgendes:
ich bin halt noch nich so weit un durch samples un tutorials lernt man eben am besten ![]() @Jolinah Cooles Tutorial, auch wenn ich einzel-Teile meiner Methode (falls ich sie je umgesetzt bekommen sollte) besser fände, weil z.B. Höhen der Tür (also wie hoch sie aufgehen soll etc. -> kann ja auch ma ne kaputte Tür sein, die z.B. nich ganz aufgeht..) direkt im 3d-Programm zu erstellen sind. Ich denke ich wechsle aber zu deiner Kollisionsmethode -> viel einfacher gehalten + wirkungsvoll + kann im 3d programm die Tastfäche erstellen (individuelle Größen). Also danke nochmals ![]() werde mich dann bald mal an die Arbeit machen ![]() |
||
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jo, das mit den Türen ist klar. Am besten wär halt so ein Format wie BSP wo verschiedenste Werte mitgespeichert werden können. Alternativ kann man auch zu jedem Mesh eine zusätzliche Datei beilegen. Statt nur Anzahl der Türen und Trigger speichert man dann halt noch für jedes Entity zusätzliche Infos. Z.Bsp mit ner Ini:
Code: [AUSKLAPPEN] [Map] doors=20 triggers=20 monster=10 [door1] open_speed=0.5 close_speed=0.3 [door2] - [doorxxx] [trigger1] - [triggerxxx] [monster1] - [monsterxxx] Und die liest man dann halt zu jeder Map mit ein. |
||
erforderlich |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Jez hast du mich BSP maps neugierig gemacht..bekomm ich mehr infos? ![]() Das mit ner externen Datei finde ich nicht so gut.zu schwer zu verwalten. ich lese die meshs aus der map aus und entscheide anhand des namens welche eigenschaften sie haben soll...hoffentlich geht mit ner BSP map mehr...klär mich mal auf... ![]() edit: Bin jetzt fertig damit. Ohne dein Tutorial hätte ich es nie geschafft. Danke nochmals! Allerdings ich habe das jez so gemacht, das der Cube keine Kollision hat, wie du, sondern eine Area aufstellt, in die man reintreten kann. So fällt einem die Tür nich vor der Nase zu und es is immer noch simpel gehalten. (wie auf dem Bild oben) Ausserdem kann ich jez mit Millisecs() umgehen ![]() |
||
erforderlich |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Tach...
beim einlesen: BlitzBasic: [AUSKLAPPEN] For i = 0 To map\door_anzahl wieso kann das nich funtzen Wenn ich 2 verschieden große Taster habe? es kommt immer nur ein Wert dabei raus. da kann das eine Teil halb so groß sein wie dsa andere, übernimmt aber seine min_x, bzw. max_x (usw...) bereiche... Der Vorgeber der verwendeten Werte scheint das Objekt des ersten Durhlaufs zu sein. tschüss |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group