... in Twine! (Erfahrungen, Hilfen, gemeinsame Projekte)

Der Anlaufpunkt für alle, die selbst ein Adventure programmieren wollen.
Garfield0001
Frischling
Frischling
Beiträge: 4
Registriert: 15.12.2021, 22:58

Re: ... in Twine! (Erfahrungen, Hilfen, gemeinsame Projekte)

Beitrag von Garfield0001 »

Ich hab gleich mal ein paar Fragen, die sich bei "meinem" Spiel auftun:

* ich möchte, dass in der UI-Bar keine "Zurück"-Schaltfläche ist (ohne das man UI-Bar ausblendet; wg speichern)
* falls das nur durch Ausblenden geht - gibt es andere Möglichkeiten, dem Nutzer das speichern zu ermöglichen? Vielleicht automatisch beim Schließen des Spiels?
* ich finde, das das Spiel am PC recht "breit" aussieht beim Text. Deshalb möchte ich dort gern einen rechten Rand haben - aber halt nur am PC. Kann man irgendwie einstellen, dass das beim PC so sein soll, bei Tablet und Handy aber nicht?
* Ich habe zwar ein Inventar, was aber nicht soo wirklich als "Inventar" angesehen werden muss wie in einem RPG. Die (Original-)Texte wurden so angepasst, dass über "If" immer gleich das passende angezeigt wird, aber so dass auch aus dem Text alles wichtige angezeigt wird (zb dass man "noch nicht" weiter kommt). Nun ist eine Stelle, wo der Spieler einige Hinweise zu einer Person bekommt. Damit der Spieler auch auf dieses "Wissen" zugreifen kann, sollte da zumindest die Möglichkeit bestehen, dass er sich das Wissen (jederzeit) anzeigen lassen kann. Wie kann ich das bewerkstelligen?
* ich habe eine Passage "PassageDone" in der ein (abgekupferter) Code steht, dass der Cursor automatisch in ein Textfeld springen soll. Aber - das klappt irgendwie nicht. Code kann ich noch posten. mit dem "autofocus" bei einem Textfeld scheint es auch nicht zu funktionieren. Oder könnten sich beide Dinge ins Gehege kommen?
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Re: ... in Twine! (Erfahrungen, Hilfen, gemeinsame Projekte)

Beitrag von DieFüchsin »

Tüdelü! Anscheinend ist meine Übersicht noch nicht veröffentlicht worden, das dauert wohl noch, aber hier ist schonmal eine Methodenkarte eines Kollegen: https://www.inklusive-medienarbeit.de/t ... ntscheide/

Und hier habe ich ein Twine über Twine gebastelt: https://johannajaniszewski.itch.io/wie- ... ne-benutzt


EDIT: Hier ist jetzt auch die Methodenkarte von mir mit ein paar Tipps und Tricks: https://www.tjfbg.de/ausserschulische-a ... er-gemacht
Zuletzt geändert von DieFüchsin am 21.01.2022, 15:01, insgesamt 1-mal geändert.
Danke, Adventuretreff! <3
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Re: ... in Twine! (Erfahrungen, Hilfen, gemeinsame Projekte)

Beitrag von DieFüchsin »

Garfield0001 hat geschrieben: 28.12.2021, 04:51 Ich hab gleich mal ein paar Fragen, die sich bei "meinem" Spiel auftun:

* ich möchte, dass in der UI-Bar keine "Zurück"-Schaltfläche ist (ohne das man UI-Bar ausblendet; wg speichern)
* falls das nur durch Ausblenden geht - gibt es andere Möglichkeiten, dem Nutzer das speichern zu ermöglichen? Vielleicht automatisch beim Schließen des Spiels?
* ich finde, das das Spiel am PC recht "breit" aussieht beim Text. Deshalb möchte ich dort gern einen rechten Rand haben - aber halt nur am PC. Kann man irgendwie einstellen, dass das beim PC so sein soll, bei Tablet und Handy aber nicht?
* Ich habe zwar ein Inventar, was aber nicht soo wirklich als "Inventar" angesehen werden muss wie in einem RPG. Die (Original-)Texte wurden so angepasst, dass über "If" immer gleich das passende angezeigt wird, aber so dass auch aus dem Text alles wichtige angezeigt wird (zb dass man "noch nicht" weiter kommt). Nun ist eine Stelle, wo der Spieler einige Hinweise zu einer Person bekommt. Damit der Spieler auch auf dieses "Wissen" zugreifen kann, sollte da zumindest die Möglichkeit bestehen, dass er sich das Wissen (jederzeit) anzeigen lassen kann. Wie kann ich das bewerkstelligen?
* ich habe eine Passage "PassageDone" in der ein (abgekupferter) Code steht, dass der Cursor automatisch in ein Textfeld springen soll. Aber - das klappt irgendwie nicht. Code kann ich noch posten. mit dem "autofocus" bei einem Textfeld scheint es auch nicht zu funktionieren. Oder könnten sich beide Dinge ins Gehege kommen?
Ich befürchte, dass man dafür ziemlich tief in die Trickkiste greifen müsste, und ohne eigenes Coding nicht weiterkommt. Ich empfehle, dass du in einem auf Twine spezialisierten Forum oder Discord nachfragst. Vielleicht wäre ein anderes Tool an der Stelle auch besser geeignet.
Danke, Adventuretreff! <3
Benutzeravatar
Esmeralda
Adventure-Gott
Adventure-Gott
Beiträge: 2719
Registriert: 01.04.2014, 11:23

Re: ... in Twine! (Erfahrungen, Hilfen, gemeinsame Projekte)

Beitrag von Esmeralda »

Garfield0001 hat geschrieben: 28.12.2021, 04:51 Ich hab gleich mal ein paar Fragen, die sich bei "meinem" Spiel auftun:

* ich möchte, dass in der UI-Bar keine "Zurück"-Schaltfläche ist (ohne das man UI-Bar ausblendet; wg speichern)
Ich weiß nicht, ob du den Teil schon gelöst hast. Ich hatte mir jetzt Twine auch ein wenig angeschaut und bin auch über die "undo" und "redo" Buttons gestolpert , die ich störend fand. (ich habe das voreingestellte Harlowe 3.2.3 benutzt)
Dazu habe ich den Hinweis gefunden, dass man die Zeilen:
tw-icon[alt="Undo"], tw-icon[alt="Redo"] {
display: none;
}
In das Stylesheet der Geschichte einfügen kann, dann sind sie weg.

Edit: funktioniert natürlich nicht bei dem von dir genutzen Sugarcube. #-o
Da folgende Zeile im Javascript der Geschichte einfügen:
config.history.controls = false;
Garfield0001
Frischling
Frischling
Beiträge: 4
Registriert: 15.12.2021, 22:58

Re: ... in Twine! (Erfahrungen, Hilfen, gemeinsame Projekte)

Beitrag von Garfield0001 »

"Edit: funktioniert natürlich nicht bei dem von dir genutzen Sugarcube. #-o
Da folgende Zeile im Javascript der Geschichte einfügen:
config.history.controls = false;"

Sehr gut. Ich danke dir wie verrückt
Benutzeravatar
Esmeralda
Adventure-Gott
Adventure-Gott
Beiträge: 2719
Registriert: 01.04.2014, 11:23

Re: ... in Twine! (Erfahrungen, Hilfen, gemeinsame Projekte)

Beitrag von Esmeralda »

Ich habe weiter mit Twine rumgespielt und bin jetzt auch auf SugarCube umgestiegen.
An sich finde ich die Syntax zum Aufrufen der Befehle bei Harlowe ein wenig eingängiger und die Formatierung der Texte über die Editorleiste ist natürlich bequemer, aber zum Einen will ich hier vielleicht mitreden können, zum anderen scheint es furchtbar knifflig zu sein, mit Harlowe ein Spiel mit möglicher Sprachauswahl hinzubekommen. (für SugarCube habe ich zumindest Skripte dafür gesehen, mich aber noch nicht näher damit beschäftigt)

Beim Einbinden von Audios hatte ich zunächst das Problem, dass die nicht abgespielt wurden, obwohl der (relative) Dateipfad richtig war. Ich weiß, dass, wenn man aus Twine direkt startet (also auf den Play Button drückt), relative Dateipfade, sei es für Bilder oder Audio, nicht funktionieren. Abhilfe schafft da ein Doppelklick auf die Datei im Ordner. Dann startet das Spiel im Browser und die Dateien werden geladen.
Ich habe dann nach einigem Suchen im Netz den "Fehler" gefunden. Es liegt am Browser - in meinem Fall Firefox. Dort wird das Abspielen von Audios blockiert, wenn nicht schon mit der Seite interagiert wurde. Deshalb habe ich eine Passage zum Spielstart mit einem Start-Button vorgeschaltet, nun geht's. Das nur als Info, falls sonst noch jemand mit dem Problem kämpft.

Für ein anderes, organisatorisches Problem habe ich noch keine Lösung gefunden. Ich würde gerne einen separaten Ordner anlegen, in den ich die Spieldatei und die Assets (Bilder und Sounds) stecken kann. Ansonsten wird es gerade mit den Assets unübersichtlich, wenn man mehrere Geschichten hat. Sobald ich aber einen neuen Ordner (innerhalb des Ordners "Geschichten") anlege und alles reinpacke, findet Twine meine Geschichte nicht mehr, wenn ich das Programm öffne. Ich habe es mit "aus Datei importieren" versucht, aber da bekomme ich die Geschichte nicht in den Editor zum Bearbeiten.
Kann mir da jemand die Tomaten von den Augen wischen?

Edit: es hilft auch nicht der Übersichtlichkeit, dass Twine zwei Ordner anlegt. Zuerst "Stories" und dann, wenn dem Programm auffällt, dass es auf Deutsch eingestellt ist, wird zum Speichern der Ordner "Geschichten" angelegt. Wobei ich nicht sicher bin, in welchem Ordner nun laufend gespeichert wird. Zuerst dachte ich in "Geschichten", jetzt als ich das Programm geschlossen und wieder geöffnet hatte, wurde der Fortschritt in "Stories" gespeichert... argl...

nochmal edit: Ok, ich habe jetzt den Ordner "Geschichten" gelöscht und es scheint in Stories zu speichern. Wenn ich aber die Geschichte nochmal in einen Unterordner packe und auf Importieren gehe, wird die Datei wieder direkt unter Stories abgelegt und auch die Datei dort auf dem Laufenden gehalten, während die Datei im Unterodner (die immernoch existiert) nicht upgedated wird. Also Importieren geht grundsätzlich schon, ist aber nicht die Lösung für mein organisatorisches Problem, wenn ich nicht dauernd selbst kopieren will... Wahrscheinlich ist es einfacher, für den Pfad der Assets einfach den Unterordner mit dem Spielnamen mit reinzunehmen und die Spieldatei außerhalb zu lassen...
Benutzeravatar
Esmeralda
Adventure-Gott
Adventure-Gott
Beiträge: 2719
Registriert: 01.04.2014, 11:23

Re: ... in Twine! (Erfahrungen, Hilfen, gemeinsame Projekte)

Beitrag von Esmeralda »

Nachdem ich weiter mit Twine und SugarCube rumgespielt habe (großes Dankeschön an DieFüchsin für die Tutorials), sehe ich mich in der Lage, die von mudge aufgeworfenen Fragen zu beantworten und evtl. sein angefangenes Tutorial fortzuführen.


Erstmal vorneweg, ich nutze die derzeit aktuelle Download-Version von Twine 2.3.16 und als Storyformat SugarCube 2.36.1

Zu den Bildern:
Twine erstellt im Ordner "Dokumente" einen Ordner "Twine" und darin einen Unterordner "Stories". Dort landen die Geschichten, die man erstellt.
Weil ich keine Bilder aus dem Netz verwenden möchte bzw. falls ich das tue, nicht darauf vertrauen möchte, dass die Links erhalten bleiben, packe ich alle Bilder und Sounds die ich nutzen möchte in Unterordner innerhalb des "Stories"-Ordners.
D.h. im Ordner "Stories" liegt meine Spieldatei, nennen wir sie mal kreativ "Mein Abenteuer", im gleichen Ordner liegt ein Unterordner, dem ich den gleichen Namen "Mein Abenteuer" gegeben habe, damit ich den Überblick behalte, welche Assets zu welcher Geschichte gehören. Innerhalb des Ordners "Mein Abenteuer" sind zwei Unterordner "Bild" und "Ton". Dort sind dann die jeweiligen Bild-/Sounddateien gespeichert. (Wenn das Spiel irgendwo hochgeladen wird (z.B. bei itch.io) oder weitergegeben werden soll, muss natürlich der Ordner "Mein Abenteuer" mit den Bildern/Sounds mit.)

Als Format bei den Bildern habe ich bisher .jpg, .png und .webp getestet, hat alles funktioniert. Wer etwas Bewegung im Bild haben möchte: .gif funktioniert sogar auch!

Bei den Sounddateien habe ich mich bei meinen Tests an .ogg und .mp3 gehalten.

Wenn ich nun ein Bild einbinden möchte, verwende ich nicht den url-Pfad, wie mudge das getan hat, schließlich sind die Bilder nicht im Netz, sondern auf meinem PC. Und weil das unabhängig von der Ordnerstruktur des jeweiligen Spielers funktionieren soll, verwendet einen relativen Pfad, also relativ zum Ort der Spieldatei. (wohin muss ich von der Spieldatei aus gehen, um das Bild zu finden)
Das würde bei mir jetzt so aussehen:
<img src="/Mein Abenteuer/Bild/Name.jpg"> Edit: der / vor Mein Abenteuer muss raus, den fügt die Forensoftware dazu.

Startet man die Geschichte aus Twine heraus, also indem man auf den "Play" Button drückt, sieht man das Bild nicht. Aus irgendeinem Grund funktionieren die relativen Pfade da nicht. Dem ist aber schnell abgeholfen: einfach den Ordner "Stories" öffnen und dort auf die Spieldatei doppelklicken. In meinem Fall auf "Mein Abenteuer.html". Und schon startet das Spiel im Browser und das Bild ist zu sehen.

Ist das Bild nicht in der passenden Größe, kann man noch als zusätzlich Angabe innerhalb des Aufrufs des Bildes den Parameter width, also Breite, mit reinnehmen. Am besten als Prozentangabe, damit da bei verschiedenen Auflösungsgrößen kein Chaos entsteht.
Beispiel:
<img src="/Mein Abenteuer/Bild/Name.jpg" width="50%"> Edit: der / vor Mein Abenteuer muss raus, den fügt die Forensoftware dazu.


Sound:
Sound funktioniert prinzipiell genauso, mit dem Unterschied, dass man hier die Datei erstmal in den Cache laden muss, damit sie abgespielt werden kann. Das funktioniert über eine Passage (mudge nannte sie Story-Kasten) die direkt bei Spielstart gelesen wird, aber im Spiel selbst nicht zu sehen ist.
Passagen erstellt man,
- indem man in den Text einer anderen Passage einen Link hierzu erstellt: Beispiel: Wir gehen Richtung [[Norden|Strandbar]]. ("Norden" wäre hier der Text, der angezeigt wird, "Strandbar" ist der Titel der neuen Passage, die im Editor erscheint.) Die beiden Passagen sind dann auch gleich mit einem Pfeil verbunden
- oder indem man auf den Button "+ Abschnitt" klickt. Hierdurch wird eine neue Passage ohne Verbindungen zu den bereits bestehenden Passagen erstellt.

Wir wollen keine Verbindung, also klicken wir auf "+ Abschnitt".
Die neue Passage öffnen wir und klicken in den Titelbereich (dort steht "Unbenannter Abschnitt") und geben der Passage den Titel: StoryInit
Die Schreibweise ist wichtig, also genauso, großes S und großes I, kein Abstand.

In diese Passage kann alles rein, was schon bei Spielstart geschehen soll. Dort können also auch Variablen gesetzt werden oder eben Audio vorgeladen.

In den Textbereich der StoryInit Passage schreiben wir den Befehl, das Audio vorzuladen:
<<cacheaudio "Name" "Dateipfad/Datei.mp3">>
Der Name ist frei wählbar, mit diesem Namen, wird das Audio später aufgerufen. Befehle, bzw. Makros werden in SugarCube mit zwei < begonnen und beendet.
Beispiel:
<<cacheaudio "Intro" "Mein Abenteuer/Ton/IrgendeineMusik.ogg">>

In der Passage, in der die Sounddatei spielen soll schreiben wir folgenden Befehl:
<<audio "Name" play>>
(bei mir statt "Name" dann "Intro")
soll der Sound in Schleife abgespielt werden fügen wir ein "loop" ein:
<<audio "Name" loop play>>
Will man an der Lautstärke drehen fügt man noch volume und eine Zahl ein. 1.0 wäre 100 % 0.5 50 % usw..
<<audio "Name" loop volume 0.4 play>>


Wie ich schon im Post zuvor geschrieben hatte, hat mein Browser sich geweigert, in der ersten Passage Ton abzuspielen. Das ist wohl eine Sicherheitseinstellung des Browsers. D.h. Ton wird erst gespielt, wenn schon mit der Seite interagiert wurde. D.h. Sound erst ab der zweiten Passage einfügen, dann wurde mit der ersten ja schon interagiert. (bei mir bestand die erste Passage z.B. nur aus einem Link zur zweiten)



Huiiiii das wurde jetzt schon viel länger, als ich eigentlich beabsichtigt hatte.

Deshalb erstmal nur kurz noch eine von mudges Fragen beantwortet:
mudge hat geschrieben: 06.09.2021, 21:23 Abschließend ein paar Fragen, für die ich selbst leider (noch) keine Antworten habe:

- Wie funktioniert das genau mit dem Text einfärben? Für einzelne Worte, ganze Sätze?
Textteile einfärben:
@@color:red; Dieser Text wird jetzt rot.@@

wobei statt "red" natürlich auch andere Farben gewählt werden können. Präziser geht es mit Farben im Format #000000 (das wäre schwarz). Diese Farbangaben bekommt man im Grafikprogramm seiner Wahl oder einfach in der Suchmaschine "color picker" eingeben.
Das ist ein @@color:#19fc00;Giftgrün@@.

Textfarbe für komplette Geschichte ändern:
Im Stylesheet einfügen:
body {
color:blue;
background-color: #ffec60;
}

wobei color: die Textfarbe angibt, background-color: die Hintergrundfarbe.

Nur einzelne Passagen ändern:
Den Passagen kann ein "Tag" zugewiesen werden (in der Bearbeitungsansicht der Passage auf Tag klicken, dann einen Namen eingeben und auf "add" klicken. Über diesen(dieses?) Tag kann die Passage (oder auch alle, die ebenfalls dieses Tag haben) angesteuert werden.
Im Stylesheet:
body.tag_name .passage {
color:red;
}
Heißt der Tag also vielleicht nacht, lautet die Ansprache: body.nacht .passage
Bei der Benennung der Tags funktionieren Großbuchstaben nicht, soweit ich das überblicke. Und Achtung, zwischen dem Tag-Namen und .passage ist ein Abstand.
Edit: gerade gesehen, es geht auch nur .nacht
Benutzeravatar
Esmeralda
Adventure-Gott
Adventure-Gott
Beiträge: 2719
Registriert: 01.04.2014, 11:23

Re: ... in Twine! (Erfahrungen, Hilfen, gemeinsame Projekte)

Beitrag von Esmeralda »

mudge hat geschrieben: 06.09.2021, 21:23 ...
- Wie kann sich die Story "merken", dass der Spieler einen Raum bereits betreten hat?
Wie die anderen schon geschrieben haben, funktioniert das über Variablen.

Man speichert eine Information in einer Variablen und kann dann diese Information wieder abfragen, in der Regel über eine "wenn"..."dann"-Abfrage. Im Englischen also "if".

In einer Variablen kann man verschiedene Infos speichern. Z.B. eine Zahl, einen Text (das heißt dann String) oder boolesche Variable (also eine Bedingung, die entweder wahr oder falsch sein kann).
D.h. wenn du eine Passage aufrufst, kannst du eine Variable z.B. auf "wahr" setzen. Später kannst du dann abfragen, ob diese Variable "wahr" ist, dann weißt du, dass du schonmal in dieser Passage warst.

Variablen haben bei SugarCube vor dem Namen immer ein Dollarzeichen $, wenn es eine Variable sein soll, die für die gesammte Geschichte gelten soll. Soll die Variable nur kurzfristig, für die Dauer der Anzeige einer Passage gelten, kommt von den Namen ein Unterstrich _
Wir wollen, dass die Info immernoch abrufbar ist, auch wenn wir zwischendurch andere Passagen besuchen, also brauchen wir eine globale Variable mit einem $.

Zuerst weisen wir der Variablen einen Anfangswert zu. Das kann man wunderbar in dem StoryInit-Passage machen. Und zwar mit dem Befehl <<set>>. Wir schreiben also:
<<set $Bar-besucht to false>>
Bar-besucht ist also der Name unserer Variablen, das Dollarzeichen zeigt dem Programm an, dass es eine Variable ist.

In der Passage "Bar" setzen wir die Variable auf wahr, also true.
Wir stellen die Variable erst um, nachdem der Text schon gerendert wurde. Bei dem Text fragen wir nämlich ab, ob die Variable wahr ist oder nicht und zeigen dann die entsprechenden Textzeilen.
Die Abfrage läuft nach dem Muster:
<<if>>
<<else>>
<</if>>
Also: Wenn, sonst, Ende.
(Möglich ist auch nach dem ersten <<if>> ein <<elseif>> das ist kein einfaches "sonst" sondern eine genaue Abfrage in der ein konkretes Ergebnis abgefragt wird.)
Unser Beispiel:
<<if $Bar-besucht is false>>Text, der beim ersten Besuch gezeigt werden soll.
<<else>> Text, der bei den weiteren Besuchen gezeigt werden soll.
<</if>>
Dann kommt die Umstellung auf wahr.
<<set $Bar-besucht to true>>
Beim nächsten Besuch ist also der Wert wahr, d.h. es wird der zweite Text gezeigt, weil die Bedingung nicht falsch ist, die erste Abfrage trifft also nicht zu, wir springen zum "sonst".

Man könnte statt wahr/falsch auch einen Zähler einbauen, der mitzählt, wie oft wir schon da waren.
Dazu würden wir der Variablen in der StoryInit Passage stattdessen eine Zahl zuweisen. Hier wohl eine 0.
<<set $Bar-besucht to 0>> (es geht übrigens auch "=" statt "to". Das einfache "=" wird beim Programmieren dazu verwendet, einen Wert zuzuweisen. Um abzufragen, ob etwas "gleich" ist, verwendet man "==")
In der Bar-Passage fragen wir nun wieder ab:
<<if $Bar-besucht == 0>>Text erster Besuch.\
<<elseif $Bar-besucht ==1>>Text zweiter Besuch.\
<<else>>Text für spätere Besuche.\
<</if>>
Dann erhöhen wir unseren Zähler:
<<set $Bar-besucht += 1>>
Edit: hier hatte ich versehentlich set $Bar-besucht +1 geschrieben. Das funktioniert nicht, weil wir wohl eine Zuweisung, also = oder to brauchen. Es muss also set $Bar-besucht = $Bar-besucht +1 heißen. Die Kurzform davon ist das "+="

Übrigens wird bei Sugarcube jede Zeile, auch die in der etwas steht, was gerade nicht zutrifft, bei der Darstellung des Textes mitgezählt. Um keine Leerzeilen zu haben, kann man hinter die Zeilen einen Backslash \ setzen. (hab ich im zweiten Beispiel eingefügt)
Zuletzt geändert von Esmeralda am 01.02.2022, 18:44, insgesamt 2-mal geändert.
Benutzeravatar
Esmeralda
Adventure-Gott
Adventure-Gott
Beiträge: 2719
Registriert: 01.04.2014, 11:23

Re: ... in Twine! (Erfahrungen, Hilfen, gemeinsame Projekte)

Beitrag von Esmeralda »

mudge hat geschrieben: 06.09.2021, 21:23 - Wie kann man ein Inventar anlegen?
In Twine erstellt man interaktive Geschichten. Das wirkliche Benutzen von Inventargegenstände kann ich mir hier gerade nicht vorstellen. Also nicht wie in einem Point & Click, bei dem ich einen Gegenstand ins Bild ziehe. Oder bei einem echten Textadventure, bei dem ich "benutze Schlüssel mit Schloss" eingebe. (Dafür bräuchte man ein Programm mit einem Text-Parser, z.B. Quest)

Man kann über <<if>> Abfragen kontrollieren, ob man einen Gegenstand hat und dann entsprechend Optionen zum Handeln anbieten, die dann in eine andere Passage führen bzw. den Text ändern.

Dabei kann man natürlich auch anzeigen, welche Gegenstände im Inventar sind.

Ich habe für meinen Test ein Inventar als Array angelegt. Ein Array ist quasi eine Sammlung von Variablen. Ich kann also die Namen meiner Inventargegenstände in ein Array stecken und auf sie zugreifen. Jeder Gegenstand erhält dabei auch automatisch eine Indexnummer, über die auch auf die Gegenstände zugegriffen werden kann.

Das Array habe ich wieder in der StoryInit Passage angelegt.
<<set $inventar to ["Schlüssel", "Lampe", "Kaugummi"]>>
Jetzt wären schon Gegenstände bei Start des Spiels im Inventar. Will man leer anfangen, lässt man den Raum zwischen den zwei eckigen Klammern leer:
<<set $inventar to []>>

Wenn ich überprüfen will, ob ein Gegenstand im Inventar ist, geht das über .includes()
Beispiel:
<<if $inventar.includes("Schlüssel")>>Ich stecke den Schlüssel in das Türschloss. Die Tür lässt sich öffnen und ich betrete den nächsten [[Raum|Folterkammer]].\
<<else>>Die Tür ist verschlossen. Ich könnte wirklich einen Schlüssel brauchen.\
<</if>>
Es wird also gefragt, ob "Schlüssel" in unserem Array enthalten ist. Falls ja, wird der entsprechende Text mit dem Link zu einer neuen Passage angezeigt. Falls nicht, der andere Text.

Will ich einen Gegenstand aufnehmen füge ich den Gegenstand meinem Array hinzu:
<<set $inventar.push("Weinflasche")>>

Zum entfernen nutze ich:
<<set $inventar.delete("Kaugummi")>>


Das Inventar kann auch im Spiel permanent angezeigt werden. Ich fand es am Sinnvollsten, dafür die Seitenleiste links zu nutzen.

Es gibt neben der Passage StoryInit noch andere spezielle Passagen, die besondere Funktionen erfüllen.
Die Passage StoryCaption kann genutzt werden, um Texte oder Bilder in der Seitenleiste anzuzeigen.
Also wieder eine neue Passage mit "+Abschnitt" erstellen. Diesmal geben wir ihr die Überschrift "StoryCaption"
Dort vielleicht eine Überschrift "Inventar" in den Textbereich einfügen. Z.B.
<h3>__Inventar__</h3> (h3 ist die drittgrößte Überschriftsgröße, die beiden Unterstriche rechts und links bewirken eine Unterstreichung)
Darunter kommt dann eine <<for>>-Schleife. Bei dieser Schleife wird auf den Index des Arrays zugegriffen und die im Array enthaltenen Gegenstände nach ihrer Indexnummer aufgelistet.

<<for _i = 0; _i < $inventar.length; _i+1>>
$inventar[_i]
<</for>>\

Dabei setzen wir eine Variable zum durchzählen "_i" fest (auf 0, weil die Zählung im Array nicht mit 1 sondern mit 0 beginnt), die immer um 1 erhöht wird, so dass wir auf den nächsten Gegenstand mit der nächsten Indexnummer zugreifen können. Die höchste Indexnummer, d.h. wieviele Gegenstände im Inventar sind, wird über .length abgefragt. Solange also _i kleiner als die höchste Indexnummer ist, erhöhen wir _i um 1, so dass wir genau bei der höchsten Indexnummer enden. Zugegriffen wird auf einzelne Gegenstände über die Indexnummer. So wäre also der erste Gegenstand im Array $inventar[0].
So werden alle im Moment vorhandenen Gegenstände untereinander aufgelistet.


Will man die Gegenstände einfach nebeneinander schreiben, braucht man die <<for>>-Schleife nicht. Dann würde:
$inventar
genügen, dann werden die Gegenstände nebeneinander aufgeführt.
Ist natürlich für die Seitenleiste ungeeignet. Aber es gibt auch die Passagen "PassageHeader" und "PassageFooter" mit denen man Text oder auch anderes auf jeder anderen Seite entweder als Kopfzeile oder Fußzeile einfügen kann.

Edit: ich habe gerade gesehen, dass ich ein paar mal das Dollarzeichen verfehlt und stattdessen das Paragraphenzeichen geschrieben hatte. Das habe ich verbessert. Sollte ich was übersehen haben - bei Variablen und auch Arrays immer $. Alles andere ist ein Typo.^^
Zuletzt geändert von Esmeralda am 01.02.2022, 09:33, insgesamt 2-mal geändert.
Benutzeravatar
Loma
Ultimatives Flascherl
Ultimatives Flascherl
Beiträge: 8058
Registriert: 21.07.2006, 16:47
Wohnort: Flascherl
Kontaktdaten:

Re: ... in Twine! (Erfahrungen, Hilfen, gemeinsame Projekte)

Beitrag von Loma »

Ich streue hier mal kurz einen dankbaren Zwischenapplaus ein. =D>

Ich glaube, für künftige Experimente lohnt sich wohl wirklich der Umstieg von Harlow zu SugarCube.
Ich denke, also spinn' ich.
Ich spinne, also mal' ich.
Ich male, also denk' ich.

"Never leave for the last minute what you can get away with not doing at all." (Pepe the King Prawn)
Benutzeravatar
mudge
Ohr-Meet-O-Loge
Ohr-Meet-O-Loge
Beiträge: 5660
Registriert: 30.11.2011, 22:40
Wohnort: Empathistan, Utopia

Re: ... in Twine! (Erfahrungen, Hilfen, gemeinsame Projekte)

Beitrag von mudge »

Liebe Esmeralda!

Herzlichen Dank für Deine (für viele!) hilfreichen Ausführungen! :D *umarmsmiley* =D> :D

Hatte mein Projekt schon wieder schleifen lassen, da es ja nicht so ging, wie ich gerne hätte.

Da hier nun (viel!) Gutes passiert ist, bin ich auch wieder motivierter. Danke dafür! :)

Hab schon ein paar hilfreiche Anmerkungen erspäht, die ich gleich verstehe:
Bilder ablegen, statt die URL eines Bildes via Browser zu nutzen - da hakte bei mir so früh ja auch etwas.

Bin gespannt, was Projekte so entstehen könn(t)en, wenn hier so wunderbare Hilfestellung möglich ist :D
Benutzeravatar
Kikimora
Adventure-Gott
Adventure-Gott
Beiträge: 3901
Registriert: 28.11.2006, 23:43
Wohnort: Zuhause

Re: ... in Twine! (Erfahrungen, Hilfen, gemeinsame Projekte)

Beitrag von Kikimora »

Ich bin jetzt auch schon mega gespannt auf das Ergebnis. Das klingt ja alles sehr ambitioniert. Und ich finde es interessant, dass du doch nachträglich auch auf SugarCube umgestiegen bist. Ich hatte mich damals direkt dafür entschieden wegen der erweiterten Möglichkeiten. Aber nachdem ich seit 2020 Twine nicht mehr angefasst habe, kann ich hier kaum helfen, weil ich das alles schon wieder vergessen habe.

Es hilft wirklich, einfach alles zu dokumentieren, während man es benutzt. :)
Kostenlose Game Jam-Adventures von The Argonauts (AT-Mitglieder) und weitere von mir: Hexenwerk
Benutzeravatar
Esmeralda
Adventure-Gott
Adventure-Gott
Beiträge: 2719
Registriert: 01.04.2014, 11:23

Re: ... in Twine! (Erfahrungen, Hilfen, gemeinsame Projekte)

Beitrag von Esmeralda »

Freut mich, wenn ich hier helfen und oder motivieren kann. Ob bei mir tatsächlich eine fertige Geschichte rauskommt, steht in den Sternen. Momentan macht mir eher das Rumprobieren Spaß.
Ich bin mir tatsächlich noch gar nicht im Klaren darüber, welche Funktionen SugarCube hergibt, die mit Harlowe nicht machbar sind. Jetzt mal abgesehen von der möglichen Mehrsprachigkeit, die ich mir eh noch nicht genauer angeschaut habe.
Alles was ich bisher ausprobiert und hier beschrieben habe, ging auch in Harlowe.
Umgestiegen bin ich hauptsächlich, um hier mitreden zu können... ^^ (und für zwei unterschiedliche Sprachen hat mein Hirn keinen Platz. Da ist ja schon das mühsam zusammengekratze Lua drin, das ich für Visionaire Studio brauche ;-) )
Benutzeravatar
Esmeralda
Adventure-Gott
Adventure-Gott
Beiträge: 2719
Registriert: 01.04.2014, 11:23

Re: ... in Twine! (Erfahrungen, Hilfen, gemeinsame Projekte)

Beitrag von Esmeralda »

Verlinken
Man kann Passagen mit den doppelten Eckigen Klammern verlinken [[Der Text erscheint|Dort geht es hin]] (wobei man statt des | auch -> Pfeile verwenden kann, und zwar in beide Richtungen. <- Immer dort, wo der Pfeil hinzeigt, ist der Name der Passage, wo wir hingebracht werden, auf der anderen Seite der Text, der gezeigt wird.)
Es gibt aber auch den Befehl <<link>><</link>> mit dem man Verlinken, aber auch noch nebenher andere Befehle, wie z.B. das Setzen von Variablen, ausführen kann.
Tatsächlich muss dabei der Link nicht zu einer anderen Passage führen. Daher solle man das <<link>> eher als ein <<click>> sehen (diesen Befehl gab es wohl früher bei Sugarcube). Es macht ein Wort oder einen Satz anklickbar und wir können andere Befehle ausführen.

Beispiel mit Weiterleitung zu einer Passage:
<<link [[Text|Name der Passage]]>><</link>>
oder auch
<<link "Text" "Name der Passage">><</link>>

Dazwischen könnte jetzt noch ein anderer Befehl gepackt werden:
<<link [[Text|Name der Passage]]>><<set $inventar.push("Türknauf")>><</link>>
Das würde uns zu einer anderen Passage bringen und gleichzeitig unserem Array $inventar einen weiteren Wert hinzufügen.

Mit <<link>> kann man auch Bilder klickbar machen:
<<link [img[Mein Abenteuer/Bild/name.jpg][Name Passage]>><</link>>

Beispeil ohne Weiterleitung zu einer Passage:
Du siehst<<link "ein leckeres Stück Kuchen">><<set $inventar.push("Kuchen")>><</link>>.
Hier wäre jetzt der Kuchen im Text als Link markiert, nach dem Draufklicken ist der Kuchen im Inventar.
Das wäre natürlich viel schöner, wenn dann auch noch ein Text erscheinen würde, der das verdeutlicht.

Dafür gibt es <<replace>> oder auch eine Kombination aus beiden Befehlen <<linkreplace>>

Beispiel <<linkreplace>>
Du siehst <<linkreplace "ein leckeres Stück Kuchen">>gar nichts mehr, weil du den Kuchen gegessen hast<<set $inventar.push("Kuchenkrümel")>><</linkreplace>>.
Hier wird der Satzteil "ein leckeres Stück Kuchen" nach dem Draufklicken ersetzt, die Kuchenkrümel wandern ins Inventar.

Allerdings wird der Link bei erneutem Besuch der Passage zurück gesetzt. Es ist dann wieder ein Kuchen da. D.h. will man das nicht, muss man alles nochmal in eine <<if>> Abfrage packen.

Beispiel <<link>> und <<replace>>
Das macht Sinn, wenn man nicht den Textteil ersetzen möchte, auf den man klickt. Dazu muss erst der Text, der ersetzt werden soll, markiert werden. Das macht man mit <span>. Span kann man entweder eine id oder eine class zuweisen. ID ist eine individuelle Markierung, eine Klasse kann ich mehreren Markierungen zuweisen. Beidem kann ich z.B. dann im Stylesheet eine besondere Formatierung zuweisen. Bei einer ID wird der Name zum Ansprechen mit # vor dem Namen markiert, eine Klasse mit . vor dem Namen.

Das ist mein Beispieltext, <span id="beispiel">den ich ersetzen will.</span>
(dem Textteil "den ich ersetzen will" habe ich jetzt die id "beispiel" zugewiesen.)

<<link "los geht's">> <<replace "#beispiel">>den ich schon ersetzt habe. Pass doch auf!<</replace>><</link>>

Ich kann jetzt auf "los geht's" klicken und der Satzteil weiter oben wird ersetzt.

Wechseln zu Passagen
Den Wechsel zu einer Passage mit den doppelten eckigen Klammern [[...]] kennen wir schon und den Wechsel über <<link>> jetzt auch.

<<goto>>
Es gibt auch die Möglichkeit, sofort zu wechseln, ohne dass nochmals geklickt werden muss. Das kann man nutzen, wenn man die Seite updaten möchte, z.B. weil man gerade eine Bedingung umgestellt hat und gleich den Effekt sehen möchte und nicht erst bis zum nächsten Besuch warten will.
Beispielsweise nehmen wir einen Gegenstand auf. Der soll jetzt in unserem Inventar erscheinen. Das tut er aber erst, nachdem die Seite erneut gerendert wurde, also neu geschrieben wurde. Das erreichen wir, indem wir kurz zu einer anderen Seite springen, dort vielleicht Bedingungen umstellen und wieder zurück springen, ohne dass der Spieler die neue Seite zu sehen bekommt.
Also wir befinden uns in der Passage mit dem Namen "Keller" unser Gegenstand im Text ist ein Link zu einer Passage namens "Schraubenzieher".
Du nimmst den [[Schraubenzieher]].
Wir springen zur Passage namens Schraubenzieher. Dort schreiben wir:
<<set $inventar.push("Schraubenzieher")>>
um den Gegenstand dem Inventar hinzuzufügen. Und jetzt springen wir sofort wieder zurück zu unserer Ausgangspassage mit:
<<goto "Keller">>

Man kann eine Seite auch auf sich selbst verlinken, dann wird sie auch erneut geschrieben. Das geht wunderbar innerhalb des <<link>>Befehles.

Du nimmst den <<link "Schraubenzieher">><<set $inventar.push("Schraubenzieher")>><<goto "Keller">><</link>>

Jetzt ist die Seite aufgefrischt, der Schraubenzieher im Inventar und der Link Schraubenzieher ist auch wieder da. Also müssen wir den in eine <<if>> Abfrage packen. Z.B. <<if $inventar.includes("Schraubenzieher")>>Text wenn der Schraubenzieher weg ist<<else>>Hier der oben stehende Text mit dem <<link>><</if>>.

<<return>>
Wenn wir auf eine Passage von mehreren Orten aus zugreifen können und immer dorthin zurückwollen, von wo wir kamen, ist <<return>> der richtige Weg.
Beispielsweise wollen wir in unserer Seitenleiste nicht nur das Inventar haben, sondern auch einen Link zu einem Logbuch, in dem wichtige Infos immer greifbar sein sollen.
D.h. wir packen in unsere Passage StoryCaption einen Link zu einer Passage, z.B. mit [[Logbuch]].
In der Passage Logbuch steht unser Text und als Rückkehrmöglichkeit z.B.:
<<return "zurück">>
Sichtbar ist das Wort "zurück", markiert als Link. Klicken wir darauf, kommen wir wieder in die Passage, wo wir herkamen.

<<choice>>
Mit <<choice>> bietet man eine einmalige Wahl an. D.h. der Spieler kann sich zwischen mehreren Links entscheiden. Hat er sich für einen entschieden, werden alle Links auf dieser Seite, die mit <<choice>> markiert sind, deaktiviert.

Beispiel:
<<choice [[Sag dem Typ, er soll verschwinden|Prügel]]>>
<<choice "Nimm das Angebot an" "Raubzug">>

(beide Schreibweisen gehen)
Benutzeravatar
Esmeralda
Adventure-Gott
Adventure-Gott
Beiträge: 2719
Registriert: 01.04.2014, 11:23

Re: ... in Twine! (Erfahrungen, Hilfen, gemeinsame Projekte)

Beitrag von Esmeralda »

Hier mal ein kleines Beispiel, was so alles möglich ist, wenn man weiß, was man tut... :-"
Ich bin beeindruckt:
https://kvella.itch.io/vibae

Der Entwickler will das Gerüst seines Spiels inklusive Dokumentation demnächst zur Verfügung stellen.
Antworten