Geschrieben um 23:49 am 13.05.2011 | Zitat | Editieren | Löschen | |
Mitglied Bachelor Gumby Beiträge: 40 | Moin zusammen! Gibt es eine in der Lib vorgesehene Möglichkeit, die Reihenfolge der Objekte innerhalb einer Objekthierarchie (genauer: innerhalb einer Hierachiebene) zu ändern? Die Anwendung, die ich im Kopf habe, bezieht sich auf Menu- und Option-Objekte in der Erweiterung menu.h:
Das heißt, das Menü soll m.o.w. interaktiv sein und gewisse Menüoptionen erst nennen, wenn sie vorher in einer Antwort angekündigt wurden. (So kann der Spieler sich zuerst Gedanken machen, wie das Tor aufgeht, ohne dass er im Hilfe-Menü auf die Idee mit der Zauberformel gebracht wird.) Diese Optionen sollen aber unabhängig von der Reihenfolge des Anwählens direkt unter der Frage angeordnet werden, die sie erweitern, also suboption1 unter option1 usw. (War das verständlich?) Das Problem ist wahrscheinlich leicht mit ein, zwei Flaggen zu lösen, indem Optionen gelöscht und in der gewünschte Reihenfolge wieder ins Menü eingeordnet werden. Bevor ich das ernsthaft versuche (oder mir gar den Code von menu.h in Gänze reinziehe), wüsste ich gern, ob es eine elegantere Möglichkeit gibt, die sowieso schon lange existiert. Schöne Grüße Christof |
Geschrieben um 09:23 am 14.05.2011 | Zitat | Editieren | Löschen | |
Mitglied Prof Gumby Beiträge: 634 | <td valign="top"><div class="post"><p>Ich kenne menu.h nicht. Vielleicht kann man ja Objekte als bereits gelesen kennzeichnen? Dann könnte man die gesamte Baumstruktur inklusive der versteckten Optionen definieren und würde dann diese Kennzeichnung rückgängig machen anstatt neue Objekte ins Menü zu verschieben.</p> <p>Alternativ könntest Du eine Routine schreiben, die das Objekt dorthin verschiebt, wo Du es haben willst. Mit der Inform-Anweisung 'move o to p' wird das Objekt immer so verschoben, dass o das älteste Kind von p ist.</p> <p>Mit einem Hilfsobjekt könntest Du die Objekte aber hin und her rangieren:</p> <pre><code class="language-Object"> &#91; insert_after o a &nbsp; &nbsp; i p; &nbsp; &nbsp; &nbsp; &nbsp; p = parent&#40;a&#41;; &nbsp; &nbsp; if &#40;p == nothing&#41; &#123; &nbsp; &nbsp; &nbsp; &nbsp; print "&#91; *** error&#58; tried to insert object #", &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; o, " after object #", a, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ", whose parent is nothing. ***&#93;"; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &#125; &nbsp; &nbsp; &nbsp; &nbsp; i = child&#40;p&#41;; &nbsp; &nbsp; while &#40;i&#41; &#123; &nbsp; &nbsp; &nbsp; &nbsp; move i to Abstellgleis; &nbsp; &nbsp; &nbsp; &nbsp; if &#40;i == a&#41; break; &nbsp; &nbsp; &nbsp; &nbsp; i = child&#40;p&#41;; &nbsp; &nbsp; &#125; &nbsp; &nbsp; move o to p; &nbsp; &nbsp; &nbsp; &nbsp; while &#40;child&#40;Abstellgleis&#41;&#41; move child&#40;Abstellgleis&#41; to p; &#93;;``` Wenn Du kein Hilfsobjekt anlegen willst, kannst Du die Objekte zwischen o und a auch rekursiv durchmischen: </code></pre> <p>[ ia_shuffle_up o a;</p> <p> if (o == nothing) return; </p> <p> if (o ~= a) ia_shuffle_up(sibling(o), a);</p> <p> move o to parent(o);</p> <p>];</p> <p>[ insert_after o a</p> <p> p;</p> <p> </p> <p> p = parent(a);</p> <p> if (p == nothing) {</p> <p> print "[ *** error: tried to insert object #",</p> <p> o, " after object #", a,</p> <p> ", whose parent is nothing. ***]";</p> <p> return;</p> <p> }</p> <p> </p> <p> move o to p;</p> <p> ia_shuffle_up(sibling(o), a);</p> <p>];```</p></div></td> |