Transkripte
1. Promotion: Bist du bereit, dein allererstes Spiel in
der Gudo-Game-Engine zu erstellen Oder möchten Sie
mehr darüber erfahren, wie Sie die Kontrollknoten der
grafischen Benutzeroberfläche
von GDO verwenden grafischen Benutzeroberfläche
von GDO Oder möchtest du dich
selbst herausfordern,
ein ganzes Spiel in einer einzigen Szene zu erstellen ein ganzes Spiel in einer einzigen Szene nur Kontrollknoten zu
verwenden In diesem Kurs werden wir alles
erkunden, Godo Gui Control-Nodes zu
bieten haben, indem wir ein
komplettes Spiel von Grund auf neu erstellen Es wird empfohlen, dass Sie Ihr eigenes Spiel
für dieses Projekt
entwerfen Ihr Spiel darf
nur eine Szene haben und nur
Gooey-Steuernotizen verwenden Wir beginnen mit der
Erstellung eines Titelbildschirms, einen Titel,
ein Hintergrundbild,
eine Startschaltfläche und Links zu
sozialen Medien
enthält , untersuchen die Vielzahl der Optionen, die
für jeden Knotentyp verfügbar sind Dann wechseln wir
zum Hauptspiel, fügen eine Menüleiste mit vielen
verschiedenen
Menüoptionen hinzu , darunter Symbole, Tastenkombinationen und Untermenüs, und
schreiben Skripte, mit denen Spielerdaten
und Einstellungen in Godos eigener
Skriptsprache GD Script
erstellt und verwaltet werden können und Einstellungen in Godos eigener
Skriptsprache Skriptsprache Wenn wir mit der Entwicklung
von
Spielmechaniken weitermachen, die
speziell auf mein Design Detail untersuchen zugeschnitten sind, werden
wir die restlichen Gudo'Guy-Kontrollknoten im , damit Sie
herausfinden können , wie Sie
sie auf Ihr Projekt anwenden können. Wenn du nicht weiterkommst,
ist
unser Discord-Server voll von anderen Studenten, Bastlern und professionellen
Spieleentwicklern, Spieleentwicklern Klicke auf den Link zur Website in
meinem Lehrerprofil, um Mitglied zu werden. Lass uns anfangen
, unser Spiel zu entwickeln.
2. Hallo Welt: Hallo Freunde. musst
du
die GDOGameEngine von gdongine.org
herunterladen Falls du das
noch nicht getan hast, musst
du
die GDOGameEngine von gdongine.org
herunterladen. Die Engine ist kostenlos, aber du kannst
spenden, um das Projekt zu unterstützen, Es gibt keinen
Installationsvorgang. Sie können die
komprimierte Datei einfach entpacken und öffnen. Stellen Sie sicher, dass Sie die
ausführbare Datei an einen besseren Ort verschieben. Das erste Startfenster ist eine Liste Ihrer aktuellen Projekte Wenn Sie jedoch noch
keine Projekte haben, werden
Sie aufgefordert, sich
Demo-Projekte anzusehen. Wir können das ignorieren
und einfach
unser eigenes neues Projekt erstellen , indem wir
entweder auf diese Schaltfläche in der Projektliste oder auf die Schaltfläche Erstellen oben im Fenster klicken. Hier können wir
unserem Projekt einen Namen geben
, der normalerweise
der Name Ihres Spiels wäre. Ich werde nur eine Einführung in
die Programmierung geben. Das Projekt muss
auf der Festplatte unseres Computers gespeichert werden , und wir erstellen einen neuen Ordner mit dem gleichen Namen
wie das Projekt Standardmäßig möchte es alles im
Dokumentenordner
speichern,
aber es wäre besser, einen neuen Unterordner für
Godot-Projekte zu erstellen einen neuen Unterordner für
Godot-Projekte Der Renderer ändert,
wie bestimmte zwei D - und drei D-Objekte gerendert
werden, aber wir werden nichts
zeichnen, sodass wir diese Optionen ignorieren können Der Renderer kann auch später geändert
werden. Und die
Versionskontrollkompatibilität mit Github ist
standardmäßig enthalten , wenn Sie damit Ihr Projekt
sichern oder mit anderen
teilen möchten Ihr Projekt
sichern oder mit anderen
teilen Wenn Sie bereit sind zu beginnen,
klicken Sie auf Erstellen und Bearbeiten. Das GDOEditor-Fenster
öffnet unser neu erstelltes
leeres Projekt Der Editor ist
in fünf Hauptdocks unterteilt. Eine Vorschau unseres Spiels
befindet sich in der Mitte. Das untere linke Dock
enthält einen Dateibrowser der den Inhalt des
Projektordners
anzeigt, den wir gerade erstellt haben. Es
enthält derzeit nur das Gado-Symbol. Das obere linke Dock
enthält den Szenenbaum, eine Liste von allem, was
sich in unserer aktuellen Szene ist derzeit leer, sodass wir einen
Stamm für den Szenenbaum erstellen Wir werden nichts zeichnen, also müssen wir nicht
angeben, ob es sich bei dieser Szene um
zwei D oder drei D oder um
eine Benutzeroberfläche handelt . Wir können also einfach einen anderen Knoten
auswählen. Es gibt viele verschiedene
Knoten, die wir erstellen können, aber wir sind nur daran
interessiert zu lernen, wie
man Skripte schreibt, also werden wir einfach
einen Standardknoten verwenden. Wir können unseren neuen Knoten umbenennen indem wir auf ihn klicken,
nachdem er
ausgewählt wurde , oder indem wir mit der rechten
Maustaste klicken, um
sein Kontextmenü zu öffnen , und Umbenennen
auswählen. Nennen wir diesen Knoten Lektion eins. Wenn Sie einen Knoten
im Szenenbaum auswählen werden seine Eigenschaften
im Inspektor angezeigt
, der an der
rechten Seite des Fensters angedockt ist Wir können den Namen des ausgewählten
Knotens und
seine Eigenschaften sehen, die
in erweiterbare Kategorien unterteilt
sind, aber keine dieser Eigenschaften aber keine dieser Eigenschaften trifft auf das zu,
was wir gerade Bevor wir etwas anderes tun, sollten
wir unsere neue Szene speichern, indem wir
entweder im Szenenmenü die Option Szene
speichern wählen oder
die
Tastenkombination Strg S oder Befehl
S verwenden . Dadurch wird ein
Dialogfeld geöffnet, in dem wir einen Namen für unsere
Szene mit der TSCNEtension
und einen Zielordner angeben
können und Lassen Sie uns einen neuen
Ordner für Lektion eins erstellen dann die Szene
in diesem Ordner speichern Wir können jetzt auf der Registerkarte
Dateisystem sehen, dass unser neuer Ordner für Lektion eins
erstellt wurde und dass er die Szene aus
Lektion 1 enthält, die mit
dem Clapperboard-Symbol gekennzeichnet ist Als Nächstes hängen wir ein Skript den Stammknoten unserer Szene
an, indem wir
entweder den Stammknoten auswählen und auf die
angehängte Skriptschaltfläche klicken oder indem wir mit
der
rechten Maustaste darauf klicken und das angehängte Skript auswählen Die Sprache ist GD Script, die
Programmiersprache die
wir lernen werden. Jedes Skript erbt standardmäßig von
dem Knotentyp, an den es
angehängt ist Da der Root-Node
ein Standard-Knotentyp ist, erbt
unser Skript vom Wir verwenden
weder eine Vorlage noch ein integriertes Skript, und wir können angeben, wo dieses Skript
innerhalb des Projekts gespeichert werden soll Lassen Sie uns das in
denselben Ordner legen. Lektion eins. Bei der Benennung von Skripten ist
es wichtig,
nicht willkürlich zu sein, sondern stattdessen den
Objekttyp oder das Verhalten zu beschreiben , das wir mit dem Skript
erzeugen. Nennen wir das also Hallo. Skripte haben die
Dateierweiterung dotGD. Klicken Sie anschließend auf Erstellen
, um das Skript zu erstellen. Dadurch wechselt unsere
Vorschau zur Skriptansicht unser neu
erstelltes Hello-Skript wird
angezeigt. Wir können unser Skript auch auf
der Registerkarte „Dateisystem“ sehen, das mit einem Zahnradsymbol
gekennzeichnet ist,
und im der Registerkarte „Dateisystem“ sehen, das mit einem Zahnradsymbol
gekennzeichnet ist, Stammknoten der ersten Lektion das Skriptsymbol angezeigt, das
uns zeigt ,
dass ein
Skript angehängt ist Wenn wir den Mauszeiger darüber bewegen, wird uns der Name des Wenn Sie auf dieses Symbol klicken,
wird das Skript auch geöffnet, sofern es
nicht bereits geöffnet Unser Skript hat nur eine Zeile, die seine
Vererbung vom
Basis-Knotentyp mit
dem Schlüsselwort extends beschreibt . Das bedeutet nur, dass unser
Skript alles kann, was ein Knoten kann, plus
alles, was wir hier schreiben. Es ermöglicht uns auch, das Verhalten des Knotens,
das bereits existiert,
mit neuen eigenen Verhaltensweisen zu
überschreiben Knotens,
das bereits existiert . Knoten haben zum Beispiel
eine Funktion namens ready, aber sie tut nichts. Wenn wir also möchten, dass unser Skript dieses Verhalten
, nichts zu tun,
außer Kraft setzt, können
wir unsere
eigene Funktion mit
dem gleichen Namen mit
dem Schlüsselwort funk deklarieren . Funk folgt dann
der Name der Funktion, der normalerweise in
kleiner Schlangenschreibung geschrieben wird,
was bedeutet, dass alle
Kleinbuchstaben Wörter
durch Unterstriche trennen Vielen der durch
Knoten definierten Funktionen wird ein Unterstrich vorangestellt
,
und der Name
muss exakt übereinstimmen, um das Verhalten
zu überschreiben zu den Namen der Funktion müssen Klammern und ein Doppelpunkt
folgen Wir werden später besprechen, warum. Wenn Sie nach dieser Zeile die Eingabetaste drücken, wird
die nächste Zeile automatisch um eine Ebene
eingerückt Auf diese Weise
weiß GD Script, welche Zeilen in der
Funktion enthalten
sind und wo sie enden Die Zeile ist rot hervorgehoben , da Funktionen
nicht leer sein dürfen. Es ist also eine gute Idee
, das Wort Pass zu schreiben , um neuen Funktionen einen
Körper zu geben, der nichts tut. Jetzt, da der Fehler behoben ist, können
wir dieses blaue Pfeilsymbol
vor der
Funktionsdeklaration sehen . Dabei handelt es sich um
das Override-Symbol, das
darauf hinweist, dass
dieses Skript jetzt das
Bereitschaftsverhalten unseres Nodes überschreibt Anstatt nichts zu tun, möchten
wir, dass unser Knoten Hallo sagt, was wir mit
einer Print-Anweisung tun können, die die Zeile
ersetzt, in der
zuvor Pass stand Die Print-Anweisung sieht einer
Funktionsdeklaration mit
einem Namen gefolgt von Klammern
ähnlich einem Namen gefolgt von Klammern da sie
eine eingebaute Funktion aufruft Diese Funktion
benötigt ein Argument, das in die
Klammern gesetzt wird Und dieses Argument wird
gedruckt. Mit Anführungszeichen
können wir alles schreiben, was wir wollen, und es wird von
unserem Skript ausgedruckt , wenn
der Knoten bereit ist. Da das Skript Hello heißt, wollen wir ein Verhalten erzeugen dass der Knoten Hallo sagt. unser Skript fertig ist, können
wir unser Spiel mit der Schaltfläche „Aktuelle Szene ausführen oben rechts oder mit
der Tastenkombination F sechs ausführen. Dadurch wird
ein leeres Fenster angezeigt, da unser Spiel nichts
zeichnet, aber es
öffnet auch das fünfte Dock, in dem das Ausgabefenster
angezeigt wird. Und in unserer Ausgabe
können wir sehen, dass unser Node die Worte Hello
World
gedruckt hat , als er fertig war. Wir können diese Simulation beenden,
indem wir das Fenster schließen, auf die Stopp-Schaltfläche
klicken oder die Tastenkombination F 8 verwenden. Wir können den
gedruckten Text so ändern, dass er
alles sagt, was wir wollen, und ihn erneut
ausführen, um sicherzustellen, dass unser Node
alles ausdrucken kann, was wir ihm sagen. Wir wissen jetzt, wie man
Skripte an Knoten anhängt und sie ausführt. In der nächsten Lektion werden wir etwas
über Konstanten und Variablen lernen über Konstanten und Variablen Wir sehen uns in der nächsten Lektion.
3. Konstanten und Variablen: Hallo Freunde. Wir beginnen
jede Lektion, indem wir zuerst einen neuen Ordner
für die Lektion
erstellen. Erstellen Sie dann eine neue Szene in diesem Ordner mit dem gleichen Namen. Doppelklicken Sie auf der Registerkarte Dateisystem auf eine Szene , um sie zu öffnen. mehrere Szenen geöffnet
sind, können wir zwischen ihnen wechseln,
indem wir
im Vorschaudokument auf die entsprechenden Tabs klicken. Heute werden wir
die Unterschiede zwischen
Konstanten und Variablen anhand von
Tagen als Bezugsrahmen erörtern Konstanten und Variablen anhand von
Tagen als Bezugsrahmen Lassen Sie uns also ein neues Skript an
den Stammknoten der
Szene anhängen und es Tage nennen Beginnen wir mit
Konstanten und deklarieren oben im Skript
mit dem Schlüsselwort const, gefolgt vom Namen
unserer neuen Konstante, die üblicherweise in Schlangengroßbuchstaben
geschrieben wird Eine Konstante ist wie ein Container in dem wir Informationen speichern können, aber diese Informationen dürfen sich
niemals ändern Etwas, das wir als
Konstante betrachten
würden , könnte die
Anzahl der Tage in der Woche sein. Da sie nicht geändert werden kann, muss ihr sofort ein
Wert zugewiesen werden, weshalb wir einen Fehler haben. Wir müssen dem Namen
ein Gleichheitszeichen folgen lassen, dem Zuweisungsoperator, um der Konstante einen Wert zu
geben. Die Anzahl der Tage in
der Woche beträgt sieben. Es ist vernünftig anzunehmen
, dass es immer sieben
sein werden und es ist für alle
gleich. Daher sollte es niemals
nötig sein, seinen Wert zu ändern. Umgekehrt haben wir Variablen, bei denen es sich auch um Container
zum Speichern von Informationen handelt, die
jedoch
so konzipiert sind, dass sie geändert werden können Wir können eine Variable auf
die gleiche Weise mit
dem Schlüsselwort VR deklarieren und ihr
dann einen Namen geben, ihr
dann einen Namen geben üblicherweise
in Kleinbuchstaben geschrieben wird. Das macht es einfach, den Unterschied
zwischen Konstanten und
Variablen in unseren Skripten zu
erkennen zwischen Konstanten und
Variablen in unseren Etwas, das
sich häufig ändert , könnte der Wert von heute Im Gegensatz zu Konstanten
dürfen Variablen leer sein. Lassen Sie uns die
Ready-Funktion
unseres Basisknotens überschreiben und die Werte sowohl für
die Anzahl der Wochentage als auch für den heutigen Tag ausgeben Wir können sehen, dass die Anzahl der
Tage in der Woche sieben beträgt, aber der Wert von heute
wird als Null ausgegeben,
was bedeutet, dass der Wert leer ist oder kein Wert vorhanden ist. Lassen Sie uns das beheben, indem wir den
heutigen Tag als Donnerstag initialisieren. Und wir können unsere Ausgabe
lesbarer machen , indem wir etwas Kontext hinzufügen, indem wir mit etwas
wie heute
beginnen, dann
ein Leerzeichen hinterlassen , danach ist ein
Pluszeichen, dann unsere Variable In diesem Fall wird das
Pluszeichen
verwendet, um zwei Satzteile aneinander
anzuhängen Wenn wir jedoch versuchen, dasselbe
mit unserer Konstante zu tun , führt
dies zu einem Fehler, da unsere Konstante eine
Zahl und kein Wort ist Als wir unsere Konstante deklariert
haben, haben wir ihr den Wert Sieben zugewiesen, was eine Zahl
ohne Dezimalstellen ist, die in der Mathematik als Ganzzahl
bezeichnet wird. Unsere Konstante hat also
eine Art Ganzzahl. Heute
wurde dagegen ein Wert zugewiesen, der aus
einigen Zeichen besteht, die in Anführungszeichen gesetzt sind. In der Programmierung
nennen wir das eine Zeichenfolge. Unsere Variable hat also
eine Art von Zeichenfolge. Der Plus-Operator
kann nur verwendet werden , wenn die Typen beider
Operanden kompatibel sind Wir können dies umgehen, indem wir eine eingebaute Funktion
verwenden, um den Typ, wie er hier verwendet
wird, in eine Zeichenfolge zu
ändern die Konstante als
Argument an die Funktion zu
übergeben Dadurch wird der Typ
der ursprünglichen Konstante nicht geändert,
sondern nur, wie sie hier
im Kontext
der Anfügeoperation verwendet wird im Kontext
der Anfügeoperation Und wir können auch danach mit einer weiteren
angehängten Zeichenfolge weiteren Kontext hinzufügen , wobei wir
daran denken müssen, ein
zusätzliches Leerzeichen am Anfang hinzuzufügen Jetzt können wir unsere Konstanten und
Variablen
ausdrucken , indem wir sie in leicht
verständlichen Sätzen Lassen Sie uns nach diesen Zeilen
so tun, als ob ein Tag vergeht. Wir können
unseren Skripten zusätzlichen Kontext hinzufügen , der von Spielern
nie gesehen wird, sondern nur dazu dient, uns als Entwickler zu
helfen unseren eigenen Code oder den von anderen geschriebenen
Code zu
verstehen Diese werden als
Kommentare bezeichnet und
mit dem
OctathorpPound-Zeichen oder dem Hashtag erstellt mit dem
OctathorpPound-Zeichen oder dem Hashtag Jeder Text, der nach diesem
Symbol geschrieben wird, wird grau
eingefärbt und hat keinerlei Auswirkungen auf die Ausführung
des Skripts Sie können sich in eigenen Zeilen oder am Ende einer Codezeile befinden. Lassen Sie uns also anhand eines Kommentars
erklären , dass wir
so tun, als ob zwischen dem Code über dieser Zeile
und
dem Code unten ein Tag vergangen Code über dieser Zeile
und
dem Code unten Wir ändern den
Wert von heute auf Freitag und drucken
einen weiteren Satz aus Heute ist plus Heute, was jetzt einen
anderen Wert hat. Wir können sehen, dass der Wert von
heute zuerst als
Donnerstag gedruckt und dann geändert wurde und der nächsten Zeile als
Freitag gedruckt
wird. Der Kommentar hatte keine Auswirkung
auf die Ausführung des Skripts. Wenn wir versuchen, den Wert
unserer Konstanten zu ändern, führt
dies natürlich zu einem Fehler, da Konstanten nicht geändert werden
dürfen Wenn wir einige
Codezeilen in unserem Skript nicht mehr
verwenden möchten , können
wir
sie einfach in Kommentare umwandeln, indem sie
markieren und Strg
K oder Befehl K drücken und das Kommentarsymbol vor jeder
hervorgehobenen Zeile
hinzufügen vor jeder
hervorgehobenen Zeile Durch erneutes Drücken werden die Kommentare
entfernt. Wir können den
Typ der Variablen
oder Konstanten angeben , indem wir nach dem Namen einen
Doppelpunkt hinzufügen. Gefolgt vom Typnamen wollen
wir auch diese
Konstante oder Variable einschränken. Beschränken wir unsere
Konstante auf den Typ int und heute auf
den Typ string. Neben Zeichenketten und Ganzzahlen
gibt es zwei weitere
primitive Typen, gibt es zwei weitere
primitive Typen wir zum Speichern
grundlegender Informationen verwenden können Wenn eine Zahl Dezimalstellen hat, handelt es sich nicht mehr um eine Ganzzahl,
sondern um einen anderen Typ,
der als Fließkommazahl bezeichnet wird
und sondern um einen anderen Typ,
der als Fließkommazahl bezeichnet wird den Typnamen float verwendet Fügen wir eine weitere Variable
für das heutige Datum hinzu und geben ihr eine Art
Fließkommazahl mit dem Wert 12,05,
was dem heutigen
Datum, dem 5. Dezember, entspricht Und der letzte Typ heißt Boolean und verwendet den
verkürzten Namen Boole
, der entweder
wahr oder falsch sein kann Also fügen wir eine weitere
Variable , ob
heute ein Feiertag ist oder nicht Ich beschränke das
auf einen booleschen Wert, gebe ihm
aber keinen
Anfangswert Fügen wir zwei weitere
Print-Anweisungen hinzu, um
die Werte dieser
Variablen mit Kontext auszudrucken die Werte dieser
Variablen mit Das heutige Datum ist ein Plus-Datum, und heute ist ein Feiertag. Colon Plus ist ein Feiertag. Wenn wir das jetzt ausführen, können wir unser Datum ausgedruckt
sehen, aber ist ein Feiertag falsch, obwohl wir ihm keinen Wert geben. Das liegt daran, dass alle primitiven
Typen einen Standardwert haben, aber der
Standardwert kann nur
zugewiesen werden , wenn wir
den Variablentyp angeben. Da wir angegeben haben, dass
ein Feiertag ein boolescher Wert ist, wurde
ihm
der Standardwert
für einen booleschen Wert zugewiesen , Der Standardwert
für eine Ganzzahl und eine
Fließkommazahl ist beide Null, und der Standardwert für eine Zeichenfolge ist nur
eine leere Zeichenfolge, die nicht mit Null identisch ist, sondern eine Zeichenfolge
ohne Zeichen Wenn wir den
Typ einer Variablen nicht angeben, ihr Standardwert Null, aber ihr kann
ein Wert eines beliebigen Typs zugewiesen werden, und ihr Typ kann
sich jederzeit ändern. Lassen Sie uns den Typ aus dem Datum entfernen. Geben Sie ihm dann einen neuen Wert vom 13.
Dezember und drucken Sie
ihn ein zweites Mal aus. Der Variablen wird zunächst ein Wert in Form einer
Fließkommazahl
zugewiesen, wird von der
Print-Anweisung verwendet, dann wird ihr ein Zeichenkettenwert zugewiesen bevor sie erneut ausgedruckt wird. Dies ist zulässig
, da GD Script eine lose typisierte Sprache
ist Dies bietet mehr Flexibilität
beim Schreiben unserer Skripte,
aber auch mehr
Verantwortung, um
Typkompatibilitätsfehler zu vermeiden , wie
wir sie beim Plus-Operator gesehen haben Es wird empfohlen, dass Sie Ihren
Variablen
immer einen Typ geben, nicht nur um Fehler zu vermeiden, sondern auch, um die
Effizienz der Ausführung
Ihrer Skripte zu verbessern . Wenn die Engine den
Typ Ihrer Variablen kennt, weiß sie auch genau wie viel Speicher sie belegen
muss. Dies gilt auch für die Verwendung von Konstanten anstelle von Variablen Wenn die Engine weiß, dass sich der
Wert nicht ändern kann, kann er
effizienter verwendet werden In der nächsten Lektion lernen
wir, wie wir den
Ablauf unserer Skripte steuern können. Wir sehen uns in der nächsten Lektion.
4. If-Erklärungen und Bedingungen: Hallo Freunde. Ich habe
bereits eine neue Szene in einem
neuen Ordner für diese Lektion
erstellt. Heute lernen wir
, wie wir den Ablauf
unserer Skripts steuern können, um
verschiedene Codezeilen auszuführen und
zu entscheiden, ob wir sehen können oder nicht. Lassen Sie uns also ein neues Skript an
den Stammknoten unserer
Szene anhängen und es Vision nennen. Wir werden unser
Skript starten, indem wir
die Basisknoten-Definition
der Ready-Funktion überschreiben die Basisknoten-Definition
der Ready-Funktion Die einfachste Methode zur Steuerung
des Ablaufs unserer Skripten
ist die I-Anweisung, die mit
dem Schlüsselwort I beginnt. Auf sie
folgt eine
bedingte Anweisung , die entweder wahr oder falsch
sein muss Lassen Sie uns zunächst „wahr“ sagen, worauf dann ein Doppelpunkt
folgt. Ähnlich wie der Doppelpunkt am Ende unserer
Funktionsdeklaration markiert
dies das Ende
der Anweisung,
und wenn Sie mit der nächsten Zeile fortfahren, wird
sie automatisch um eine weitere Ebene
eingerückt Alle Codezeilen, die auf
diese if-Anweisung folgen und eingerückt sind
, werden nur ausgeführt wenn die Bedingung der if-Anweisung
wahr ist Lassen Sie uns also so etwas
wie die Bedingung als
wahr ausdrucken und dann
die aktuelle Szene ausführen , um zu sehen, ob unsere
Print-Anweisung funktioniert Wenn wir wahr in falsch ändern, können
wir sehen, dass die Druckanweisung dieses Mal
übersprungen wird Wir können nach dem Hauptteil der
if-Anweisungen eine weitere
Zeile auf derselben Einzugsebene wie
die I-Anweisung hinzufügen Hauptteil der
if-Anweisungen eine weitere
Zeile auf derselben Einzugsebene wie
die I-Anweisung , einfach mit
dem Schlüsselwort s
gefolgt von Dadurch wird ein weiterer
Bedingungstext erstellt, der
nur ausgeführt wird , wenn die Bedingung
der ursprünglichen
I-Anweisung nicht erfüllt wurde Lassen Sie uns die
gedruckte Anweisung duplizieren und so ändern, dass sie
etwas anderes aussagt. Da die Bedingung falsch war, wurde
der se-Block
anstelle des I-Blocks ausgeführt. Und wenn wir die Bedingung
auf wahr ändern , passiert
das Gegenteil. Dies ist nicht sehr nützlich,
wenn wir immer wissen, dass das Ergebnis der bedingten Aussage wahr oder falsch ist, aber wir können
es durch eine Variable ersetzen. Deklarieren wir eine
boolesche Variable,
die angibt , ob das
Licht im Raum an ist oder nicht Boolesche Werte werden
üblicherweise
so benannt , dass sie
ihre Verwendung als Bedingung implizieren In diesem Fall bedeutet Licht ist an, je
nachdem, wie es benannt wurde, entweder wahr oder falsch Jetzt kann unsere if-Anweisung als Bedingung festlegen
, ob der Wert unserer
Variablen wahr ist
oder nicht Wenn wir zwei Werte vergleichen,
um festzustellen, ob sie gleich sind, verwenden
wir ein doppeltes Gleichheitszeichen, den
sogenannten Gleichheitsoperator, das sich von
einem einfachen Gleichheitszeichen unterscheidet das
wir zuvor als
Zuweisungsoperator verwendet haben. Wir drucken dann
entweder „Ich kann sehen“ oder „Ich kann nicht sehen“ aus, was
darauf zurückzuführen ist, ob das Licht an ist oder nicht, gleich wahr ist. Da der Standardwert
eines booleschen Werts falsch ist, können
wir die Ausgabe
so sehen, wie ich sie nicht sehen kann Aber wenn wir die
Variable auf true setzen, ändert
sie sich zu Ich kann sehen Da die Variable selbst ein
boolescher Wert ist , entweder wahr oder falsch, können
wir die
Vergleichsoperation ganz entfernen und einfach den booleschen Wert als Bedingung verwenden und genau
das gleiche Ergebnis erzielen Wir können den
Wert eines beliebigen booleschen Werts umkehren, d. h. wenn er wahr ist, falsch
oder wenn
er falsch ist, wird er
wahr, indem wir das Schlüsselwort not Wie bei der STR-Funktion, die wir in der vorherigen Lektion
verwendet haben, ändert
dies nur die Art und Weise, wie
sie
im lokalen Kontext verwendet wird , und ändert nicht wirklich den in der
Variablen gespeicherten Wert Wenn also nichts, Licht an ist, dann können wir nichts sehen
und sonst können wir sehen Nichts kann auch
durch ein Ausrufezeichen dargestellt werden. Lassen Sie uns den Wert der eingeschalteten
Lichter ändern und es erneut ausführen. Ich setze diese Änderungen dann wieder auf den vorherigen Stand zurück Wir können unsere Bedingungen
viel komplexer machen, indem mehrere Bedingungen mithilfe von logischen Operatoren
miteinander
kombinieren mithilfe von logischen Operatoren
miteinander Lassen Sie uns eine weitere Variable
mit dem Namen Has dark vision erstellen. Diese Variable impliziert
, dass wir auch dann sehen können
sollten , wenn das
Licht nicht an ist. Wir können also zu unseren
If-Aussagen die Bedingung hinzufügen, dass
entweder das Licht an ist
oder dass wir eine dunkle Sicht haben. Und wenn eine
dieser Bedingungen zutrifft, dann können wir sehen. Nur wenn beide
Bedingungen falsch sind, führt das dazu, dass wir
nicht sehen können? Was ist, wenn
wir
statt Dunkelsicht eine
Nachtsichtbrille tragen, da wir damit nur im Dunkeln
sehen können, aber
nicht im Licht den Variablennamen ändern, muss sich auch
der Zustand unserer
I-Anweisung ändern Denn wenn beide
Bedingungen zutreffen, sollten wir nichts
sehen können. Nur wenn die Werte dieser
beiden Bedingungen unterschiedlich sind, sollten wir dann davon ausgehen, dass die zu prüfende
Bedingung erfüllt ist? Wir können den Operator „ungleich“ verwenden , um zu überprüfen, ob die beiden Werte nicht gleich
sind. Wenn Sie
mit logischen Operationen vertraut sind, wird
dies in anderen
Sprachen als ausschließliches Oder bezeichnet Nur wenn entweder das Licht an
ist oder wir eine
Nachtsichtbrille tragen und nicht beides,
können wir dann sehen? Als Nächstes nehmen wir an, dass unsere hypothetische
Person möglicherweise kein Mensch
ist, und fügen eine Variable für die Anzahl der Is hinzu, die sie hat, die als Ganzzahl
dargestellt werden sollte Vorerst geben wir ihr
den Wert zwei Augen. die anderen Variablen ignorieren Was wäre die
Bedingung, die wir
setzen, um
anhand dieser Variablen sehen zu können, wenn wir die anderen Variablen Wenn die Anzahl unserer
Augen größer als Null ist, sollten wir sehen können Wir können dies auch
mit einem anderen Operator ausdrücken, größer oder gleich , und die rechte
Seite durch eins ersetzen. Sie müssen also Augen haben, die
größer oder gleich eins sind. Dies sind
Vergleichsoperatoren, die
ein boolesches Ergebnis zurückgeben , indem sie
den Wert von Zahlen auf
der linken und rechten Seite vergleichen den Wert von Zahlen auf
der linken und rechten Wir können logischerweise den Schluss ziehen , dass es für
jedes Lebewesen, ob Mensch oder
anderes, unmöglich sein sollte jedes Lebewesen, ob Mensch oder , eine
negative Anzahl von Augen zu haben Der Wert unserer
Variablen
sollte nur Null oder etwas
größer als Null Und die Bedingung
, sehen zu können, läuft
wirklich auf
diese beiden Optionen Haben wir keine Augen
oder Augen, die nicht Null sind? So wie die boolesche Variable implizit
als Bedingung verwendet werden
kann, kann auch
eine Ganzzahl auf diese
Weise verwendet werden, wobei Null falsche Bedingung und
alles andere als Null als wahr
betrachtet wird Dieselbe Logik wird auch auf
Fließkommazahlen angewendet. Wir können eine Float-Variable deklarieren, ihr den Namen
Sichtweite geben und
ihr einen beliebigen
Wert von 7,8 Metern geben. Wir können unsere
Vergleichsoperatoren verwenden, um festzustellen, ob diese Zahl größer als
kleiner oder gleich
einem bestimmten Wert ist , oder wir können sie implizit
in ihrer eigenen Bedingung verwenden wobei Null als falsch und alles andere als wahr angesehen
wird Was ist mit Saiten? Lassen Sie uns die Dinge etwas ändern und
eine Zeichenkettenvariable für das, was wir
gehört haben, deklarieren eine Zeichenkettenvariable für das, was wir
gehört haben und ihr den Wert
Bumps in the Night geben Dann könnten wir das logischerweise als
Wenn-Aussage verwenden als ob das, was ich gehört habe,
keine leere Zeichenfolge wäre, dann können wir sagen, ich habe
etwas gehört Ansonsten habe ich nichts gehört. Und genau wie bei den
anderen Variablentypen können
wir den Vergleich fallen lassen und die Variable selbst
als Bedingung
verwenden. Bei allen Variablen werden
ihre Standardwerte als falsch
betrachtet, und alles andere wird immer als wahr angesehen,
wenn es als Bedingung verwendet wird. Wenn wir eine Variable
ohne Typ deklarieren, nennen
wir sie so, wie
ich es mir ansehe, geben ihr
aber keinen Wert, dann wissen wir bereits, dass ihr
Standardwert Null sein wird. Auch ohne einen Typ oder Wert kann
jede Variable
als Mobbing-Bedingung verwendet werden Jede Variable, die leer ist,
was bedeutet, dass ihr Wert Null
ist, wird als falsch betrachtet Wenn wir diese
Variable mit einem Objekt auffüllen würden, würde ihr Wert als Bedingung als wahr angesehen Wir haben derzeit keine
anderen Objekte, mit denen wir spielen können, aber wir können uns immer selbst benutzen Lassen Sie uns also den
Wert dessen, was ich mir ansehe, auf
das Schlüsselwort self setzen. Und das führt dazu
, dass man sehen kann. In der nächsten Lektion werden wir
Schleifen verwenden , um
Codezeilen mehrmals zu wiederholen. Wir sehen uns in der nächsten Lektion.
5. While Loops und Operatoren: Hallo Freunde. Heute lernen wir, wie man
Codezeilen mit Schleifen
mehrfach wiederholt , indem wir uns eine Frau
vorstellen , die sich zum ersten Mal verliebt hat, eine Blume in der Hand hält Also lasst uns ein neues
Skript schreiben und es Blume nennen. Überschreiben Sie dann die
Basisknoten-Definition der Ready-Funktion. Unsere imaginäre Dame hält
eine Blume mit einer
Anzahl von Blütenblättern in der Hand, die wir
in einer Variablen speichern und ihren
Typ auf eine Ganzzahl einschränken werden. Dann gib ihr einen Wert mit
einer beliebigen Zahl, sagen
wir fünf. Wir werden auch eine weitere
Variable namens He Loves Me
als booleschen Wert deklarieren , von der wir
glauben, dass sie ihren
Standardwert falsch hat Wir können unser
Drehbuch beginnen, indem wir
eine Geschichte über die verliebte
Dame ausdrucken , die ihre Blume hält Sie entfernt jedes Blütenblatt nacheinander von
der Blume und
sagt, entweder er liebt
mich oder er liebt mich Zuerst müssen wir
die Anzahl der Blütenblätter
auf der Blüte um eins reduzieren die Anzahl der Blütenblätter
auf der Blüte um eins reduzieren Wir beginnen also mit der Variablen
Anzahl der Blütenblätter und verwenden
dann den Zuweisungsoperator, verwenden
dann den Zuweisungsoperator um der
Variablen einen neuen Wert zuzuweisen. Der Wert, den wir ihr
zuweisen wollen, ist die Zahl, die sie bereits
hat, minus eins. Dann wollen wir den
Wert der booleschen Variablen ändern. Er liebt es, wenn ich sein Gegenteil bin. Er liebt mich also, ist dazu bestimmt, nicht
zu sein. Er liebt mich, was den Wert von
falsch wahr umkehrt oder umgekehrt. Als Nächstes können wir
die Ergebnisse ausdrucken. Er liebt mich. Vielleicht möchten wir
diesen Teil in Anführungszeichen setzen, aber wenn wir versuchen, ein
Anführungszeichen in unsere Zeichenfolge zu setzen, markiert
es stattdessen
das Ende der Einige Sonderzeichen
wie Anführungszeichen
können innerhalb einer
Zeichenfolge mithilfe eines umgekehrten Schrägstrichs erstellt werden Wenn wir ein
umgekehrtes Anführungszeichen schreiben, steht
dies jetzt für ein
Anführungszeichen, nicht für das Ende der Zeichenfolge Und wir können
nach der Erklärung der Damen noch eine nach der Erklärung der Damen Lassen Sie uns diese
Zeile duplizieren und
die Erklärung dahingehend ändern ,
dass wir sagen: Er liebt mich nicht. Ein anderes Beispiel für ein
Sonderzeichen, das wir mit dem Backslash
schreiben können ,
ist der Backslash Wir können
die beiden
obigen Zeilen auch kombinieren und
sie mit dem Backslash N trennen, was eine neue Zeile darstellt. Sie werden also
von einer einzigen Druckanweisung aus
auf zwei Ausgabezeilen gedruckt Wir haben jetzt zwei Möglichkeiten
, die wir basierend auf dem Wert unserer booleschen
Variablen
ausdrucken möchten basierend auf dem Wert unserer booleschen
Variablen
ausdrucken Es scheint also, dass wir diese in eine if-Anweisung
packen sollten diese in eine if-Anweisung
packen Wenn er mich liebt, dann drucke das aus. Wenn er mich nicht liebt,
dann drucke das aus. Aber in Fällen, in denen
Anweisungen von einer einzigen booleschen Variablen abhängig
sind ,
um eine geringfügige Änderung vorzunehmen,
gibt es eine gibt es eine Kehren wir also zum ursprünglichen Format zurück
. Unsere Erklärung wird
sein, dass er mich liebt, wenn er mich liebt, sonst liebt er mich nicht. Dies ist nicht dasselbe wie
eine if-Anweisung , obwohl dieselben Schlüsselwörter
verwendet werden, sondern es wird als
ternäre Operation bezeichnet Da sie keinen neuen Codeblock
mit Einrückung erstellt , wird
sie tatsächlich
effizienter ausgeführt
und es wird empfohlen, sie in einfachen Fällen
wie diesem zu verwenden Wir können die Größe
der Variante sogar noch weiter
reduzieren ,
indem wir sie nur so ändern, dass sie entweder ein
Ausrufezeichen
oder ein Leerzeichen ist,
gefolgt von dem Wort nicht, dann das Das funktioniert für den
Fall, dass er mich liebt, aber wenn wir den
Wert standardmäßig auf true ändern, dann sehen wir nur
im anderen Fall nichts Genau wie in der Mathematik gibt es eine bestimmte Reihenfolge von Operationen ,
in der unsere Skripte
mehrere Operationen
in derselben Zeile ausführen . Da sowohl die Zeichenfolge append auch
der ternäre I Operatoren sind, muss
einer
vor dem anderen ausgeführt werden, und in diesem Fall ist es die Zeichenfolge Und genau wie in der Mathematik werden
Klammern immer
zuerst ausgeführt Wir können also jede
Operation in Klammern setzen, um sicherzustellen, dass sie in der Reihenfolge
der Operationen
zuerst ausgeführt wird . Wenn wir unsere ternäre
Anweisung in Klammern einschließen, wird
sie nun vor
dem Anhängen der Zeichenfolge ausgeführt und liefert uns das erwartete Ergebnis Jetzt haben wir also unseren Codeblock,
der
wiederholt werden muss, solange die
Blume noch Blütenblätter hat Mit dem Schlüsselwort WOW können
wir, ähnlich wie bei einer if-Anweisung, einen eingezogenen
Codeblock wiederholen , solange die
Bedingung wahr bleibt Die Bedingung in
diesem Fall ist, dass die Anzahl der Blütenblätter auf
der Blüte nicht Null ist Unabhängig von der Anzahl der
Blütenblätter auf der Blüte wird sie jedes Mal
um eins reduziert. Nach der Print-Anweisung kehrt der logische Ablauf dieses
Skripts zum Anfang
der WoW-Schleife zurück Anfang
der WoW-Schleife , um den Zustand erneut zu überprüfen. Wenn die Anzahl der
Blütenblätter Null erreicht, ist
die Bedingung nicht mehr
erfüllt und die Schleife wird unterbrochen, sodass mit dem Rest
des Skripts fortgefahren wird, falls vorhanden. Lassen Sie uns also
auf der Grundlage der Ergebnisse ein
kurzes Fazit
zu unserer Geschichte schreiben . Sie steht mit
Tränen in den Augen auf. Aber basierend auf dem endgültigen
Wert von He Loves Me ist
sie entweder glücklich oder traurig, und wir werden den
anderen Schlusssatz ausdrucken. Wenn wir diese Szene abspielen, können wir
unsere Geschichte
im Ausgabefeld ausgedruckt sehen , und mit fünf Blütenblättern ist
die Dame glücklich. Wenn wir die Anzahl
der Blütenblätter auf sechs ändern, erhalten wir ein
anderes Ergebnis, da die Schleife sechsmal statt
fünfmal wiederholt. Aber was passiert, wenn wir
die Anzahl der Blütenblätter
auf der Blüte auf Null ändern ? Die Schleife läuft überhaupt nicht
und die Liebe war
von Anfang an zum Scheitern verurteilt Ich empfehle nicht, diesem Beispiel zu
folgen, sondern einfach zu beobachten, was
passiert, wenn wir
der Blume eine negative
Anzahl von Blütenblättern geben der Blume eine negative
Anzahl von Blütenblättern Das ist zwar
realistischerweise unmöglich, in unserem Code ist es
sehr problematisch Da die Bedingung unserer
Wandschleife niemals erfüllt werden kann, wird
sie niemals kaputt gehen, und das Skript ist
darin gefangen und wird nie fertig Dies ist eine Endlosschleife und sollte um jeden Preis vermieden werden. In diesem Fall können wir
die Endlosschleife verhindern, indem wir
unsere Bedingung dahingehend ändern unsere Bedingung dahingehend die Anzahl der Blütenblätter größer als Null
ist, da eine negative Zahl
die Schleife immer noch unterbricht. Als Abkürzung können wir einen anderen Operator verwenden ,
um die Anzahl der
Blütenblätter zu reduzieren. Da wir
den Namen unserer Variablen nicht zweimal schreiben müssen , können
wir
mit einem speziellen
Zuweisungsoperator einfache
mathematische Operationen an
unserer Anzahl von Variablen ausführen unserer Anzahl von Variablen . In diesem Fall kann der Operator „
Minusgleichheit diese Codezeile so
ändern, dass die Anzahl der Blütenblätter
minus eins entspricht Diese Abkürzungen existieren für alle grundlegenden
Rechenoperationen plus Gleichem multiplizieren gleich
oder dividieren gleich und können mit jeder Zahl
oder Variablen als dem anderen Operanden verwendet werden alle grundlegenden
Rechenoperationen plus
Gleichem multiplizieren gleich
oder dividieren gleich
und können mit jeder Zahl
oder Variablen als dem anderen Operanden verwendet werden. gibt es noch einen weiteren Operator, Grundrechenarten gibt es noch einen weiteren Operator,
den Modulo-Operator,
der durch das Prozentzeichen dargestellt wird Modulus führt eine
Divisionsoperation durch, gibt
aber nicht
den Quotienten als Ergebnis zurück, wie es der Divisionsoperator Stattdessen gibt er den
Rest der Division zurück. Das gesamte Drehbuch bestimmt,
abgesehen von der Geschichte, die erzählt
wird, eigentlich nur,
ob es sich bei der Anzahl der Blütenblätter auf der Blüte um
eine gerade oder ungerade Zahl handelt, aber das geschieht auf die
ineffizienteste Art und Weise, jedes
einzelne Blütenblatt
heruntergezählt Lassen Sie uns also
die gesamte Wandschleife auskommentieren und stattdessen Modulus verwenden
, um den Prozess zu beschleunigen wissen, dass alle geraden Zahlen durch zwei teilbar
sind, können
wir die Anzahl der
Blütenblätter als Modul zwei verwenden Das einzig mögliche Ergebnis
als Rest dieser
Division ist entweder Null, wenn die Anzahl der Blütenblätter gerade ist oder eins, wenn die
Anzahl der Blütenblätter ungerade ist Unser Skript könnte also
dahingehend vereinfacht werden, dass
die Dame glücklich ist, wenn die Anzahl der Blütenblätter,
Modul
zwei, gleich eins ist Sonst ist sie traurig. Und da wir wissen, wie ganze Zahlen
als Bedingungen interpretiert werden, müssen
wir
die Vergleichsoperation
hier nicht einmal durchführen , sondern können sie einfach auf I, Anzahl der
Blütenblätter
, Modul zwei, verkürzen I, Anzahl der
Blütenblätter
, Modul Das Ergebnis der
Moduloperation
könnte direkt
der booleschen Variablen zugewiesen werden, um dasselbe Ergebnis zu erhalten , ohne dass eine if-Anweisung
erforderlich wäre, und die Null oder Eins wird automatisch in falsch oder wahr umgewandelt Und wir könnten noch weiter gehen, indem die Variable
entfernen
und einfach die Modulus-Operation direkt
in
der Turny-Anweisung verwenden Modulus-Operation direkt
in
der in In der nächsten Lektion werden
wir mehr über
Sammlungen
verwandter Variablen lernen Sammlungen
verwandter Variablen Wir sehen uns in der nächsten Lektion.
6. Arrays und For-Loops: Hallo Freunde. Heute werden wir darüber nachdenken, wie wir
große Mengen von Variablen organisieren können, insbesondere wenn sie
verwandte Informationen enthalten. Ich habe bereits ein Skript namens
Census erstellt
und die Basisknoten-Definition
der Ready-Funktion außer Kraft gesetzt Basisknoten-Definition
der Ready-Funktion Für unser hypothetisches
Szenario in dieser Lektion stellen
wir uns einen
Volkszähler vor, der aufzeichnen muss,
wie viele Menschen in
jedem Haus an einer einzigen Straße in seiner Stadt leben jedem Wir können eine einzige Variable deklarieren , die all diese Informationen wir Und der Typ dieser
Variablen wird ein Array sein. Ein Array kann eine Liste von
Variablen aller
anderen Typen enthalten . In diesem Fall handelt es sich den
gesuchten Variablen um Ganzzahlen, die die Anzahl
der
Personen angeben, die in jedem Haus leben Wir können den
Inhaltstyp
eines Arrays angeben , indem wir
eckige Klammern hinter
dem Typnamen array verwenden und
den Typ des Inhalts
in die eckigen Klammern setzen den Typ des Inhalts
in die eckigen Klammern Jetzt kann dieses Array nur
ganze Zahlen als Inhalt enthalten. Bevor wir auf den
Inhalt eines Arrays zugreifen können, muss
es eine Größe haben, die Anzahl der Variablen, die darin enthalten
sind Im Gegensatz zu anderen
Variablen sind Arrays komplexer und haben
ihre eigenen Funktionen Wir können auf diese Funktionen zugreifen, indem dem Namen der
Variablen einen Punkt und
dann den Namen der Funktion
folgen dann den Namen der Funktion In diesem Fall die
Resize-Funktion, die die Anzahl der
Adressen innerhalb dieses Arrays festlegt und die Anzahl der Häuser an
der Main Street
darstellt, von der wir sagen, dass sie sechs ist Unsere vorgestellte Stadt ist
insofern etwas ungewöhnlich die Hausnummern an der
Main Street bei Null beginnen Unser Volkszähler
beginnt also am Haus an der Main Street
Null und
klopft an die Tür,
um den Bewohner des Hauses zu fragen wie viele Menschen in
dem Haus
leben Wir können einen Wert in einem
Array speichern, beginnend mit seinem Namen, dann mit
eckigen Klammern die Adresse
der
spezifischen Ganzzahl markieren , in diesem Fall Adresse Null, und
dann den
Zuweisungsoperator verwenden Wir können dieser Adresse eine Ganzzahl
zuweisen. Nehmen wir an, in der
Hausnummer Null an der Main Street leben fünf
Personen. Auf dem Weg zum nächsten Haus an Main Street, Adresse Nummer eins, beantwortet
jemand das Klopfen
an der Tür und teilt dem Volkszähler mit, dass in diesem Haus zwei Personen leben Am nächsten Haus,
Adresse Nummer zwei, befindet sich
das Haus im Bau
und hat ein Verkaufsschild,
was bedeutet, dass dieses Haus eindeutig unbewohnt
ist, und unser Volkszähler registriert die Anzahl der Einwohner mit Null An der Hauptstraße Nummer drei niemand die Tür, obwohl in der Einfahrt ein Auto steht und
es Anzeichen von
Besiedlung Was sollten wir unserer Meinung der Volkszählung als
Zahl
der Wir könnten denken, dass
es Null sein könnte. Aber wie würden wir zwischen
einer unbekannten Anzahl von Bewohnern
und einem unbewohnten Haus
unterscheiden einer unbekannten Anzahl von Bewohnern
und einem unbewohnten Wenn wir bedenken, dass die
Zahl der Bewohner
eines Hauses niemals als negative Zahl
betrachtet werden sollte, könnten
wir die Zahl
negativ eins verwenden, um zu bedeuten, dass die Anzahl der Bewohner des
Hauses ein unbekannter Wert ist Und an der Main Street Nummer vier gibt es wieder keine
Antwort an der Tür Aber das Haus
scheint auch vernachlässigt zu sein, und wahrscheinlich hat
dort seit geraumer Zeit niemand mehr gelebt. Wir könnten annehmen, dass die
Anzahl der Bewohner Null ist vielleicht denselben negativen
Eins-Wert für eine unbekannte Anzahl
von Bewohnern verwenden Eins-Wert für eine unbekannte Anzahl oder negativere Wertcodes für
verschiedene Situationen erstellen,
wie z. B.
negative Zwei zu verwenden , um wahrscheinlich
unbewohnt, aber nicht bestätigt zu bedeuten Die Adresse Nummer fünf an der Main Street hat nicht
einmal ein Haus, aber es ist nur ein Also auch hier könnte dies mit einer Null
oder einem anderen negativen Wert
dargestellt werden , um eine Art von Besprechung zu
kodieren Lassen Sie uns die Ergebnisse der Volkszählung ausdrucken und sehen, wie sie
aussehen Wir können uns unser Array
als
kommagetrennte Liste von
Zahlen vorstellen , die in eckige Klammern gekapselt Dies stellt die Anzahl der Menschen
,
die
in jedem Haus an der Main Street leben, anständig dar Anzahl der Menschen
,
die
in jedem Haus an der Main Street leben Aber was wäre, wenn wir
diese Daten verwenden wollten , um
die Gesamtzahl der Bewohner aller Häuser
an der Main Street oder den Durchschnitt Wenn wir die Summe all
dieser Zahlen berechnen würden, die negative
Darstellung der unbekannten Zahlen die Ergebnisse verfälschen würde
die negative
Darstellung der unbekannten Zahlen die Ergebnisse verfälschen Einer der größten Vorteile der Verwendung
von Arrays zum Speichern verwandter Informationen auf diese Weise
besteht darin, wie einfach es ist, sie in einer Schleife
zu durchsuchen Mit dem Schlüsselwort vier schreiben
wir als Nächstes den Namen
einer neuen Variablen,
eine, die
jedes einzelne Element
innerhalb des Arrays repräsentiert , gefolgt vom Schlüsselwort in dann dem Namen des Arrays Handelt es sich bei
Anweisungen wie bei Funktionen um WA-Schleifen, folgt darauf ein Doppelpunkt und ein eingezogener Codeblock
, der wiederholt wird Diese Codezeilen
werden für jedes unserer sechs
Häuser an der Main Street
einmal wiederholt , und wir können dem
variablen Haus einen Namen geben, da es für den Zugriff auf
jedes einzelne Haus
innerhalb der Schleife verwendet wird jedes einzelne Haus
innerhalb der Schleife Nehmen wir an, wir wollen zunächst
die durchschnittliche Anzahl der Bewohner ermitteln die durchschnittliche Anzahl der Bewohner , die in einem bewohnten Haus leben Das würde bedeuten,
alle positiven Zahlen zu addieren und
dann durch die Anzahl der bewohnten Häuser zu dividieren Wir benötigen also drei
neue Variablen, eine für die Gesamtzahl
der Bewohner, weitere für die Anzahl
der bewohnten Häuser, beide als ganze Zahlen und eine Fließkommazahl
für den Durchschnitt Für jedes Haus in der Main Street können
wir überprüfen, ob das
Haus bewohnt ist, ob die Zahl, die
im Array an
dieser Adresse gespeichert ist, jetzt in
der Hausvariablen gespeichert ist, größer als
Null ist Wenn dies zutrifft, kann
die Gesamtzahl der
Bewohner in bewohnten Häusern von Haus zu Haus erhöht werden,
und die Anzahl der bewohnten
Häuser
kann um eins erhöht werden Nachdem alle sechs Häuser an der Main
Street überprüft wurden, wird die Schleife unterbrochen und wir haben
unsere beiden ganzen Zahlen. Wir können also den
Durchschnitt berechnen, indem wir
die Gesamtzahl der Bewohner
durch die Anzahl der
bewohnten Häuser teilen die Gesamtzahl der Bewohner
durch die Anzahl der
bewohnten Häuser Drucken Sie dann die Ergebnisse aus. Es gibt mehr bewohnte Häuser, plus bewohnte Häuser
an der Main Street, mit einem Durchschnitt von mehr Durchschnittsbewohnern plus
Bewohnern Aber wenn wir diesen Code ausführen, wird
der Durchschnitt
als Ganzzahl dargestellt, drei,
was, wie wir wissen, nicht korrekt ist, da es in
zwei bewohnten Häusern insgesamt
sieben Einwohner gibt , sollte
der Durchschnitt 3,5 Dies geschah,
weil wir
eine Divisionsoperation
mit zwei ganzen Zahlen durchgeführt haben ,
weil wir
eine Divisionsoperation
mit zwei ganzen Zahlen und das Ergebnis der Operation ebenfalls eine Ganzzahl sein
wird, obwohl wir sie
einer
Fließkommazahlvariablen zuweisen einer
Fließkommazahlvariablen Godot warnt auch davor, Ganzzahlen
in
Divisionsoperationen zu verwenden Um dieses Problem zu lösen, können wir
unsere Integer-Variablen
in ihren Deklarationen in
Fließkommazahlen ändern unsere Integer-Variablen , oder wir können ihren Typ
lokal ändern , bevor wir die
Division durchführen Ähnlich wie wir ganze Zahlen
vor dem Anhängen in Zeichenketten umgewandelt
haben, können wir eine Ganzzahl in eine Fließkommazahl
umwandeln,
bevor wir eine Division durchführen Das Ergebnis
der Division wird ebenfalls in eine
Fließkommazahl umgewandelt. Das Ändern des Typs einer Variablen auf diese Weise wird als Casting bezeichnet. Wir wandeln eine
Ganzzahl in eine Gleitkommazahl um. Jetzt können wir die Ergebnisse sehen, die wir mit einem Durchschnitt
von 3,5 Bewohnern
pro bewohntem Haus erwartet
hatten von 3,5 Bewohnern
pro bewohntem Haus Ein Vorteil von GD Script, da es sich um eine lose typisierte
Sprache handelt, besteht darin, dass wir unserer Variablen
nicht spezifizieren müssen,
einschließlich der
Typen, die in einem Array
enthalten sind Wenn wir zulassen, dass unser Array jede Art von Variablen
enthält, können
wir ändern, wie unser
Volkszählungsmitarbeiter Nehmen wir an, dass die Adresse Null bei fünf Bewohnern gleich
bleibt Adresse eins enthielt aber auch die Namen der beiden
Einwohner, die dort leben Anstatt die
Bewohner als Nummer zwei aufzuzeichnen, könnten
wir ihre
Namen in einer Zeichenfolge aufzeichnen Die Adresse Nummer eins an der Main Street wird also von Jordan
und Ashley Smith
besetzt Haus Nummer zwei war unbewohnt, was wir als Null
darstellen konnten Wir könnten aber auch
erwägen, es stattdessen
als booleschen Wert aufzuzeichnen und ihm den Wert False zu geben ,
was bedeutet, dass sich das Haus
im Bau befindet und
möglicherweise keine Bewohner haben kann Bei Nummer drei war
niemand zu Hause, aber es leben definitiv
Menschen dort Wir wissen einfach nicht, wie viele. Wir könnten
diesen Wert auch
als booleschen Wert speichern und
ihm den Wert true geben Bei Nummer vier
scheint es wirklich so, als ob dort niemand wohnt. Vielleicht möchten wir mit null Insassen
vermarkten. Bei Adresse Nummer fünf könnten
wir, da es dort nicht
einmal ein Haus gibt, da es dort nicht
einmal ein Haus gibt, in Betracht ziehen, Null als Wert zu
verwenden, da Null das
Fehlen eines Werts bedeutet Wir können das Schlüsselwort Null verwenden, um diesen Wert dem
Array an Adresse fünf
zuzuweisen. Jetzt
sieht unser gedrucktes Array ganz anders aus, enthält Variablen
aller Typen statt nur Ganzzahlen, und wir können mehr
Informationen daraus erkennen Arrays können sogar andere
Arrays als Inhalt enthalten. Lassen Sie uns also unsere
Namensliste von
einer einzelnen Zeichenfolge in ein
Array von Zeichenketten ändern einer einzelnen Zeichenfolge in ein
Array von Wir können dieses
Array gleichzeitig
mit eckigen Klammern erstellen und
es dann mit
einer durch Kommas getrennten Liste von
Zeichenketten als Inhalt füllen einer durch Kommas getrennten Liste von
Zeichenketten als Inhalt Wenn wir also wissen wollten, wie viele Menschen an der
Adresse eins an der Main Street leben, könnten
wir das als
Mainstreet one dot SIE ausdrucken In der nächsten Lektion werden
wir mehr darüber erfahren, wie
Arrays verwendet werden können, um
dynamischere Datensammlungen zu erstellen Wir sehen uns in der nächsten Lektion.
7. Stacks und Funktionen: Hallo Freunde. Heute werden wir auf unterschiedliche Weise
weiter mit
Arrays arbeiten unterschiedliche Weise
weiter mit
Arrays indem wir ein
Spiel von Old Made einrichten Ich habe bereits ein Skript namens
Old Made erstellt
und die Definition
der Basisknoten der Ready-Funktion außer Definition
der Basisknoten der Ready-Funktion Um Old Made spielen zu können, benötigen
wir ein Kartenspiel, das eine Sammlung von
Variablen ist , die wir in einem Array
speichern können Da sich das Spiel
Old Made nicht wirklich um die Farben
der Karten kümmert, können
wir diese Information ignorieren und jedes Element in der
Reihe muss nur
die Kartenrangfolge von Ass
bis König als Ganzzahl enthalten . Um unser Deck zu generieren, können
wir einen Vier-Loop-Modus verwenden. Aber anstatt die Vierer-Schleife
zu
verwenden , um durch ein Array zu iterieren, können wir
sie einfach verwenden, um unsere Kartenränge abzuzählen Beginnend mit vier können
wir
eine Variable deklarieren, die den Rang
einer Karte repräsentiert, gefolgt vom Schlüsselwort in, und dann eine Zahl angeben Wenn wir
King als Zahl betrachten würden, wäre das der 13. Rang. Lassen Sie uns vorerst einfach den Rang
ausdrucken , damit wir
sehen können, was passiert. Die Vierer-Schleife beginnt mit einem Rangwert bei Null
und zählt bis zu 12, wobei diese Schleife und die
Druckanweisung 13 Mal wiederholt werden. Aus Gründen der Vernunft könnte
es eine gute
Idee sein, könnte
es eine gute
Idee sein, Karte Nummer zwei durch Rang zwei darzustellen, sodass Ass eins und König 13 wäre ist zwar
sehr hilfreich, eine
Vierer-Schleife bei Null zu starten , um durch Arrays zu
iterieren, da ihre erste
Indexnummer Null ist, in diesem Fall ist
es nicht so hilfreich Wir können die Art und Weise ändern, wie
eine Viererschleife zählt, indem die 13 durch einen
Funktionsaufruf, range,
ersetzen Funktionsaufrufen
folgen Klammern, die Argumente
enthalten Die Argumente für
diese Funktion sind die Unter- und
Obergrenzen des Bereichs Die Untergrenze wird in den Bereich
aufgenommen, die Obergrenze
jedoch nicht. Bereich 114 wird also
alle Zahlen 1—13 enthalten, und wir können sehen, dass das in der Ausgabe
ausgedruckt wird Eine andere Möglichkeit, Informationen
zu einem Array
hinzuzufügen , anstatt die eckigen Klammern und
die
Indexnummer zu verwenden eckigen Klammern und
die , besteht darin, eine
Funktion namens append zu verwenden Diese Anfügefunktion akzeptiert ein Argument des Werts
, der dem Array hinzugefügt wird Dadurch wird der hinzugefügte
Wert an das Ende des Arrays gesetzt,
wo auch immer das sein mag Und da es in einem Kartenspiel vier von
jedem Rang gibt, eine für jede Farbe, sollten wir diese Codezeile
viermal für jeden Rang
wiederholen. Wir können das mit
weiteren vier Schleifen machen Diesmal beginnen wir bei
Null und zählen bis, aber ohne vier. das Deck ausdrucken, können wir
sehen, dass unser Array vier von
jeder Zahl 1—13 hat , also
insgesamt 52 Karten Aber um altmodisch zu spielen, wollen
wir
drei der Damen entfernen, oder in diesem Fall 12. also in unserer Vierer-Schleife, die sich durch
die Kartenfarben
iteriert, Lassen Sie uns also in unserer Vierer-Schleife, die sich durch
die Kartenfarben
iteriert, überprüfen, ob der Rang 12 ist Und in diesem speziellen Fall wollen
wir nur das Hinzufügen von
112 zulassen, wobei wir das Schlüsselwort break
verwenden, das Schlüsselwort break
verwenden um sofort
aus dieser Schleife auszubrechen Break beendet nur die Schleife mit
den meisten Einrückungen, in der
es sich gerade befindet Wir beenden also den Suit für Loop, aber nicht den Rang für Loop Dadurch wird
der Rang auf 13 erhöht und dem Deck werden
vier Dreizehner hinzugefügt Und wenn wir es ausprobieren, können wir
sehen, dass es nur 112 gibt. Das Erste, was in
unserem Spiel passiert, ist das Mischen
des Kartendecks, was im GD-Skript eine
einfache eingebaute
Funktion von Rayse ist einfache eingebaute
Funktion von Rayse Wir müssen diese Funktion nur
aufrufen
und schon können wir sehen, dass die Karten in unserem Deck gemischt
werden Außerdem benötigen wir
eine weitere Variable, eine Reihe von Kartenhänden, die unsere
Spieler repräsentieren Jede Hand innerhalb des Blatt-Arrays muss mehrere Karten enthalten, es handelt sich also auch um Arrays, die wir initialisieren müssen,
bevor wir sie verwenden können also von Null
bis vier zählen, können
wir eine neue
Hand an das Array anhängen Unsere Hand beginnt als leeres
Array, das
durch eckige Klammern dargestellt wird Wenn wir uns unser Kartendeck vorstellen, wobei
die Vorderseite der Karten die Seite mit Rang und Farbe ist,
die Rückseite der
Karte leer ist, dann könnten wir uns auch vorstellen, dass
das Deck verdeckt ist. Die Vorderseite der Reihe ist
die Unterseite des Decks, und die Rückseite der Reihe
ist die Oberseite des Decks. Das
Austeilen der Karten kann
durch iteratives Durchlaufen unseres Decks erfolgen, aber wir müssen nicht wirklich auf bestimmte Karten
verweisen,
da es eigentlich egal ist, um auf bestimmte Karten
verweisen,
da es eigentlich egal ist, welche es sich handelt, nur dass die Karte vom oberen Rand
des Decks genommen und einem Spieler
ausgehändigt Um also eine Karte von
der Oberseite des Decks zu entfernen, können
wir eine andere Funktion aufrufen Dieser heißt Pop Back. Es gibt nicht nur das
letzte Element im Array zurück, sondern entfernt
es auch aus dem Array. Wir wollen diese
Karte dann der Hand des Spielers hinzufügen und beginnen mit Spieler eins,
vorausgesetzt, Spieler
Null ist der Dealer. So wie wir
Popback verwenden können, um eine Karte zu entfernen, können
wir auch eine
Karte mit Pushback hinzufügen Die Karte, die wir
auf den Handrücken
des Spielers legen, ist dieselbe Karte, die wir
von der Rückseite des Wir können
diesen Funktionsaufruf also einfach
in die Klammern
des Funktionsaufrufs setzen diesen Funktionsaufruf also einfach
in die Klammern
des und
seinen Rückgabewert als
Argument für die Push-Funktion verwenden seinen Rückgabewert als
Argument für die Push-Funktion Die Verwendung von Pushback entspricht
exakt der Verwendung von append. Die Append-Funktion ist
ein Erbe von Zeichenketten, da sie normalerweise
als Zeichenarrays gespeichert werden,
während Push und Pop aus der Verwendung von Stacks oder Cues stammen , wie wir es Um unsere nächste Karte austeilen zu
können, müssen wir das
Blatt, an das ausgeteilt wird, erhöhen Also speichern wir das
in einer Variablen als Ganzzahl und geben ihr den
Anfangswert eins die Zahl in unserem
Array-Index durch unsere Variable ersetzen, müssen
wir sie um
eins erhöhen , nachdem jede Karte ausgeteilt Aber das wird natürlich
nur bis 51 zählen, und es gibt nicht so viele Hände Also müssen wir diese
Zahl jedes Mal, wenn
sie vier erreicht, auf Null zurückkehren . Dies kann mit
unserem Trustee-Modulo-Operator erreicht werden , bei dem die
Zuweisung von Hand auf
Modulus gleich vier Wenn wir jedoch möchten, dass
unser Code mit einer
beliebigen Anzahl von Spielern funktioniert, wäre
es besser, vier durch die Größe
unseres Hands-Arrays zu ersetzen vier durch die Größe
unseres Hands-Arrays Um zu sehen, wo wir uns bis jetzt befinden, drucken
wir unsere Hände aus,
indem wir durch
das Hands-Array iterieren und jedes einzelne
ausdrucken Drucken Sie dann das Deck aus. Wir können unsere vier Felder sehen
und das Deck ist leer Wir können sogar die
Anzahl der Spieler ändern und die Karten werden an
die richtige Anzahl von Händen verteilt. Unsere Bereitschaftsfunktion wird
ziemlich umfangreich. Wir können unseren Code
besser organisieren , indem wir
unsere eigenen Funktionen deklarieren Wir teilen unsere Logik
in kleine Teile auf und haben einen Abschnitt, der
unser erstes Kartendeck erstellt, einen, der die Hände des Spielers erstellt,
und
einen,
der die Karten die Hände des Spielers erstellt,
und
einen,
der die austeilt. Mit dem Schlüsselwort Funk können
wir jedem
dieser Codeblöcke
einen Namen geben , gefolgt von
Klammern und einem Deck initialisiert, Hände
initialisiert und Deal. Dann kann die Ready-Funktion
jede dieser
Funktionen nacheinander aufrufen jede dieser
Funktionen nacheinander Unsere Funktionen können auch Argumente
akzeptieren, z. B. die Anzahl der
Hände, die wir haben möchten. Übergeben wir vier als Argument. Um unsere Funktion so
zu schreiben, dass sie das Argument akzeptiert, müssen
wir einen
passenden Parameter
in die Klammern
der Funktionsdeklaration einfügen in die Klammern
der Funktionsdeklaration Ähnlich wie das Deklarieren einer Variablen hat
sie einen Namen und
optional auch Da wir dies verwenden,
um die Größe eines Arrays zu ändern, ist
es eine gute Idee,
es auf eine Ganzzahl zu beschränken Wir können dann den
Parameter innerhalb
der Funktion
genauso verwenden der Funktion
genauso , wie wir
jede andere Variable verwenden würden Das Letzte, was wir
tun müssen, um mit dem Spielen zu beginnen,
wäre , alle Paare
aus der Hand jedes Spielers zu entfernen. wir also jede
Hand in der Reihe der Hände durchgehen, können
wir eine weitere Funktion aufrufen um die Paare
aus dieser Hand zu entfernen, indem wir die Hand als Argument übergeben dieser Funktion
eine Definition geben, können
wir dann eine Hand
als Array-Parameter akzeptieren Wir müssen mit einer Variablen durch
die Hand iterieren. Nennen wir es Karte eins. Aber wir können aufhören, bevor
wir zur letzten Karte kommen. Also gehen wir nur von Null
auf die Größe der
Hand minus eins. Wir können dann auf die gleiche
Weise
ein zweites Mal
wiederholen , aber dieses Mal beginnen wir mit der Karte nach der
anderen und gehen bis zum Ende
der Handgröße Innerhalb dieser 24 Schleifen Karte eins und Karte zwei nun jedes einzigartige Kartenpaar enthalten
Karte eins und Karte zwei nun jedes einzigartige Kartenpaar
in unserer Hand, sodass wir
die beiden Karten leicht vergleichen können , um zu sehen,
ob sie zusammenpassen Wenn ja, können sie aus der Hand
genommen werden ,
beginnend mit Karte zwei. Wenn wir zuerst Karte eins entfernen würden, der Index von Karte würde sich dadurch der Index von Karte
zwei tatsächlich
ändern, da sich alle Karten um eine Position bewegen
würden. Wenn wir eine Übereinstimmung finden, wollen
wir
diese Schleife oder eine der beiden Schleifen nicht fortsetzen. Aber wir wollen
den gesamten Prozess erneut starten. Eine einfache Möglichkeit, dies zu tun,
wäre eine while-Schleife, eine boolesche Variable
, die angibt, ob wir ein Paar mit dem
Standardwert true
gefunden haben oder nicht ein Paar mit dem
Standardwert true
gefunden haben Wenn ein Paar gefunden wurde, können
wir es sofort auf
false setzen Dies ermöglicht es uns, in die Schleife
einzutreten, aber nicht hier zu bleiben, es sei denn, es wurde
ein Paar gefunden. In anderen Sprachen könntest du
das stattdessen mit einer
Do-Wile-Schleife machen Wenn wir ein Paar finden, können
wir die Variable auf true setzen dann auch aus
beiden Schleifen ausbrechen und
die Wile-Schleife zurücksetzen Wenn beide vier Schleifen abgeschlossen sind, ohne dass
ein passendes Paar gefunden wird, ist das
gefundene Paar falsch
und die Wa-Schleife wird unterbrochen Wir können unsere
Simulation wiederholt ausführen und sehen, dass keine Hand unserer Spieler jemals
passende Paare enthält
und die Spieler bereit sind, ihr altes
Mad-Spiel zu spielen In der nächsten Lektion werden wir eine andere Form
der Flusskontrolle
verwenden Wir sehen uns in der nächsten Lektion.
8. Anpassen und Zurückgeben: Hallo Freunde. Heute werden wir eine andere Form der Flusskontrolle , um komplexe Bedingungen zu vereinfachen. Ich habe bereits ein Skript mit dem Namen
months erstellt
und die Basisknoten-Definition
der Ready-Funktion Beginnen wir damit, eine Variable für den
aktuellen Monat zu
deklarieren und sie auf
Januar und eine zweite Variable für
die Anzahl der
Tage im Monat festzulegen Januar und eine zweite Variable , die standardmäßig auf Null gesetzt
wird Wir können einen einfachen
Satz ausdrucken, der besagt, dass die Anzahl der Tage
im Januar 31 ist Aber zuerst wollen wir unsere Variable
mit der Anzahl der Tage
füllen , die auf dem Wert des Monats
basiert Schreiben wir also eine Funktion
, die genau das kann. Weisen Sie die Anzahl der
Tage im Monat
zu, die von einer
Funktion zurückgegeben werden sollen,
die wir schreiben werden und die den
Monat als Argument akzeptiert. Um dieser Funktion
eine Definition zu geben den Monat als
Parameter vom Typ Zeichenfolge zu
akzeptieren, benötigt
sie auch eine weitere
Information , einen Rückgabetyp. Der
von einer Funktion zurückgegebene Wertetyp wird
hinter den Klammern mit
einem Bindestrich und einem größeren Zeichen,
einem Pfeil,
gefolgt vom Typnamen definiert hinter den Klammern mit
einem Bindestrich und einem größeren Zeichen,
einem Pfeil, gefolgt vom In diesem Fall handelt es sich um eine Ganzzahl, die die Anzahl
der Tage im Monat
darstellt Wenn wir keinen Rückgabetyp angeben
, der Rückgabetyp für jede Funktion ist
der Rückgabetyp für jede Funktion, die
wir schreiben, standardmäßig Null. Innerhalb unserer Funktion
müssen wir eine Ganzzahl zurückgeben, was bedeutet, dass wir
eine Ganzzahl über ihr deklarieren sollten , und sie muss die
Anzahl der Tage im Monat enthalten. Dann geben
wir am Ende
der Funktion den Wert zurück, der in
dieser Variablen enthalten ist. Zwischen diesen beiden Zeilen müssen
wir
unsere Variable mit
der richtigen Anzahl von
Tagen basierend auf dem Monat auffüllen der richtigen Anzahl von
Tagen basierend auf dem Monat Wenn der Monat Januar ist, dann ist die Anzahl der Tage 31. Wir haben bereits erfahren
, dass wir
mit dem Schlüsselwort se eine Alternative
anbieten können , aber das bietet uns nur zwei der 12 Optionen,
die wir benötigen. Wir können ein anderes Schlüsselwort verwenden, if, kurz für if, um
eine weitere Bedingung anzugeben , die
überprüft wird , ob die ursprüngliche
Bedingung falsch war. Wenn der
Monat also Februar ist, dann ist die Anzahl der Tage 28. Und wir können das so
oft wiederholen, wie wir müssen, für
jede Möglichkeit ein Argument
liefern. Viele dieser Optionen
führen jedoch zum gleichen Ergebnis, entweder 30 Tage oder 31 Tage. Wir könnten
die Effizienz dieser
WF-Anweisung erheblich verbessern , indem wir
das häufigste Ergebnis,
31 Tage als
Standardfall, kombinieren 31 Tage als und ersetzen am Ende alle
durch
ein einziges anderes
Schlüsselwort Wenn der Monat nicht Februar
oder irgendein Monat mit 30 Tagen ist, dann muss die Anzahl der
Tage 31 sein Alle Fälle, die zu 30 Tagen führen
, können auch
mit dem Operator or zu einer einzigen Aussage
zusammengefasst werden . Wenn der Monat September ist oder wenn der Monat April ist oder
wenn der Monat Juni ist, oder wenn der Monat November ist, dann ist die Anzahl der Tage 30. Aber die Aussage ist ziemlich lang. Bei mehr Fällen kann es vom Bildschirm aus
ablaufen. Für einfache, fallweise
Anweisungen wie diese gibt es ein klareres
und einfacher zu verwendendes Schlüsselwort als die
I-Anweisung namens match. Match folgt
der Name einer Variablen,
ein Doppelpunkt und dann ein
eingezogener Codeblock Innerhalb eines Match-Blocks können
wir eine beliebige Anzahl von
Sonderfällen für den
Wert der Variablen angeben Sonderfällen für den
Wert der Variablen Fangen wir mit Februar an. die Groß- und Kleinschreibung folgen außerdem ein Doppelpunkt und ein
weiterer eingezogener Codeblock Dieser Code wird nur ausgeführt wenn der Wert des
Monats Februar ist Wir können Fälle
in einer durch Kommas getrennten Liste zusammenfassen. So lässt
sich die
Bedingung, dass wir nur noch eine
Liste von vier Monaten angeben, zusammenfassen Wenn der Wert des Monats
September, April, Juni
oder November ist, dann wird die Anzahl
der Tage auf 30 gesetzt, und unser Block kann durch
einen Platzhalter ersetzt
werden , der durch einen Unterstrich dargestellt
wird, wodurch die Anzahl der Tage auf 31
gesetzt wird, falls der Wert
des Monats etwas
anderes ist, das oben nicht angegeben wurde Dies entspricht der Verwendung der
Standardeinstellung in anderen Sprachen. Jeder dieser
Codeblöcke wird als Branches bezeichnet. Und im GD-Skript führt eine
Match-Anweisung
immer nur den
obersten Zweig , dessen Bedingung erfüllt wurde In anderen Sprachen
ähnelt dies einer
Switch-Anweisung, unterscheidet sich
jedoch darin, dass
Switch-Anweisungen mehr als einen Zweig
ausführen können mehr als einen Zweig
ausführen wenn mehrere Bedingungen erfüllt sind Aufgrund dieser Einschränkung ist
es nicht erforderlich, Unterbrechungen in Match-Verzweigungen einzufügen. Wenn wir
die Anzahl der Tage
in jedem Monat ausdrucken wollten , würden
wir wahrscheinlich eine Schleife verwenden
wollen,
aber wir können
eine Zeichenfolge wie Januar nicht einfach
zählen oder inkrementieren , sodass sie
irgendwie Februar wird Daher ist es im Code üblich
, Dinge, die
in
einer sequentiellen Reihenfolge existieren, in
eine nummerierte Liste
aufzunehmen, die als , Dinge, die
in
einer sequentiellen Reihenfolge existieren, in eine nummerierte Liste
aufzunehmen, Aufzählung bezeichnet wird Eine Aufzählung im GD-Skript ist nur eine Gruppe verwandter Konstanten Wir könnten also eine Konstante
für Januar mit einem Wert von eins haben , andere für Februar mit
einem Wert von zwei usw. Aber mit dem Schlüsselwort Enum können
wir die
Gruppe von Konstanten benennen, sie Monate
gefolgt von geschweiften Innerhalb der geschweiften Klammern können wir die Konstanten
gruppieren, und ihnen
wird jeweils
automatisch eine Zahl zugewiesen , die auf ihrer
Position in dieser Liste basiert Alles, was
in den geschweiften Klammern enthalten , muss
nicht in einer Zeile
bleiben und kann in ein
beliebiges Format aufgeteilt werden , um es
lesbarer zu machen Einrückungen spielen hier keine Rolle, aber wenn
etwas in geschweiften Klammern geschrieben wird, ziehen die
meisten Programmierer normalerweise den Inhalt ein
, sodass es Ich bevorzuge zwar, dass die geschweiften Klammern
vertikal angeordnet sind, aber
viele Programmierer ziehen es vor, die öffnende Klammer so in
die Deklarationszeile zu setzen öffnende Klammer so in
die Deklarationszeile Genau wie bei Constance werden
Aufzählungseinträge üblicherweise Da wir nun eine Aufzählung haben, kann
der Monat auf den Typ dieser Aufzählung
beschränkt werden Typ dieser Aufzählung
beschränkt Wir können ihm auch einen
Wert aus der Aufzählung zuweisen, beginnend mit seinem Namen,
gefolgt von einem Punkt dann dem Eintrag in der Liste Der Monat, der an
die Zeichenkettenausgabe angehängt wird, ist selbst keine Zeichenfolge mehr und muss in eine Zeichenfolge
umgewandelt werden , bevor
er angehängt werden kann Das Argument, das an
die Anzahl der Tage übergeben wird , ist keine Zeichenfolge mehr , sondern ein Monat, und wir können unsere Funktion so ändern ein Monat als
Parameter
akzeptiert Da Monat jetzt ein
Monat und keine Zeichenfolge ist, müssen
wir
unsere Bedingungen so ändern, dass sie übereinstimmen indem wir den Namen der Aufzählung
gefolgt von einem Punkt dann die Einträge in der Liste Aber wenn wir die Ergebnisse
ausdrucken, sehen
wir, dass
unser Monat nicht als Januar, sondern als Zahl Null geschrieben wird Der Typ unserer
Variablen ist zwar ein Monat,
also eine Aufzählung, der tatsächliche Wert wird als Ganzzahl
behandelt, seine Position innerhalb
der Aufzählung Da Januar
der erste Eintrag ist, ist
sein Wert als Ganzzahl Null Februar wäre
eins und so weiter. Auf diese Weise können wir
den Wert des Monats mit
einfacher Arithmetik ändern , sodass aus Januar plus eins Wenn wir diesen Code in eine
Schleife einbinden, die sich 12 Mal wiederholt, können
wir problemlos durch
alle 12 Monate iterieren Aber wie wäre es, den
Namen des Monats als Zeichenfolge zu schreiben? Wir könnten das auf
verschiedene Arten tun. Unser Aufzählungstyp hat
eine Eigenschaft namens keys, bei der es sich um alle unsere Einträge
als ein Array von Zeichenketten Wenn wir dieses Array
mit unserer Integer-Variablen indizieren
, erhalten wir den Eintragsnamen als Zeichenfolge
, die dieser Zahl entspricht Aber wenn wir uns an die Namenskonvention für
Großbuchstaben halten, möchten wir den Namen vielleicht nicht auf diese Weise
ausdrucken. Wir könnten stattdessen all
unsere Aufzählungsschlüssel in
Pascal-Groß- und Kleinschreibung umbenennen , oder wir könnten eine
Konstante deklarieren ,
die das Array von Zeichenketten enthält all unsere Monatsnamen in einem besser lesbaren Format enthält. Verwenden Sie dann den Monat als
Index für dieses Array. Eine andere Sache, die wir
mit Aufzählungen tun können, ist die Werte der Einträge
manuell mit
dem
Zuweisungsoperator festzulegen Einträge
manuell mit
dem
Zuweisungsoperator Nehmen wir an, wir möchten
, dass der Januar eins statt Null ist. Bei den übrigen Einträgen
werden die Werte automatisch aktualisiert, sodass der Wert von eins
erhöht wird, sodass der Februar jetzt zwei ist Dies entspricht jedoch nicht mehr
den konstanten Array-Indizes. Wenn wir
dies also verwenden wollten , um den
Namen der Monate zu schreiben, müssten
wir entweder
einen leeren Eintrag für den Index Null hinzufügen oder einen vom Monat
subtrahieren, der Indexierung des Arrays verwendet
wird In der nächsten Lektion
erfahren wir mehr darüber, wie die Engine unsere Skripte verwendet und
ausführt Wir sehen uns in der nächsten Lektion.
9. Szenenbaum und Vererbung: Hallo Freunde. Heute erfahren
wir wie die Engine den
Szenenbaum verwendet, um unsere Skripte auszuführen. Ich habe noch
kein Skript an den
Stammknoten des Szenenbaums angehängt , aber wir beginnen diese
Lektion stattdessen damit, weitere Knoten hinzuzufügen. rechten Maustaste auf den Wurzelknoten und wählen Sie
dann „Untergeordneten Knoten hinzufügen“, was immer noch ein normaler Knoten ist. Wir können ihn in Präsident umbenennen und so tun, als wäre unser Szenebaum
die Struktur eines Unternehmens Der President-Knoten ist eingerückt , weil er ein untergeordnetes Element des Stammknotens
der Szene Wenn ein Knoten ausgewählt ist, können
wir auch
die Tastenkombination Strg
A oder Befehl A verwenden , um einen weiteren untergeordneten Knoten hinzuzufügen Nennen wir diesen einen
Operations Manager, und er hat
eine andere Ebene, weil er
ein Kind des Präsidenten ist Lassen Sie uns nun ein neues Skript an
den President-Knoten anhängen und es Employee nennen Wenn wir die
Basisknoten-Definition der
Ready-Funktion außer Kraft
setzen, können wir einfach den Namen
dieses Knotens ausgeben und append ist Dieses Skript kann an mehr als einen
Knoten angehängt werden. Fügen wir dasselbe Skript dem Operations
Manager-Knoten
hinzu , indem wir es von
der Registerkarte Dateisystem in
den Szenenbaum ziehen der Registerkarte Dateisystem in
den Szenenbaum Führen Sie dann die Szene aus
, um zu sehen, was passiert. Wir können sehen, dass der
Betriebsleiter bereit ist, dann ist der Präsident bereit. Beide Knoten, an die das Skript
angehängt ist, führen das Skript aus, und da sie
unterschiedliche Namen haben, war
die Ausgabe unterschiedlich. Wir können auch sehen, dass
der Betriebsleiter bereit
war, bevor der
Präsident bereit war. Um zu verstehen, warum,
müssen wir mehr Mitarbeiter einstellen. Der Betriebsleiter wird eine Reihe von Betreibern
beaufsichtigen Also füge ich dem Operations Manager einen weiteren
untergeordneten Knoten hinzu und nenne ihn Operator One Hängen Sie dann das Mitarbeiterskript an. Wir können mit der rechten Maustaste
auf einen beliebigen Knoten außer
dem Stammknoten klicken und
Duplizieren auswählen , um
eine Kopie davon zu erstellen. Der Name der Duplikate wird automatisch um
eine steigende Zahl
erweitert, sodass wir Operator zwei, drei und vier usw. verwenden können Da an den Knoten, den wir dupliziert haben, ein Skript angehängt
war, ist an die erstellten Kopien auch
dasselbe Da die Operatoren
dieselbe
Einrückungsebene haben und alle dem
Operations Manager untergeordnet sind, werden
sie als Geschwister bezeichnet, und Geschwister dürfen
nicht denselben Namen haben Unser Unternehmen sollte
mehr als eine Abteilung haben. Lassen Sie uns
also die
gesamte Betriebsabteilung duplizieren, indem wir den
Betriebsleiter duplizieren Alle untergeordneten Knoten
sind ebenfalls dupliziert. Da es sich bei den Operatoren
nicht um direkte Geschwister handelt, dürfen
sie
ihre ursprünglichen Namen behalten Benennen wir den Manager in Marketingmanager
um, und dann werden
nur noch zwei Marketingexperten in seinem Team
arbeiten Übergeordnete Knoten können
auch ausgeblendet werden, um ihre untergeordneten Knoten
auszublenden, oder
erweitert werden, um sie anzuzeigen. Allen Mitarbeitern
dieses Unternehmens
ist dasselbe
Mitarbeiterskript beigefügt. Lassen Sie uns also die Szene durchspielen und uns
ein besseres Bild von der Reihenfolge ,
in der die Skripte ausgeführt
werden. Wir können sehen, dass der erste Operator
der erste ist, der bereit ist, gefolgt von jedem
Operator der Reihe und schließlich der
Operations Manager. Das Gleiche gilt für die
Marketingabteilung. Dann ist endlich der Präsident
des Unternehmens der
letzte, der bereit ist. Wie entscheidet Gadot über
diese Hinrichtungsreihenfolge? Die Engine startet oben im Szenenbaum und
arbeitet sich nach unten vor, betrachtet
aber keinen Knoten als
bereit , bis alle untergeordneten
Knoten bereit sind Der Präsident ist also
nicht bereit, weil der
Betriebsleiter nicht bereit ist. Der Betriebsleiter ist nicht bereit, weil die
Bediener nicht bereit sind. Die Bediener sind nacheinander
bereit, da sie keine Kinder haben. Sobald alle
Bediener bereit sind, ist der
Betriebsleiter bereit. Aber der Präsident
ist immer noch nicht bereit, weil der Präsident noch ein
Kind hat, das noch nicht bereit ist. Der Marketingmanager war erst bereit, als alle
Marketingfachleute bereit waren, und schließlich
ist der Präsident der Letzte, der bereit Da an den Stammknoten
kein Skript angehängt ist, entspricht seine Bereitschaftsfunktion der eines Standardknotens, der leer ist Neben Ready gibt es noch
andere Funktionen von Node, die wir überschreiben
können, damit sie
später ausgeführt werden, wenn ein Node bereit ist. Am häufigsten ist der Prozess, auch
ein Unterstrich vorangestellt Die Engine versucht
ihr Bestes, um
die Prozessfunktion
jedes Knotens im Szenenbaum 60 Mal pro
Sekunde unter Verwendung
der standardmäßigen
Projekt-Framerate auszuführen die Prozessfunktion
jedes Knotens im Szenenbaum 60 Mal pro
Sekunde unter Verwendung
der standardmäßigen
Projekt-Framerate Daher verwendet der Prozess einen
Parameter namens Delta, bei dem es sich um eine
Fließkommazahl handelt, die die Anzahl der Sekunden angibt, die seit dem vorherigen Frame
vergangen sind. In den meisten Fällen wird es also ein Sechzigstel
sein, aber nicht immer. Wir brauchen diesen
Parameter heute für nichts zu verwenden, also können wir dem Namen dieses Parameters
einen Unterstrich hinzufügen, damit Gudo weiß, dass wir ihn nicht brauchen und
uns nicht
darum kümmern sollten Aber um
die Prozessfunktion zu überschreiben, muss
sie dieselbe Anzahl
und dieselbe Art von Parametern haben Lassen Sie uns unseren Mitarbeitern sagen, dass sie in jedem Frame etwas Arbeit
erledigen sollen, indem eine Erklärung
ausdrucken, in der steht, dass ihr Name
an funktioniert Beim Betrachten dieser Szene stellen wir fest, dass alle unsere Mitarbeiter sehr hart
arbeiten ihre Kontoauszüge
60 Mal pro Sekunde
schreiben Das ist nicht dasselbe wie eine
Endlosschleife, denn die Arbeit wird tatsächlich so erledigt, wie sie beabsichtigt
ist, und
nichts ist kaputt. Lassen Sie uns das
etwas
verständlicher machen, indem wir jedem Mitarbeiter nur
gestatten, eine Arbeitseinheit zu erledigen. Verwenden Variable Ban has done work mit dem
Standardwert False. der Mitarbeiter in der Prozessfunktion Wenn der Mitarbeiter in der Prozessfunktion keine Arbeit verrichtet
hat, erledigt er
seine Arbeit und
ändert den Wert auf „Wahr“. Eine 60stelsekunde später, da die Variable wahr ist, werden
sie nicht mehr arbeiten. Wenn wir diese Variable jedoch
innerhalb der Prozessfunktion deklarieren , dann existiert sie nur innerhalb der Prozessfunktion und nur für eine einzige
Iteration derselben Im nächsten Frame, wenn die Prozessfunktion zum zweiten Mal
ausgeführt wird, wird
die Variable
erneut deklariert und hat immer noch den
Standardwert False Das wird also keine Wirkung haben. Damit unsere Variable bestehen bleibt, muss
sie außerhalb des Kontextes
der
Prozessfunktion existieren des Kontextes
der
Prozessfunktion Also deklarieren wir sie außerhalb der Funktion
ohne Einrückung hier deklarierte Variablen kann überall
im gesamten Skript
zugegriffen werden überall
im gesamten Skript
zugegriffen Dieses Konzept wird als
Bereich bezeichnet und ist einer
der Hauptgründe, warum wir Einrückungen
in unseren Skripten verwenden So können wir sehen, welche Variablen in welchem Bereich
existieren. Wenn wir die Szene jetzt betrachten, können
wir sehen, dass jeder
unserer Mitarbeiter erklärt, dass
er bereit ist zu arbeiten Erst wenn
alle bereit sind, erledigen
sie jeweils eine Arbeitseinheit, aber jetzt in einer anderen Reihenfolge Die Reihenfolge, in der Knoten
im Szenenbaum
ihre Prozessfunktionen ausführen , folgt der exakten Reihenfolge des
Szenenbaums von oben nach unten. Eltern müssen nicht wie bei der Bereitschaftsfunktion
auf
ihre Kinder warten . Möglicherweise möchten wir, dass alle Mitarbeiter unseres
Unternehmens ähnlich
, aber nicht
genau gleich sind. Die Arbeit eines Managers ist nicht wirklich die gleiche wie
die eines Arbeiters. Wir können Vererbung verwenden, um
unterschiedliche Verhaltensweisen
für ähnliche Objekte zu erzeugen . Auf die gleiche Weise schreiben wir
Skripte, die den Knoten erweitern, aber ändern, wie sie
vorbereitet werden und wie sie verarbeitet werden. Zuerst müssen wir diesem Skript
einen Namen
geben, den wir als Referenz
verwenden können, das Schlüsselwort classname
verwenden, gefolgt von einem Namen, der das Verhalten
des Skripts
beschreibt, normalerweise derselbe wie
der Skriptname, aber in
Pascal-Großbuchstaben geschrieben die Engine nun weiß, dass es sich um einen Mitarbeiter
handelt, erstellen
wir ein neues Skript
und geben diesem einen Namen Manager Aber anstatt vom Knoten
zu erben, können wir
dieses Mal vom Mitarbeiter
erben Da unser
Manager-Skript die Erweiterung Employee erweitert, gilt
alles, was
im Employee-Skript
geschrieben ist, auch für dieses Aber wir können mehr hinzufügen
oder Änderungen vornehmen. Ein Manager ist immer noch ein Angestellter, aber die Art und Weise, wie er
arbeitet, ist anders. Wir sollten das an
unsere Manager-Knoten angehängte
Skript durch
das neue Manager-Skript ersetzen . Lassen Sie uns die
Definition der
Ready-Funktion durch den Mitarbeiter überschreiben . Wenn also ein Manager bereit ist, wird er nicht nur
sagen, dass er bereit ist, sondern er wird auch sagen, dass seine
gesamte Abteilung bereit ist. Damit unsere beiden
Manager den Namen
ihrer Abteilungen ausgeben
können, benötigen
sie eine
Variable,
die den Namen ihrer
Abteilung als Zeichenfolge enthält. Aber wie können wir diese Variable so
auffüllen , dass sie unterschiedliche Werte
für verschiedene Abteilungen enthält? Wenn wir unsere
Variablendeklaration
mit dem Tag beim Export fortsetzen , wird
diese Variable andere
Teile der GADOEngine
zugänglich,
nämlich für das nämlich Damit eine Variable exportiert werden kann, muss
sie
auf der Ebene
des Skriptbereichs deklariert werden Wenn Sie den Operations
Manager und den Szenenbaum auswählen, gibt es jetzt ein Feld im
Inspektorfenster, in dem wir der
Abteilungsvariablen einen Zeichenkettenwert geben können. Auf diese Weise
können der Betriebsleiter und der Marketingmanager und der Marketingmanager jeweils ihren
eigenen Wert für
diese Variable haben , den wir leicht kontrollieren
können. die Szene ausführen, können wir sehen,
dass die Knoten, die das Manager-Skript angehängt ist,
jetzt deklarieren, dass ihre
Abteilung bereit ist, während die anderen
Mitarbeiter alle
die vorherige Definition
im Mitarbeiterskript verwenden . Die Prozessfunktion im
Mitarbeiterskript wird ebenfalls von den Managern
übernommen und
wird genauso ausgeführt wie zuvor. Lassen Sie uns also die Prozessfunktion unseres
Managers ändern. Manager werden
etwas anderes sagen. Name Plus leitet die Mitarbeiter
dazu, ihre Arbeit zu erledigen. Die Variable hat Arbeit erledigt
aus dem Mitarbeiter-Skript wurde ebenfalls übernommen und muss
hier
nicht deklariert werden, um verwendet zu werden. Tatsächlich können wir keine
Variable mit diesem Namen deklarieren, da dies zu einem Konflikt mit
der geerbten Variablen
desselben Namens führen würde . Lassen Sie uns die Szene
noch einmal durchspielen und sehen, wie unsere Manager
ihre Arbeit jetzt
anders machen als andere Mitarbeiter. In der nächsten Lektion erfahren wir
mehr über die Verwendung von Knoten im Szenenbaum und über
die Prinzipien der
objektorientierten Gestaltung. Wir sehen uns in der nächsten Lektion.
10. Abstraktion und Verkapselung: Hallo Freunde.
Heute werden wir untersuchen ,
wie man Klassen schreibt, die
einfacher zu verwenden und zu verstehen sind . Stellen Sie sich ein Auto als
Referenzrahmen vor. Lassen Sie uns zwei
Knoten in unserer Szene erstellen, einen Fahrer und ein Auto als
Kind des Fahrers Hängen Sie dann jeweils ein neues Skript
mit demselben Namen an. Autos sind sehr komplexe
Maschinen,
und die meisten Menschen, die sie fahren, haben keine Ahnung, wie
sie tatsächlich funktionieren. Sie verstehen nur, wie
man ihr Auto bedient. Beginnen wir mit dem Auto-Skript und geben ihm den Klassennamen Auto Fügen wir
dann eine Variable für das Jahr des
Autos als Ganzzahl hinzu. Eine weitere für die Marke
des Autos als Zeichenfolge
und eine weitere für das
Modell, ebenfalls als Zeichenfolge. exportiere all das und Ich exportiere all das und stelle mein Auto auf
einen Honda Civic von 2007 ein. beim Erstellen einer neuen Klasse
darauf, das Skript zu speichern,
bevor Sie versuchen, es zu verwenden. Im Treiberskript benötigt
der Fahrer einen
Verweis auf das Auto
, den wir in einer
Variablen vom Typ Auto speichern können. Knoten können auf andere
Knoten im Szenenbaum zugreifen.
Meist verwenden ihre untergeordneten Knoten
ein anderes Tag, Meist verwenden ihre untergeordneten das dem
Export ähnelt, der auf ready aufgerufen wird. Mit dem Tag on ready können
wir den
Variablenwert zuweisen, nachdem der Knoten bereit ist,
was bedeutet, dass alle seine
untergeordneten Knoten ebenfalls bereit sind, aber bevor die
Ready-Funktion dieses Knotens aufgerufen wird. Wir können ihn
dem Rückgabewert
der integrierten Funktion
Get node zuweisen der integrierten Funktion , die einen
Knotenpfad als Parameter akzeptiert. Wenn wir den Namen
des untergeordneten Knotens in
Anführungszeichen angeben , haben
wir jetzt einen Verweis auf den untergeordneten Knoten, der
in einer Variablen gespeichert ist, und wir können auf seine
Eigenschaften und Funktionen zugreifen, einschließlich
der Eigenschaften und Funktionen im angehängten Skript. Wenn wir die Definition
der Ready-Funktion außer Kraft
setzen, können wir auf den Fahrzeugknoten zugreifen und dessen
Jahr, Marke und Modell ausdrucken Die Ready-Funktion wird
nach den On-Ready-Tags ausgeführt. gibt es eine Abkürzung für dies
zu vereinfachen, gibt es eine Abkürzung für
die Funktion get node das Dollarzeichen,
gefolgt von demselben Knotenpfad. Gehen wir zurück
zum Car-Skript und
fügen eine weitere Variable hinzu. Diese gibt als boolescher Wert an, ob der Motor
läuft oder nicht Als Fahrer wissen wir, ob
der Motor läuft, und wir haben die Kontrolle darüber, ob der
Motor läuft oder nicht, da wir mit dem Schlüssel wählen können, ob der Motor gestartet oder
gestoppt werden soll mit dem Schlüssel wählen können, ob der Motor gestartet oder
gestoppt Wir würden diese
Variable also als öffentlich betrachten. Eine weitere Eigenschaft unseres
Autos könnte die Anzahl der Zylinder im
Motor als Ganzzahl sein, und ich weise ihr
einen Wert von vier zu. Dies ist etwas, das der
Fahrer nicht wissen muss, nicht einfach darauf zugreifen
kann und niemals ändern
darf. Im Gegensatz zur öffentlichen Variablen würde
diese Variable also als privat betrachtet werden, und wir können sie als privat kennzeichnen, indem wir ihrem Namen
einen Unterstrich hinzufügen Im Treiberskript können wir den Wert von Engine is
on auf true
setzen , indem wir
den Schlüssel in die Zündung stecken und sie drehen Aber zuerst sollten wir das Bremspedal
drücken. Verwenden wir eine Funktion, um den auf
das Bremspedal ausgeübten
Druck einzustellen , dem wir annehmen von
dem wir annehmen, dass er
maximal 20
Kilogramm beträgt. Um unser Auto zu starten, sollten
wir also
den Bremsdruck wahrscheinlich auf
etwa 10 Kilogramm einstellen . Zurück im Auto-Skript müssen
wir
diese Funktion definieren, müssen
wir
diese Funktion definieren die
den Bremsdruck einstellt. ob die Engine auf einer Variablen steht, würde man
dies
als öffentliche Funktion bezeichnen, da sie
von einem anderen Skript verwendet wird. Diese Funktion akzeptiert
eine Fließkommazahl als Parameter,
der
angibt, wie viel Druck auf das Pedal
ausgeübt wird. Aber was macht das
Auto eigentlich wenn wir Druck
auf das Bremspedal ausüben? Aus Sicht
des Fahrers entscheidet sich
der Fahrer dafür, einen bestimmten
Druck
auf das Pedal auszuüben, ohne jemals die genaue Position zu kennen. Aus Sicht des Fahrzeugs wird
die Position des
Pedals gemessen und
verwendet, um das Auto anzuhalten. Das Auto verwendet die Position
des Bremspedals, um
den Druck einzustellen, der auf Bremssättel ausgeübt
wird, die Bremsbeläge an Bremssättel ausgeübt
wird, die den Rädern des Fahrzeugs
halten, ganz zu
schweigen von der Komplexität von Antiblockiersystemen
oder anderen Systemen Wenn wir also tatsächlich ein echtes Auto
programmieren würden, müssten
wir
hier
mehrere komplexe Funktionen schreiben ,
die die einfache Aktion des Fahrers, der
Druck auf
das Bremspedal ausübt, in die komplexe Mechanik
des Zusammendrückens der
Bremssättel umwandeln Fahrers, der
Druck auf
das Bremspedal ausübt, in die komplexe Mechanik
des Zusammendrückens der
Bremssättel komplexe Mechanik
des Zusammendrückens der Das ist Teil der
internen Funktionen
des Fahrzeugs und nichts
, was für den Fahrer auf
andere Weise als
durch
Drücken auf das Bremspedal gesteuert
oder zugänglich ist Fahrer auf
andere Weise als
durch
Drücken auf das Bremspedal gesteuert
oder zugänglich andere Weise als Bremspedal Wir würden diese
Funktionen also als private Funktionen betrachten, da sie nur für die Nutzung
durch das Auto selbst bestimmt sind. Und wir können unsere
privaten Funktionen kennzeichnen indem wir ihre Namen
mit einem Unterstrich Beachten Sie, dass dies mit den Funktionen „Prozess“ und
„Bereit“ identisch Funktionen „Prozess“ und
„Bereit Die Art und Weise, wie GD Script
private Variablen und
Funktionen verwendet , ähnelt eher der Art und Weise, wie andere Sprachen geschützte Variablen und
Funktionen
verwenden , da sie für Erben
zugänglich sind. GDScript
setzt diese Datenschutzbestimmungen
jedoch nicht wirklich durch, und Skripte können
weiterhin auf private Mitglieder zugreifen Diese Konventionen dienen
ausschließlich dazu, eine bessere
Klassenstruktur und ein besseres Design zu ermöglichen Eine andere Möglichkeit,
Kommentare in GD Script zu verwenden ,
besteht darin, Bereiche unserer
Skripte zu erstellen, die miteinander verwandt sind Verwenden Sie dazu das Schlüsselwort region gefolgt vom
Namen der Region. Wir können eine Region mit
dem Schlüsselwort und der Region beenden. Lassen Sie uns also
in unserem Auto-Skript
eine
öffentliche Region und eine private Region erstellen und
trennen, was für den Fahrer
zugänglich sein soll und was nicht. Um die Dinge einfach zu halten, wir an, der
Fahrer
muss nur in der Lage sein,
den Motor ein- oder auszuschalten, Druck auf nehmen
wir an, der
Fahrer
muss nur in der Lage sein,
den Motor ein- oder auszuschalten, Druck auf das Gaspedal
auszuüben, Druck auf
das Bremspedal auszuüben
oder das Lenkrad zu drehen. Was
in jeder
dieser öffentlichen Funktionen tatsächlich passiert , ist die interne Mechanik
des Autos selbst. Der Fahrer muss nicht wissen, wie das funktioniert,
um das Auto zu bedienen. Wenn
Sie zum Beispiel Gas geben, das
Auto tatsächlich öffnet
das
Auto tatsächlich ein
Lufteinlassventil am Motor, wodurch mehr
Luft und
Sauerstoff in den Motor gelangen. Das Auto muss also einen
Sensor verwenden, um die Menge des
Luftstroms und die Menge an
Sauerstoff zu messen Luftstroms und die Menge an , die jetzt in den Motor
fließt Verwenden Sie diesen dann, um die
Kraftstoffmenge
einzustellen , die in die Zylinder
des Motors eingespritzt wird All diese Funktionen
sind privat, da wir nicht wissen
müssen, was sie eigentlich tun, um das Auto fahren
zu können. Weise, wie sich
unser Auto bewegt, hängt von der Prozessfunktion ab, und wir benötigen eine weitere private
Variable namens phase, um darzustellen, in welcher
der vier Phasen sich
jeder Zylinder gerade befindet. In der Prozessfunktion des Autos können wir bei laufendem Motor durch jeden
Zylinder des Motors
iterieren Wenn wir den
Zylinder und die Phase zusammenzählen, dann Modul vier, erhalten wir für jeden Zylinder
eine andere Phase diese Zahl zuordnen,
können wir jedem Zylinder anweisen eine andere
Phase
durchzuführen, nämlich den Einlasstakt, Kompressionstakt, den
Verbrennungstakt oder den Auslasstakt, wobei jeder den
Zylinder als Argument akzeptiert Erhöhen Sie dann die Phase
und fahren Sie wieder auf Null zurück
, wenn sie vier erreicht. Jede dieser Funktionen kann dann die Einlassventile,
Auslassventile, Einspritzdüsen
und Zündkerzen jedes
Zylinders steuern , um den Motor laufen zu lassen Die Kraft, die durch
die Verbrennungstakte
jedes Zylinders erzeugt
wird , würde
das Fahrzeug dann vorwärts bewegen , während die
Bremsbeläge versuchen,
das Fahrzeug anzuhalten , und die
Lenkradposition ihre Richtung ändert Die Position des Fahrzeugs
würde dann durch die Richtung, Geschwindigkeit und Delta-Zeit verändert. Sie sich keine Sorgen, wenn
das alles für Sie keinen Sinn ergibt ,
denn genau
darum geht es in dieser Lektion. Du
musst es nicht verstehen. Da sich all dies im
privaten Bereich des Skripts befindet, muss
der Fahrer nicht wissen wie das alles funktioniert,
um das Auto fahren zu können. Sie müssen nur wissen, wie man den öffentlichen Bereich
des Skripts
benutzt. Durch die Trennung von öffentlich
und privat werden
zwei wichtige Prinzipien der
objektorientierten Programmierung durchgesetzt zwei wichtige Prinzipien der
objektorientierten Programmierung Kapselung ist
der öffentliche Bereich, Zugang zu
öffentlichen Variablen oder Funktionen ermöglicht, die einfach zu
verwenden und leicht zu verstehen sind, und Abstraktion ist
der private Bereich, in dem die Details
komplexer Systeme oder
Mechaniken
verborgen werden, die
nicht
verstanden werden müssen, um effektiv genutzt zu werden verstanden Sie werden wissen, ob Ihre
Kurse
diese Prinzipien einhalten , wenn
Sie alle privaten Inhalte verstecken können und trotzdem leicht verstehen, wie
sie verwendet werden sollen Unser Fahrer kann jetzt also das Fahren des Autos
simulieren indem er nur auf die öffentlichen
Bereiche des Autoskripts zugreift, vom Drücken der
Bremse und
dem Starten des Motors bis hin zum
Lösen der Bremse, dem
Drücken des Gaspedals,
dem Drehen des Lenkrads usw. Diese Prinzipien sind nicht nur für unsere eigenen Skripte
wichtig,
sondern ermöglichen es uns auch, Skripte zu
verwenden, die von
anderen Entwicklern geschrieben wurden , ohne vollständig verstehen, wie
sie intern funktionieren Sie machen
R-Skripte auch flexibler. Stellen Sie sich vor, wir würden unser Gasauto gegen
ein Elektroauto austauschen Müsste irgendwas im
Drehbuch des Fahrers geändert werden? Elektroauto-Skript
müsste nur das Für ein
Elektroauto-Skript
müsste nur das Auto-Skript geändert werden, da alle
öffentlichen Variablen und Funktionen weiterhin
im Elektroauto-Skript existieren würden. Ebenso könnten wir das Treiberskript in
ein Autopilot-Skript
umwandeln, dem lediglich
ein Ziel zugewiesen werden muss und das
Auto dann automatisch
bedienen kann In der nächsten Lektion werden
wir noch mehr
über die Prinzipien des objektorientierten
Designs lernen über die Prinzipien des objektorientierten
Designs Wir sehen uns in der nächsten Lektion.
11. Polymorphismus: Hallo Freunde. Heute behandeln
wir das letzte Prinzip
der objektorientierten Programmierung, den Polymorphismus erweitern die Konzepte der
Vererbung und Abstraktion und können Klassen schreiben, Wir erweitern die Konzepte der
Vererbung und Abstraktion und können Klassen schreiben, die abstrakteres Konzept
repräsentieren,
eine Sammlung von spezifischeren
Klassen, die Lassen Sie uns Tiere als
Beispiel verwenden, indem wir
ein Skript mit dem Namen animal erstellen ,
das den Knoten erweitert, aber wir müssen
dieses Skript nicht an irgendwelche Knoten
im Szenenbaum anhängen dieses Skript nicht an irgendwelche Knoten
im Szenenbaum Hier können wir dem
Skript einen Klassennamen geben dann Eigenschaften und
Verhaltensweisen definieren , die allen Tieren
gemeinsam sind, wie eine Variable, die den Plural des
Tieres als Zeichenfolge enthält,
und eine weitere für den Namen
einer Gruppierung dieses Und lassen Sie uns auch eine
Funktion definieren, mit der sich das Tier bewegen, essen oder Wir können
den Plural von Tier zwar leicht als Tiere definieren , es gibt kein Wort für
eine Gruppe von Tieren Wir können auch nicht definieren,
wie sich ein Tier bewegt oder frisst, ohne zu wissen, um
welche Art von Tier es sich handelt Die Körper dieser
Funktionen können also leer bleiben. Wir könnten jedoch davon ausgehen, dass einige
Verhaltensweisen so häufig
vorkommen , dass sie
eine Standardeinstellung haben sollten, z. B. das Sprechen. Es gibt zwar viele
verschiedene Säugetiere , die eine
Vielzahl von Geräuschen machen, die meisten Tiere,
einschließlich Fische und Insekten, tun dies nicht einschließlich Fische und Insekten Die meisten Menschen würden sie nicht als sprechen
beschreiben. Wenn wir also einem
zufälligen Tier sagen, dass es sprechen soll könnten
wir das
Standardverhalten als Schweigen betrachten. Fügen wir also
verschiedene Tiere zu unserem Szenenbaum hinzu,
angefangen mit einer Katze. Wir können jetzt
wie zuvor Vererbung verwenden, um eine beliebige Anzahl
verschiedener Tierskripte zu erstellen , die von Tieren wie Katzen
erben Wir überschreiben dann
die Ready-Funktion , um den Variablen,
die von animal geerbt wurden,
einen Wert zu geben von animal geerbt wurden , der für eine Katze
geeignet ist Der Plural wäre Katzen, und eine Gruppe von Katzen
wird Clouder genannt Die Verhaltensfunktionen
können auch überschrieben werden um das Verhalten beim stillen
Sprechen in Miauen Katzen laufen auf vier
Beinen, um sich fortzubewegen, und ich würde sagen, dass sie Fisch fressen Der tatsächliche Inhalt
dieser Variablen und
Funktionen ist nicht relevant, aber der Schwerpunkt liegt darauf, wie
sie
vom abstrakten Konzept
eines Tieres
auf ein spezifischeres
Beispiel einer Katze vererbt werden vom abstrakten Konzept
eines Tieres
auf ein . Wir können diesen Vorgang wiederholen , um viele weitere
verschiedene
Tierarten wie einen Vogel oder einen Fisch zu unserem
Szenenbaum hinzuzufügen. Und indem sie jedem ein neues Skript geben, das von Animal
geerbt
wurde, können sie jeweils ihre
eigenen eindeutigen Werte für
die Variablen und
Implementierungen
der Funktionen angeben die Variablen und
Implementierungen
der , die sie Der Plural von Vogel ist Vögel. Eine Gruppe von Vögeln
wird Herde genannt. Sie fliegen, um sich fortzubewegen, fressen Würmer und
zwitschern, um zu sprechen Ich verschaffe mir einen Vorsprung
bei meinem Fish-Skript indem ich den Inhalt
des Cat-Skripts kopiere Und der Plural von Fisch ist Fisch Eine Gruppe von Fischen wird Schule
genannt. Sie schwimmen, um sich fortzubewegen. Sie fressen Algen, sprechen aber
nicht. Wenn also die
Sprechfunktion weggelassen wird, verwenden
Fische beim Sprechen die
ererbte Definition aus der
Tierschrift Bisher haben wir nur
die objektorientierten Prinzipien verwendet, die wir bereits kennen, um die Eigenschaften
und Verhaltensweisen von Tieren zu erben, zu
abstrahieren
und wir bereits kennen, um die Eigenschaften
und Verhaltensweisen von Tieren zu erben, zu
abstrahieren
und zusammenzufassen. All dies ermöglicht es uns jedoch, Polymorphismus
zu verwenden, indem alle Tiere so
behandeln, als ob sie wir alle Tiere so
behandeln, als ob sie
gleich und austauschbar wären. Zuerst fügen wir dem Wurzelknoten
unserer Szene ein Skript
hinzu und nennen es Zoo, das vom Knoten erbt Unser Zoo ist voller
verschiedener Tiere, aber es spielt keine Rolle, um
welche Tiere es sich tatsächlich handelt wir die Definition
der Ready-Funktion für unseren Zoo außer Kraft
setzen, können wir ganz einfach unsere Tierliste
durchgehen und sie alle
so behandeln, als ob sie nur
Tiere wären Eine schnelle und einfache
Möglichkeit, all
unsere Tiere in
einer einzigen Variablen, nennen
wir sie Tiere, zu speichern unsere Tiere in
einer einzigen Variablen, nennen
wir sie Tiere, , besteht darin,
eine Node-Funktion
namens Get children zu verwenden eine Node-Funktion
namens Get children Dies gibt ein Array von Knoten zurück, wobei alle untergeordneten Knoten
dieses Knotens praktischerweise in derselben Reihenfolge
wie der Szenenbaum
in einem Array
angeordnet sind. Da dies von den
untergeordneten Elementen abhängt, müssen
wir das Tag bei on ready verwenden. Da wir wissen, dass
alle Tiere
dieselben Eigenschaften
und Verhaltensweisen haben , können
wir
jedes Tier in unserer Tiergruppe wiederholen und jedem
Tier sagen, dass es sprechen soll Und obwohl
sie alle wie Tiere behandelt werden, spricht
jedes auf seine
eigene Art und Weise, wie es in
seinen eigenen
Skripten definiert ist, oder verwendet die vom
Tier übernommene Definition , wenn es
keine eigene hat Wir können so viele
Vererbungsstufen schaffen , wie wir möchten. Lassen Sie uns also ein weiteres
abstraktes Skript
für Säugetiere erstellen , die
vom Tier erben Säugetiere sind eine
Unterkategorie von Tieren, zu denen alle Tiere
gehören, die
Brustdrüsen haben und
diese zum Stillen ihrer Jungen verwenden. Dies sind einzigartige Eigenschaften
und Verhaltensweisen von Säugetieren, die auf andere Tiere nicht
zutreffen So können wir
dem Säugetier-Skript eine neue Variable
für die Anzahl der
Brustdrüsen dieses Tieres hinzufügen dem Säugetier-Skript eine neue Variable
für die Anzahl der Brustdrüsen dieses Tieres und
eine neue
Funktion namens Krankenschwester schreiben Auch hier ist der Inhalt
der Funktionen für diese Lektion nicht
relevant Dieses Skript
benötigt außerdem einen Klassennamen um
vererbt zu werden. wechseln
zum Katzen-Skript, da Katzen Säugetiere sind, und so können wir der
Anzahl der Brustdrüsen für Katzen
einen Wert geben , der acht sein sollte Und wir können unserem Zoo auch neue
Säugetiere hinzufügen, wie einen Affen Affen sind auch Säugetiere, aber sie haben nur
zwei Brustclans Ich
kopiere noch einmal den Inhalt eines anderen Skripts, um die Dinge
zu beschleunigen Der Plural von Affen ist Affen. Eine Gruppe von Affen
wird Truppe genannt. Sie bewegen sich, indem sie auf Bäume klettern. Sie essen Bananen und ich
sage, sie sagen oh. Unser Zoo-Skript kann nun diese neue
Vererbungsstruktur
nutzen , um einzigartige Bedingungen
speziell
für Tiere, die Säugetiere sind,
anzuwenden . Wir können
Klassennamen direkt in bedingten
Anweisungen verwenden , um zu sagen, dass ist wir zusätzlichen Code
ausschließlich für Säugetiere ausführen
werden ,
wenn das aktuelle
Tier ein Säugetier Ich drucke einfach ein
paar zusätzliche Zeilen aus die unsere Säugetiere beschreiben Und wir können sehen, dass unsere Ergebnisse sowohl für alle Tiere einheitlich sind, auch etwas Einzigartiges speziell für
die beiden Säugetiere bieten. Sie können sich vorstellen, wie wir unsere Liste der Tiere
in unserem Zoo so
ändern könnten , dass sie beliebige
Tierarten enthalten, und wir könnten unsere
Erbschaftsstruktur ändern um sie so
genau wie nötig zu kategorisieren In der nächsten Lektion lernen
wir
eine weitere Datensammlung kennen, mit der wir verwandte
Informationen gruppieren
können verwandte
Informationen gruppieren
können Wir sehen uns in der nächsten Lektion.
12. Wörterbuch: Hallo, Freunde. Heute werden wir eine Alternative
zu dem Array
verwenden, die manchmal wie eine Klasse
ohne Funktionen verwendet wird , die als Wörterbuch
bezeichnet wird. Stellen Sie sich eine Reihe von
Schließfächern vor, wie Sie sie in einer High
School oder einem Gymnasium finden
würden Wenn wir ein
Array von Variablen deklarieren, könnten
wir
den Array-Index jeder Variablen als die Zahl
der
Schließfächer betrachten jeder Variablen als die Zahl
der
Schließfächer Nehmen wir an, es gibt zehn Schließfächer, und wir können auf jedes
einzelne Schließfach zugreifen um etwas hineinzulegen, angefangen bei Schließfach Null, Eins usw. Was wir in jedes
Schließfach legen, spielt keine Rolle. Es kann sich um eine Ganzzahl, eine
Fließkommazahl, eine Zeichenfolge, booleschen Wert, eine Null oder eine
Instanz einer Klasse handeln Und wir können den Inhalt
der Schließfächer
ausdrucken , um sie zu sehen Stellen Sie sich nun vor, wenn wir etwas in
einen der Schränke
legen, schließen
wir nicht nur die
Tür des Schließfachs,
sondern befestigen auch ein Vorhängeschloss daran Dieses Vorhängeschloss benötigt Öffnen eine dreistellige
Zahlenkombination Bisher mussten wir, wenn wir den Inhalt
des Schließfachs
abrufen
wollten, den Inhalt
des Schließfachs
abrufen
wollten, nur die Nummer
des Schließfachs kennen, dorthin
gehen und den Inhalt
herausnehmen Jetzt können wir die Nummer des
Schließfachs ignorieren und müssen stattdessen die Kombination kennen, mit der das Vorhängeschloss
geöffnet Nehmen wir an, die
Kombination ist 149. Als Array würde die Zuweisung von
etwas zur Zahl 149 bedeuten, dass das Array 150 Schließfächer
haben müsste Wenn wir den Typ
unseres Arrays in ein Wörterbuch ändern würden , würde
das immer noch funktionieren,
außer dass wir keine Größe für das Wörterbuch festlegen
müssen Größe für das Wörterbuch bevor wir auf
seinen Inhalt zugreifen können Beachten Sie, wie sich die
Ausgabe geändert hat. Wörterbücher werden durch geschweifte
Klammern statt durch
eckige Klammern dargestellt , und jeder Eintrag ist eine Zahl, die einen Schlüssel
darstellt, gefolgt
von einem Wert dessen, was in dem durch diesen Schlüssel
gesperrten Schließfach
enthalten ist in dem durch diesen Schlüssel
gesperrten Schließfach
enthalten Das Wörterbuch enthält auch keine Einträge für Schlüssel, denen
kein Wert zugewiesen wurde Da es sich um ein Wörterbuch handelt,
ist diese Zahl weder ein Index noch eine Adresse. Es ist ein Schlüssel, mit
dem wir ein Schloss öffnen. Und so wie der Inhalt
des Schließfachs einen beliebigen Datentyp haben kann, können
die Schlüssel, die wir zum
Sperren verwenden, auch beliebigen Datentyp haben, mit
nur einer Einschränkung Jeder Schlüssel muss einzigartig sein. Andernfalls können wir das Schließfach, das dem Schlüssel
entspricht, nicht finden. Versuchen wir also, ein Schließfach mit
einer
anderen Art von Schloss zu verschließen,
eines, das Buchstaben
anstelle von Zahlen verwendet. Der Schlüssel dieses
Wörterbucheintrags ist also eine Zeichenfolge, aber sein Wert ist eine Zahl. Das komplette Gegenteil
dieses Schließfachs, dessen Schlüssel eine Zahl
und dessen Wert eine Zeichenfolge ist. Sperren wir das nächste
Schließfach mit einem Drehschloss, dessen Entsperrung drei
Zahlen erforderlich sind, die wir in einem Array
speichern könnten. Unser Schlüssel für Wörterbucheinträge
ist also ein durch
eckige Klammern dargestelltes Array , das
eine durch Kommas getrennte Liste
von drei ganzen Zahlen enthält eine durch Kommas getrennte Liste
von drei ganzen Zahlen Vielleicht
enthält diese Schlossnummer einen Dezimalpunkt, der Schlüssel ist
also eine Und irgendwie ist dieses
Schließfach durch
Lichtempfindlichkeit verriegelt und kann nur geöffnet
werden, wenn das Licht aus Sein Schlüssel ist also ein boolescher Wert. Wir können sogar
benutzerdefinierte Klassen
entweder als Schlüssel oder als
Werte in Wörterbüchern verwenden entweder als Schlüssel oder als
Werte in Lassen Sie uns eine neue Klasse für Schlüssel schreiben, die von
nichts erben
muss , da sie
weder an einen Knoten
angehängt noch vererbt wird Unsere Schlüsselklasse benötigt einen Klassennamen und wir haben eine Variable
, die ihre Zähne beschreibt Die Implementierung dieser
Klasse ist nicht relevant, aber wir können so tun, als wäre es ein Schlüssel Zurück im Locker-Skript können
wir eine Instanz
unseres Schlüssels in einer Variablen speichern Nennen wir es Schlüssel
eins vom Typ Schlüssel, indem es
dem Klassennamen des
Schlüssels
zuweisen . Nunu erzeugt einen neuen Schlüssel
, der unserer Variablen
zugewiesen wird Wir können diesen Schlüssel jetzt verwenden, um einen Eintrag im
Wörterbuch zu erstellen Wir können auch mehr Schlüssel erstellen
, um mehr Einträge zu erstellen. Da jeder Schlüssel, den wir erstellen, als einzigartig angesehen
wird. In der Ausgabe werden die Schlüssel nun
als Riffzählung
gefolgt von einer langen Zahl angezeigt . Die Namen, die wir in
anderen Klassen verwendet haben , wurden von Node
übernommen. Da der Schlüssel jedoch nicht vom Knoten
erbt,
hat er keinen Namen Ref Counted ist die Abkürzung für
Reference Counted Object und die
Basisklasse für GD-Skripte Wenn wir eine Klasse schreiben , die
von nichts erbt, erbt
sie von Reef
Counted und ihr wird eine zufällige lange Zahl zugewiesen Wir können das ignorieren
und einfach verstehen , dass es sich bei unseren Schlüsseln um Objekte mit
Referenzzählung handelt,
was bedeutet, dass Gadot
automatisch jede einzelne Instanz
jedes Objekts verfolgt jede einzelne Instanz
jedes Objekts Aber was wollen wir in den Schließfächern
aufbewahren? So wie Arrays andere Arrays
enthalten können, können Wörterbücher auch andere
Wörterbücher Entsprechend der Art und Weise, wie Wörterbücher gedruckt
werden, können
wir mithilfe von geschweiften Klammern im Handumdrehen unsere
eigenen Wörterbücher erstellen . Jeder Eintrag beginnt mit
einem Schlüssel, gefolgt von
einem Doppelpunkt und dann dem Wert
, der diesem Wörterbücher werden häufig nicht verwendet, um so etwas wie
dieses Locker-Szenario zu erstellen,
sondern eher darin, etwas zu erstellen, das eher einer Klasse ähnelt Wenn auch ohne
Funktionen, nur Variablen. Nehmen wir an, in diesem Schließfach
befindet sich ein Plüschtier, das wir
mit einem Wörterbuch darstellen werden Und dieses Plüschtier
gehört zu einer Reihe von Plüschtieren zum
Sammeln, die sich
ähneln, aber auf ihre Art unterschiedlich
sind ähneln, aber auf ihre Art unterschiedlich Jedes der Plüschtiere ist eine andere Tierart
mit einer Farbe und einem Namen Jeder dieser
Schlüssel kann ein Schlüssel im Wörterbuch sein. Nehmen wir an, in diesem Schließfach
befindet sich Bruno, der Braunbär. Und das nächste Schließfach enthält
Arthur die weiße Ziege. Wir können unser
Wörterbuch Plüschtiere
im Wörterbuch der
Schließfächer sehen im Wörterbuch der
Schließfächer Zufällig ist Farbe auch eine bereits definierte
Klasse in Anstatt
unsere Farben also als Zeichenketten zu speichern, können
sie
unter Verwendung des Klassennamens color als Farben gespeichert werden Wie Sie sehen können,
gibt es viele vordefinierte Farben, die wir verwenden können, und wir können anhand ihrer
Benennung in Schlangengroßbuchstaben erkennen , dass dies Konstanten
der Farbklasse sind Wir könnten das sogar
umdrehen und so tun, als ob die Plüschtiere
ein NFC- oder
Nahfeldkommunikationsetikett enthalten , was sie
zum Schlüssel für den Zugang zum Schließfach macht Und wir können nach
wie vor alles, was
wir wollen, in den Schrank legen , einschließlich Lassen Sie uns ein weiteres Plüschtier herstellen
, das wir im Schließfach aufbewahren können, das
mit Arthur als Schlüssel entriegelt wird Diesmal ist es Cutie,
der graue Elefant. Stellen Sie sich dieses Szenario noch einmal vor: In
der Nähe der Schließfächer steht ein NFC-Lesegerät und wir halten einen Plüsch
mit einem NFC-Tag in der Hand, so
etwas wie das, was Sie in einem Escape Room
finden könnten Wenn wir das
Plüschtier gegen das Lesegerät halten, müssen
wir überprüfen, welches Schließfach zum Plüschtier
passt, und es öffnen, falls ein Schließfach überhaupt Wenn wir jedoch versuchen, auf einen Schlüssel in
einem Wörterbuch zuzugreifen , dem kein Wert zugewiesen
wurde, verursachen
wir einen Fehler Ähnlich wie wir es tun würden, wenn wir versuchen
würden,
auf einen
Array-Index zuzugreifen, der sich außerhalb des zulässigen Bereichs befindet. Wir können
mit der Funktion has überprüfen, ob ein Wörterbuch einen Eintrag
enthält , der einem bestimmten Schlüssel
entspricht, den
Schlüssel
dann als Parameter übergeben. Auf diese Weise können wir überprüfen,
ob ein Wörterbucheintrag existiert, bevor wir versuchen auf seinen Wert zuzugreifen,
wodurch der Fehler vermieden wird. Wenn das Wörterbuch den Schlüssel
nicht enthält, drucke
ich eine
andere Nachricht aus. Anstatt
dasselbe Wörterbuch zweimal zu definieren, wäre
es besser, es in
einer Variablen zu speichern und
die Variable zweimal zu verwenden. In der nächsten Lektion werden
wir
einige verschiedene Techniken untersuchen , die Sie verwenden können wenn Sie nicht weiterkommen oder weitere Informationen
benötigen. Wir sehen uns in der nächsten Lektion.
13. Debugging: Hallo, Freunde.
Heute werden wir einige verschiedene Strategien durchgehen, mit
denen Sie Ihnen helfen können , wenn Sie
unweigerlich nicht weiterkommen. Ich habe bereits ein Skript mit dem Namen debug an
den
Stammknoten der Szene
angehängt Namen debug an
den
Stammknoten der Szene Sie haben wahrscheinlich die Funktion zur
automatischen Vervollständigung bemerkt, die verfügbar
ist, wenn Sie
den Typ Ihrer Variablen angeben diese Weise können
Sie nicht nur alle
Eigenschaften und
Funktionen der Klasse sehen , sondern nach der Auswahl einer Funktion auch die Typen
aller Funktionsparameter sehen, auch die Typen
aller Funktionsparameter sehen aller Funktionsparameter sodass Sie
passende Argumente angeben können A: Wenn Sie die Typen all
Ihrer Variablen kennen, Fehlpaarungen
deutlich sichtbar, und Sie werden vor
dem Fehler gewarnt ,
ohne ihn ausführen zu müssen Ohne strikte Typen weiß
die Engine erst, was falsch ist, wenn sie
versucht, die Zeile auszuführen Wenn Sie in einer
integrierten, klassenähnlichen Farbe blättern möchten , können
wir ganz einfach auf die
Informationen zugreifen, indem Sie auf eine der Schaltflächen in der oberen rechten
Ecke des Bedienfelds Online Docs öffnet in
Ihrem Standard-Webbrowser eine Registerkarte zur GADO-API,
die der Version des Editors entspricht , die Sie verwenden Hier findest du grundlegende
Informationen zu GADO, Tipps für den Einstieg, ausführliche Tutorials
zu den Grundlagen,
Community-Links, in denen du zusätzliche Ressourcen
findest, und eine vollständige Kursreferenz Wie du sehen kannst,
gibt es viele Kurse. Und wenn wir eine von ihnen auswählen, können
wir sehen, von was
sie erben
und von welchen anderen Klassen
sie geerbt werden Jeder hat eine Beschreibung
dessen, was er tut. Links zu Tutorials
zur Verwendung, eine Liste von Eigenschaften
und Methoden. Wenn wir über Klassen sprechen, neigen
wir dazu, Variablen als
Eigenschaften und
Funktionen als Methoden zu bezeichnen . Es gibt auch Signale,
etwas, das Gadot für die
automatische Kommunikation
zwischen Knoten,
Aufzählungen und Konstanten verwendet automatische Kommunikation
zwischen Knoten, ,
wie wir All diese haben
ihre eigenen Unterabschnitte und Beschreibungen Zurück im GDA-Editor öffnet die
Suchhilfe ein Fenster in
GDA, in dem Sie
eine Liste aller Klassen sehen können eine Klasse auswählen, können
wir
in unserem Editor
dieselben Informationen sehen , die auf
der GDA-Website verfügbar sind , sodass wir offline darauf zugreifen können zu unserem Skript zurückkehren, können
wir sogar
einfacher auf
diese Informationen zugreifen , indem wir
die Strg- oder Befehlstaste gedrückt halten ,
als auf einen Klassennamen zu klicken wir direkt
zu den
Referenzinformationen für diese Klasse Das Gleiche kann für
bestimmte Funktionen
und Variablen gemacht werden. Wenn Sie darauf klicken, wird nicht nur die
Referenzseite zur Klasse
geöffnet , sondern wir gelangen auch
zu der Funktion oder Variablen, auf die wir geklickt haben Es gibt auch globale
Funktionen, die wir verwenden können, hauptsächlich um
mathematische Operationen
wie zum Beispiel Clamp auszuführen wie zum Beispiel Clamp Wenn wir diese Funktion verwenden, können
wir die Parameter sehen, die
sie erwartet und wir können sie verwenden, um
unsere Variable auf 0-1 zu begrenzen die Strg- oder
Befehlstaste gedrückt halten und auf
den Namen der globalen Funktion klicken , können
wir auf die Referenz
für diese Funktion zugreifen, einschließlich einer Beschreibung
und ihrer Verwendung Diese sind alle in
der globalen Scope-Klasse enthalten. Okay, ich füge meinem Skript eine weitere Variable und eine weitere Zeile hinzu. Wenn wir unsere Szene ausführen,
können wir uns den Szenenbaum der laufenden Simulation über
das Szenenfenster ansehen laufenden Simulation über
das , indem wir
auf den Fernschalter Das ist nicht
derselbe Szenenbaum in der lokalen Registerkarte, den wir
erstellen, um die Szene zu definieren, quasi eine Blaupause Dieser Szenenbaum wurde von
der Engine für die Ausführung der Szene
erstellt Wenn wir einen Knoten auswählen, können wir seine Eigenschaften
im Inspektor
sehen
und wir können sehen, dass
die Ready-Funktion
bereits ausgeführt wurde , da die Farben unterschiedliche Werte
haben. Wir können auch die Werte
jeder dieser Eigenschaften ändern. Wir können print auch verwenden
, um zu jedem Zeitpunkt auszudrucken, wann immer wir sehen möchten, was unsere
Variablen enthalten. Und es hilft, Ihre Print-Statements so
aussagekräftig wie möglich
zu gestalten, damit keine Verwirrung
darüber entsteht , woher sie
kommen Aber wenn wir die Dinge ändern
und die Prozessfunktion verwenden, ändere ich die Farbe einfach
schrittweise im Laufe der Zeit füge
dann hier eine Druckaussage Da diese Prozessfunktion 60 Mal pro Sekunde
ausgeführt wird, ist 60 Mal pro Sekunde
ausgeführt wird, der Wert von Druckanweisungen
als Debugging-Tool
stark reduziert, da das Ausgabelog dieselbe Nachricht nur
schneller wiederholt , als wir sie
lesen oder darauf reagieren können Wir können die
Simulation unterbrechen, während sie
läuft , indem wir die
Pause-Taste drücken oder F 7 drücken Auf diese Weise können wir den
Remote-Szenenbaum so sehen, wie er gerade ist , und
den Inhalt des
Ausgabefensters überprüfen , während
die Simulation angehalten Dies ist jedoch immer noch
nicht sehr nützlich, da zwischen dem
Start
der Simulation und dem Zeitpunkt, an dem wir sie anhalten können, mehrere Frames abgeschlossen
werden der Simulation und dem Zeitpunkt, an dem Start
der Simulation und dem Zeitpunkt, an dem wir sie anhalten können Wenn wir links neben
eine Codezeile klicken, können
wir einen
automatischen Breakpoint hinzufügen durch einen roten Kreis
gekennzeichnet Wenn wir die aktuelle Szene ausführen, wird
die Simulation
angehalten, wenn sie
diese Zeile erreicht , bevor sie ausgeführt Dies ist viel
hilfreicher, wenn wir möchten
, dass unsere Simulation Frame für Frame ausgeführt
wird. Jetzt können wir sehen, wie sich bei jedem Bild die Farbe von Bild
zu Bild allmählich ändert. Lassen wir unsere Prozessfunktion eine andere Funktion aufrufen, um eine einfache Aufgabe
auszuführen. Ich ändere die Farbe einfach schrittweise, indem ich den Rotwert
reduziere. Jetzt sollten wir also sehen, dass sich
die Farbe bei jedem Frame allmählich ändert und
weniger rot und mehr blau wird. Wenn sich der Breakpoint immer noch in der ersten Zeile der
Prozessfunktion befindet, führe
ich die Szene Es hört hier auf, und wir können sehen
, dass die nächste Codezeile ausgeführt werden
soll,
mit einem gelben Dreieck gekennzeichnet ist Während die Simulation auf diese Weise angehalten
wird, können
wir sie anweisen , jeweils
nur eine einzige Codezeile
und
nicht einen ganzen
Frame auszuführen , indem wir im Debug-Menü die Option Step over wählen oder die Tastenkombination F ten
verwenden Dadurch wird
nur die
Codezeile ausgeführt , auf
die das gelbe Dreieck zeigt, und
dann sofort wieder angehalten dann sofort wieder angehalten Wir können also die Änderungen sehen, die nur durch diese
einzelne Codezeile
vorgenommen wurden,
und wir können sehen, dass das
gelbe Dreieck die nächste Zeile zeigt, die
darauf wartet, ausgeführt zu werden. Wir können
unser Skript Zeile für Zeile weiter ausführen , indem
wir Schritt für
Schritt weitermachen, bis
die Prozessfunktion
beendet und der Frame abgeschlossen ist, und dann Schritt weitermachen, bis
die Prozessfunktion zum Anfang
der Prozessfunktion
zurückkehren, zum Anfang
der Prozessfunktion
zurückkehren um sie ein zweites Mal auszuführen Jetzt können wir beobachten, wie sich jede einzelne Farbe
ändert ihr Blauwert erhöht wird wenn
ihr Blauwert erhöht wird,
unabhängig davon, ob der
Rotwert gesenkt wird, obwohl sie
während desselben Frames auftreten Bei Funktionsaufrufen
gibt es eine weitere Möglichkeit, in die Funktion
einzusteigen. Wenn wir diese Option wählen
oder die Tastenkombination F 11 verwenden, springt der gelbe Pfeil stattdessen in die
aufgerufene Funktion und führt diese Zeile für Zeile bis sie abgeschlossen ist. Wenn die Funktion abgeschlossen ist, kehrt
der gelbe Pfeil zur ursprünglichen Funktion zurück, um mit
der Ausführung dieser Funktion
fortzufahren. Mit diesen Tools haben wir
einen sehr konzentrierten Überblick
darüber, einen sehr konzentrierten Überblick was unsere Klassen
tun und wann, wie sie sich verhalten, und wir können sie in
Zeitlupe beobachten um herauszufinden, was zu welchem
bestimmten Zeitpunkt schief
läuft welchem
bestimmten Zeitpunkt schief
läuft Wenn Sie
ein Problem nicht selbst lösen können, ist
die GDA-Community sehr hilfreich und immer
bereit, Ihnen unter die Arme zu greifen Es gibt Discord-Server
für GoDo-Entwickler, darunter meinen Server, auf dem sich meine Schüler gegenseitig helfen Der Link zum Beitritt
befindet sich in meinem Profil. Es gibt auch Online-Foren auf Websites wie Redit, in denen
Sie auch Fragen stellen können Sie haben jetzt ein grundlegendes
Verständnis der meisten
GDScript-Syntax und der Tools, die benötigen, um diese
Konzepte weiter zu untersuchen Wenn du bereit bist, frage
mich bitte nach einem Rabattcode für einen meiner
Spielprojekt-Kurse. Viel Glück
14. SET-UP: Hallo Freunde. Falls du es
noch nicht getan hast, musst
du
die GDOGameEngine
von Gudo engine.org herunterladen von Extrahieren Sie dann den Inhalt
des gezippten Ordners. Stellen Sie sicher, dass Sie diesen
entpackten Ordner einem sicheren Ort auf Öffne Gudo, wenn du bereit bist. Hoffentlich haben Sie die Reihe „Einführung in
die Programmierung“ abgeschlossen , sodass Sie ein grundlegendes
Verständnis
des Editors und des Schreibens von
Skripten haben des Editors und des Schreibens von
Skripten Klicken Sie auf die Plus-Schaltfläche Erstellen
, um ein neues Projekt zu erstellen. Unser Ziel in diesem
Kurs ist es,
ein ganzes Spiel mit
nur
Benutzeroberflächenknoten in einer einzigen Szene zu erstellen ein ganzes Spiel mit . Sie können Ihrem Projekt
einen beliebigen Namen geben, z. B. UI-Kurs, unbenanntes UI-Spiel, oder wenn Sie einen Namen für Ihr
Spiel haben, können Sie ihn hier verwenden Godot erstellt automatisch
einen neuen Ordner für Ihr
Projekt in Dokumenten,
oder Sie können auf Durchsuchen klicken, um den Speicherort
zu ändern Ich möchte alle
meine GdoObjects
in einem Unterordner mit Dokumenten haben in einem Unterordner Dieses Projekt erfordert
kein komplexes Rendern, sodass der Renderer keine Rolle spielt,
aber ich verwende Kompatibilität, damit ich ins Web exportieren kann Und GODO bietet standardmäßig
Versionskontrollunterstützung ,
was sehr
hilfreich ist, und ich kann
nur empfehlen, zu lernen, wie
Sie es für Ihre Projekte verwenden können Da unser Spiel
nur eine einzige Szene mit
Benutzeroberflächenknoten enthalten sollte , beginnen
wir damit, unseren
Stammknoten als Benutzerschnittstelle zu erstellen Benutzeroberflächenknoten haben alle grüne Symbole, um sie
im Szenenbaum
leicht identifizierbar zu machen . Wir können unsere Knoten umbenennen, indem wir auf sie
klicken, nachdem sie
bereits ausgewählt sind , oder indem wir mit der rechten Maustaste darauf klicken und Umbenennen auswählen. Geben wir diesem
Knoten den Namen Titelbildschirm. Speichern Sie diese Szene dann in unserem Projekt entweder über
das Hauptmenü Szene, Szene
speichern oder mit der
Tastenkombination Strg S oder Befehl S. Trotz der Tatsache , dass der Stammknoten Titelbildschirm
heißt, beabsichtigen
wir, das
gesamte Spiel in einer Szene Ein gebräuchlicher Name, der in
diesem Fall für die
Szene verwendet wird, wäre Main, also werde ich diesen Namen Mcene nennen Und mit nur einer Szene können
wir sie einfach im Ressourcenordner des
Projekts belassen Wenn Sie sich nicht sicher sind, was ich mit Benutzeroberflächenknoten
meine, wählen Sie den Stammknoten
des Projekts aus. Schauen Sie sich dann die
Eigenschaften im Inspektor an,
erweitern Sie den Themenbereich, erweitern Sie den Themenbereich, klicken Sie auf den
Abwärtspfeil neben dem Thema wählen Sie
dann ein neues Thema aus. Diese Szene hat jetzt
ein Thema, das die Art Weise
ändert, wie all ihre
Kontrollknoten angezeigt werden. Klicken Sie auf das neue Thema, um es im unteren Bereich zu
öffnen. dieses Fenster erweitern, um
einen besseren Überblick über den
gesamten Inhalt zu erhalten , können
wir eine Vielzahl
von
Benutzeroberflächenknoten in der Vorschau sehen von
Benutzeroberflächenknoten in der Vorschau Bezeichnungsschaltflächen verschiedener Typen, editierbarer Text, Zahlen
und Schieberegler, Trennzeichen, Fortschrittsbalken, Tabs, eine Baumstruktur
und eine Bildlaufleiste — all
das ist in
einem Bedienfeld und mehreren Containern enthalten, in denen einem Bedienfeld und mehreren Containern wird Einige Kontrollknoten sind hier
nicht enthalten,
darunter einer, der zur Anzeige von zwei
D-Texturen verwendet werden kann Anzeige von zwei
D-Texturen verwendet Wenn Sie sich noch nicht für ein
Spiel für Ihr Projekt entschieden haben, versuchen Sie, sich
etwas auszudenken, das Sie vielleicht nur mit
diesen Komponenten erstellen möchten. Wir sind jetzt bereit,
unser neues Spielprojekt zu starten. Im nächsten Abschnitt werden
wir
einen einfachen Titelbildschirm
für unser Spiel erstellen . Wir sehen uns
im nächsten Abschnitt.
15. Label A: Hallo Freunde. Sobald
unser Projekt gestartet ist, werden
wir unser Spiel
mit einem einfachen Titelbildschirm beginnen. Das Grundlegendste, was wir für
einen Titelbildschirm für unser
Spiel benötigen , wäre der Titel. Beginnen wir damit,
dem Szenenbaum einen neuen Knoten
hinzuzufügen ,
indem wir auf die Plus-Schaltfläche klicken, rechten Maustaste auf den
Stammknoten klicken und „
Kind hinzufügen“ auswählen mit der
rechten Maustaste auf den
Stammknoten klicken und „
Kind hinzufügen“ auswählen oder die Tastenkombination
Strg A oder Befehl A
verwenden. Um die Herausforderung abzuschließen Um die Herausforderung abzuschließen, nur Benutzeroberflächenknoten zu verwenden, verwenden
wir nur die Knoten, die unter Kontrolle sortiert
sind. Dieses Steuerelement ist
ebenfalls vom gleichen Typ wie der Stammknoten der Szene. In der
Beschreibung können wir sehen, dass Control
die Basisklasse für alle Steuerelemente der grafischen
Benutzeroberfläche ist . Diese Knoten
passen ihre Position und Größe an ihre
übergeordneten Kontrollknoten an. Das Steuerelement, das am häufigsten
zur Anzeige von Text verwendet wird Namen Label, das
durch ein Tag-Symbol gekennzeichnet ist. Wir können uns auch die Vererbung
der Label-Klasse ansehen, da jeder Knotentyp
unter dem Typ, von dem er erbt, eingerückt ist unter dem Typ, von dem er erbt Jeder Knoten oder jede Klasse, die von einem anderen
erbt, hat
dieselben geerbten Eigenschaften
plus eigene zusätzliche Eigenschaften plus eigene zusätzliche Der Label-Knoten ist also ein Knoten, aber er ist auch ein Canvas-Element, ein Kontrollknoten und ein Label Jeder von ihnen hat seine eigenen Eigenschaften und Verhaltensweisen. Wir können sehen, dass der
Label-Node
unterhalb des Wurzelknotens eingerückt ist , da
er ein untergeordnetes Element dieses Nodes ist Der Wurzelknoten ist
der übergeordnete Knoten des Labels, daher passt das Label seine Position und Größe
an den übergeordneten Knoten Wir werden bald sehen, was das bedeutet. Lassen Sie uns den Label-Node in
title umbenennen und uns seine
Eigenschaften im Inspektor ansehen. Die erste Eigenschaft ist der Text, den das
Label anzeigen wird. Also können wir hier den Titel des
Spiels eingeben. Es gibt auch
mehrere Optionen zur Steuerung der
Textausrichtung, des Zeilenumbruchs, der
Ausrichtung, der
Absatztrennung, des Ausschneidens, Ellipsen und der Tabstopps Nichts davon ist wirklich auf unseren Titel
anwendbar,
außer vielleicht Großbuchstaben, wenn Sie es vorziehen alle Kleinbuchstaben in Großbuchstaben
umzuwandeln Die Eigenschaften unter „
Angezeigter Text gelten nur für Situationen, in denen
zu viel Text vorhanden ist , um ihn auf
einmal anzuzeigen Und BD-Optionen sind für
Sprachen verfügbar , die von
rechts nach links statt
von links nach rechts angezeigt werden . Nichts davon ist wichtig
für den Titel unseres Spiels. Drücken wir Play und
unser Titel wird angezeigt. Da keine Szene für die
Hauptszene dieses Projekts
ausgewählt wurde , werden
wir aufgefordert, sie einzustellen. Drücken Sie auf Aktuell auswählen, um
diese Szene als Hauptszene des
Spiels festzulegen . Wir können sehen, wie unser Spiel läuft
und der Titel wird in der oberen linken Ecke
des Fensters angezeigt. Drücken Sie die Stopptaste
, um die Simulation zu beenden. Das funktioniert,
ist aber nicht sehr gut. Wir möchten den
Titel wahrscheinlich verschieben und vergrößern. Wenn wir uns die
Eigenschaften des Label-Nodes genauer
ansehen, sind dies alle Eigenschaften
des Label-Nodes selbst, aber wenn wir nach unten scrollen, gibt es noch mehr Eigenschaftsbereiche . Der nächste Abschnitt enthält
alle Eigenschaften
, die der Label-Node von Control
erbt Wenn wir den Layoutbereich und
dann den Transformationsbereich erweitern , können
wir die Größen- und
Positionseigenschaften
des Label-Nodes sehen Positionseigenschaften
des Label-Nodes Wenn Sie dieses
Rechteck in Ihrer 2-D-Ansicht nicht sehen können,
passen Sie es an, bis Sie
das Mausrad zum Schwenken und Zoomen verwenden können . Dieses blaue Rechteck
ist der Anzeigebereich des Spiels, so wie er
gerendert wird, wenn wir das Spiel ausführen. Beachten Sie, wie sich die rote
X-Achse mit
der Oberseite des
blauen Rechtecks überschneidet der Oberseite des
blauen Rechtecks sodass es magentafarben erscheint Die grüne Y-Achse
überlappt die linke Seite, sodass sie zyanblau Der Ausgangspunkt der Szene
befindet sich in der oberen Wenn wir auf
den Titel klicken und ihn von
der oberen linken Ecke wegziehen , seine X- und Y-Werte für
die Position im werden
seine X- und Y-Werte für
die Position im Inspektor aktualisiert, sodass sie die neue Position
widerspiegeln Beachten Sie, dass die Y-Position durch Verschieben
des
Labels nach unten vergrößert und durch Verschieben nach
oben verringert wird. Platzieren wir den Titel
irgendwo in der Mitte des Bildschirms. Drücken Sie dann die
Play-Taste, um die Änderung zu sehen. Der Titel wird jetzt
in der Mitte des Bildschirms angezeigt. Aber was passiert, wenn
wir die Größe des Fensters ändern? Die Position des
Titels wird durch
seinen Abstand von der oberen
linken Ecke des Fensters bestimmt seinen Abstand von der oberen
linken Ecke des Fensters Wenn wir ihn also
vergrößern oder verkleinern, befindet sich
der Titel nicht mehr in
der Mitte des Fensters. Drücken Sie die Reset-Taste, um das Etikett wieder an den
Ursprung, Position 00, zurückzubringen. Sie haben wahrscheinlich das grüne X
am Ursprung bemerkt , als
Sie den Labelknoten ausgewählt haben. Dies sind vier Anker, alle auf
dieselbe Position zeigen Lassen Sie uns den Layoutmodus
des Labelknotens von
Position zu Anker ändern des Labelknotens von
Position zu Anker Dadurch wird eine weitere Eigenschaft namens
Anker-Voreinstellungen hinzugefügt ,
die wir ändern können Wenn wir die
Anker-Voreinstellungen auf Full Wreck ändern, entspricht
das dem Wurzelknoten mit einem Anker in Wenn wir den Wurzelknoten auswählen, zeigen
die Anker alle
auf verschiedene Ecken
des Bildschirms R wählen Sie den Labelknoten aus. Mit den übrigen
Optionen wird das Etikett
an verschiedenen Stellen auf
dem Bildschirm verankert , und zwar
in Ecken, die auf einer Achse
entlang des Bildschirms zentriert oder gestreckt sind. Lassen Sie uns den Titel in
der Mitte des Bildschirms verankern. Wenn wir nun auf Play klicken dann die Größe des Fensters ändern, bleibt
der Titel zentriert auch wenn sich
die Bildschirmgröße ändert können auch anpassen, wie sich
diese Anker auf
den Knoten auswirken , indem Sie die
Anker-Voreinstellungen in „Benutzerdefiniert“ ändern Auf diese Weise können wir
die Ankerpunkte ändern und sie als Prozentsätze der Breite oder Höhe
des Bildschirms
definieren Breite oder Höhe
des Bildschirms Da Anker auf die Ecken
zeigen, jede dieser
Ankerpunkteinstellungen wirkt sich
jede dieser
Ankerpunkteinstellungen
auf zwei Ich bin damit einverstanden, den
Titel horizontal zentriert zu lassen, aber ich würde es vorziehen,
wenn er
leicht nach oben auf etwa ein
Drittel des Bildschirms verschoben leicht nach oben auf etwa ein
Drittel des Bildschirms Wenn Sie den oberen
Ankerpunkt auf ein Drittel einstellen, bewegen sich
die Anker oben links und oben
rechts nach oben Außerdem setze ich den unteren
Ankerpunkt auf ein Drittel, sodass alle Anker
auf dieselbe Position zeigen Und Ankerversätze können verwendet
werden, um Position
des Knotens vom
Ankerpunkt um einen bestimmten Betrag zu verschieben Dies kann dazu führen, dass der Knoten größer als der Text ist, sodass sich die
Ausrichtungseigenschaft der Bezeichnung auswirkt, wo sie gezeichnet
wird Ich bin damit einverstanden, dass die Beschriftung auf dem Ankerpunkt
zentriert ist, also setze ich alle meine
Ankerversätze auf Null zurück Die Wachstumsrichtung
wirkt sich
je nach Größe darauf aus, wie der Knoten relativ
zum Ankerpunkt
neu positioniert wird neu positioniert je nach Größe darauf aus, wie der Knoten relativ
zum Ankerpunkt Wenn wir aufgefordert werden, nach links
oder rechts, nach oben oder unten zu wachsen, können
wir sehen, wie sich die Größe
und Position des Knotens an den Text anpasst
. Ein Spieletitel hat oft eine andere Schriftart und Schriftgröße als alles andere
im Projekt In solchen Fällen können
wir das in
der ersten Lektion erstellte Theme ignorieren und stattdessen den Bereich „
Theme-Override“
in den Eigenschaften
des Steuerelements erweitern . Bevor wir die Schrift ändern können, müssen
wir eine
Schrift in das Projekt importieren. Ich habe diese Schrift
von Google Fonts heruntergeladen. Wir können Dateien
in das Projekt importieren indem wir sie in
das Godot Editor-Fenster ziehen Wir können dies jetzt als Schriftart für
den Titel festlegen. Wir können auch
die Schriftgröße ändern. Ich setze meins auf 49. Stile werden nicht oft für
Beschriftungen verwendet, aber zur Veranschaulichung können
wir ein
flaches Stilfeld hinzufügen, um der Schrift eine
Hintergrundfarbe hinzuzufügen. auf das
Stilfeld klicken, können wir neben
vielen anderen Optionen auch die Farbe ändern. Wie ich bereits sagte, wird dies nicht wirklich
häufig für Etiketten verwendet, und wir werden uns bald ausführlicher mit
Stilboxen befassen. Ich werde das Stilfeld von
meinem Titellabel entfernen , indem ich
auf die Schaltfläche zum Zurücksetzen klicke. Stattdessen füge ich Theme-Overrides für die Schriftfarbe,
Schattenfarbe und Konturfarbe hinzu, sodass die Schrift weiß und der
Schatten transparent Fügen Sie dann Konstanten für
den Schattenversatz, die Konturgröße und die
Schattenkonturgröße Da der Titel nur aus einer Zeile
besteht, hätte der
Zeilenabstand keine Auswirkung Wie bereits erwähnt,
beeinflussen
übergeordnete Kontrollknoten die Größe und
Position ihrer untergeordneten Knoten. Wie wir bereits gesehen haben, ist der
Titelbildschirmknoten im gesamten Rechteck
des Anzeigebereichs
verankert Wenn wir jedoch die Größe ändern, berechnen die
Kinder
ihre Größe und Position neu , damit sie der Größe und Position ihrer Eltern
entsprechen In diesem Fall bleibt der
Titel
horizontal zentriert und ein Drittel vom oberen Rand
des
Titelbildschirms Wir können dies wieder
auf den ursprünglichen Zustand zurücksetzen, indem wir die Anker
des Titelbildschirms zurücksetzen unseres Spiels wird jetzt auf unserem
Titelbildschirm angezeigt In der nächsten Lektion werden
wir einen Hintergrund hinzufügen. Wir sehen uns in der nächsten Lektion.
16. Label B: Hallo Freunde.
Bevor wir zu den Texturen übergehen, können
wir uns etwas genauer befassen, was Labels zu bieten haben. Keine der in
dieser Lektion vorgenommenen Änderungen ist für das Projekt
unbedenklich, und ich werde einfach zum Ende
der vorherigen
Lektion zurückkehren , bevor ich weitermache Jedes Video mit dem Titel B
folgt dieser Regel und bietet nur zusätzliche
Informationen zum vorherigen Thema,
kann aber übersprungen werden den Label-Node auswählen, haben
wir eine Eigenschaft
namens Label-Einstellungen Ähnlich wie bei der Theme-Ressource
aus der ersten Lektion können
wir hier eine neue Ressource für die
Label-Einstellung erstellen, sich
jedoch nur
auf dieses Label auswirkt. Erstellung dieser Ressource für
Labeleinstellungen ignorieren
wir die Theme-Overrides und verwenden stattdessen diese Einstellungen Hier können wir dieselben Einstellungen ändern
, die für Design,
Abstand, Schriftart, Schriftgröße,
Farbe,
Kontur und Schatten verfügbar sind Abstand, Schriftart, Schriftgröße,
Farbe, Farbe, Kontur und Schatten Fügen wir dem Titel eine zweite Textzeile
hinzu. Wenn aus irgendeinem Grund die Größe
eines Labelknotens
größer als der Text ist, die Ausrichtungseigenschaften, wo
der Text gezeichnet wird bestimmen
die Ausrichtungseigenschaften, wo
der Text gezeichnet wird, ob er sich
links, in der Mitte, rechts befindet oder die gesamte Breite,
oben, unten usw. ausfüllt . Wenn der Text zu lang ist, um
in die angegebene
Breite des Labelknotens zu passen , können
wir den
Auto-Rap-Modus verwenden, um zu ändern, wie der Text automatisch in die nächste Zeile
verschoben wird Arbitrary schneidet einfach
an dem Zeichen ab, sich am Ende der Breite
des Labels befindet Word versucht,
Leerzeichen zwischen Wörtern zu umbrechen, und Word Smart bricht ein Wort um, wenn es nicht in eine einzige Zeile
passt Wenn die Bedeutung einer
Eigenschaft nicht
offensichtlich ist und Sie eine detailliertere Erklärung wünschen, erhalten Sie einen Tooltip, mit
der
Maus über wenn Sie mit
der
Maus über den Eigenschaftsnamen fahren Ich werde etwas Lormipsum als
Platzhaltertext verwenden , um die nächsten Einstellungen zu erläutern Ausrichtungskennzeichnungen
können verwendet werden, um zu
ändern, wie die Ausrichtung des Fülltextes
implementiert Ab Gudo Version 4.4 können
Sie das neue
Zeilenzeichen nach Belieben
ändern Zeilenzeichen nach Belieben
ändern Clip-Text kann verwendet werden
, um zu verhindern, dass Text außerhalb
der Grenzen
des Labelknotens gezeichnet wird der Grenzen
des Labelknotens Wenn Clip-Text aktiviert ist, kann das Verhalten beim Überlaufen von Text geändert
werden, um die Art und Weise zu ändern, wie das
Clipping implementiert wird Kürzen von Zeichen
oder Wörtern und sogar Hinzufügen von Ellipsen als
Ersatz für Zeichen oder Wörter Das Auslassungszeichen kann auch beliebig geändert
werden Normalerweise werden Tabulatorzeichen
im Textbereich ignoriert, wenn das Label den Text wiedergibt , aber Sie können Ihren Beschriftungen auch
Tabstopps hinzufügen Klicken Sie auf das gepackte Float
32-Array, um es zu erweitern. Klicken Sie auf die
Plus-Schaltfläche „Element hinzufügen“, um einen Tabstopp hinzuzufügen. Stellen Sie dann den Wert
als Dezimalzahl ein. Mehrere Tabstopps können verwendet
werden, um Diagramme oder Spalten
innerhalb des Label-Nodes zu sortieren oder zu
erstellen. Zurück zu Orm Ipsum,
um den angezeigten Text zu veranschaulichen Wenn wir eine große
Textmenge in einem Label-Knoten haben, können wir
die
Textmenge, die gezeichnet wird,
mithilfe dieser Eigenschaften anpassen Textmenge, die gezeichnet wird,
mithilfe dieser Eigenschaften Durch übersprungene Zeilen werden
Textzeilen ausgeblendet , die
am Anfang beginnen, wohingegen bei der maximalen Anzahl sichtbarer Zeilen Textzeilen ausgeblendet
werden, die am Ende
beginnen Negativ Eins bedeutet in diesem Zusammenhang
unbegrenzt. Sichtbare Zeichen können verwendet
werden, um
die genaue Anzahl der Zeichen zu steuern , die gezeichnet werden. Dies steht in direktem Zusammenhang mit
der Eigenschaft „Sichtbares Verhältnis handelt es
sich um dieselbe Eigenschaft, die jedoch
als Prozentsatz
des gesamten Textes ausgedrückt wird. Wenn Sie einen Wert ändern, wird
der andere automatisch geändert. Wenn sowohl die Sichtbarkeit von Zeichen als auch Zeilenumbruch verwendet
werden, kann die
Art
und Weise, wie der Zeilenumbruch implementiert
wird, mithilfe des Verhaltens für sichtbare
Zeichen
geändert werden . Zum Beispiel würde dieses Wort nicht die erste Zeile
passen,
wenn alles gezeichnet würde, aber es passt nur aufgrund der Anzahl der
sichtbaren Zeichen. Wenn das Verhalten der sichtbaren
Zeichen nach der Formung
auf Zeichen geändert wird, wird
das Wort in
die zweite Zeile umgebrochen unabhängig davon, ob
es vollständig sichtbar ist oder nicht. Die
Einstellungen für das Glyphenlayout werden nur verwendet wenn die Layoutrichtung von rechts nach links eingestellt
ist, und die BD-Einstellungen gelten für Sprachen, in denen speziell von rechts nach links
geschrieben Ich setze das Projekt jetzt
wieder auf den Stand
vor dieser Lektion Das sind alle Etikettenoptionen. In der nächsten Lektion
gehen wir zur Textur Rx über. Wir sehen uns in der nächsten Lektion.
17. Textur Rechtschnur: Hallo Freunde. In
der vorherigen Lektion haben wir
unserem Titelbildschirm einen Titel hinzugefügt. In dieser Lektion
fügen wir ein Hintergrundbild hinzu. Ich habe dieses Bild, das meiner
Meinung nach
gut zu meiner Spielidee passt , auf free pic.com
von UpClac Stellen Sie sicher, dass Sie die
Quellenangaben und die
Lizenzierung der Ressourcen, die Sie
online finden, überprüfen , bevor Sie Ich habe dieses Bild heruntergeladen
und wir importieren es in Gadot, damit ich es als Hintergrund für meine
Titelbildschirme verwenden kann Um zu verhindern, dass mein
Projektressourcenordner zu überladen
und unorganisiert wird, erstelle
ich einen Ordner Sie dann zum Spaß in diesem Ordner einen weiteren Ziehen Sie dann jede Datei in den entsprechenden Ordner, damit
ich weiß, wo ich sie finde. Um diese Textur zu zeichnen, müssen
wir unserer Szene einen neuen
untergeordneten Knoten hinzufügen. Der Knoten, den wir
verwenden müssen, um Bilder
auf dem Bildschirm zu zeichnen , ist der Knoten, der die
Textur zerstört hat Lassen Sie uns diesen
Knotenhintergrund umbenennen. Füllen Sie dann seine
Textureigenschaft mit dem importierten Bild Wir können den Titel nicht mehr sehen. Das Bild wird darüber
gezeichnet. Standardmäßig wird jeder Knoten
im Szenenbaum
von oben nach unten gezeichnet. Also
wird zuerst der Titel gezeichnet, dann
wird der Hintergrund darüber gezeichnet. Wir können unsere Knoten
einfach neu anordnen, indem wir sie ziehen. Der Hintergrund ist also im Szenenbaum
über
dem Titel sortiert Szenenbaum
über
dem Titel Auf diese Weise wird der Titel über den Hintergrund
gezogen. Dieses Bild ist viel größer als die
Anzeigefläche für unser Spiel. Wir möchten, dass das Hintergrundbild
das gesamte Display bedeckt, also ändern wir die
Voreinstellungen für den Ankerpunkt auf „komplett zerstört Dadurch wird das Bild so verschoben, dass innerhalb
der vier Anker
zentriert wird, aber es ist immer noch Wenn wir den Erweiterungsmodus
des durch die Textur zerstörten Knotens ändern, können
wir ihn anweisen,
die Größe der Textur zu ignorieren und stattdessen die durch die Anker
angegebene Größe zu verwenden Jetzt deckt das Bild den
gesamten Anzeigebereich ab, obwohl das
Seitenverhältnis des Bildes nicht exakt mit dem Seitenverhältnis
des Anzeigebereichs übereinstimmt Bei diesem Bild ist das schwer zu erkennen, aber es ist jetzt verzerrt und vertikal
gestreckt Es gibt auch andere Optionen, um das Bild an die Breite
anzupassen,
wobei die Höhe des Bildes ignoriert eignen sich für die Anpassung eine horizontale Anordnung
oder für die Anpassung der Höhe, wobei die Breite des Bildes ignoriert wird und es besser in eine vertikale Anordnung passt Mit jeder der proportionalen
Optionen wird
versucht , dasselbe wie bei den
vorherigen Optionen zu erreichen, aber auch das Seitenverhältnis der
Bilder beizubehalten Wenn die Breite proportional angepasst
wird, deckt das Bild den gesamten Anzeigebereich wobei das Seitenverhältnis
beibehalten wird. Als Nächstes haben wir die Optionen für den
Streckmodus, standardmäßig auf Skalierung eingestellt sind, die
standardmäßig auf Skalierung eingestellt sind, sodass das Bild beliebig
gestreckt werden kann, um den Anforderungen
des Erweiterungsmodus und der Anker gerecht des Erweiterungsmodus und der Anker Der Kachelmodus ist für Bilder vorgesehen, die kleiner als
die angegebene Größe
sind Tauschen wir also das Bild gegen das Gudo-Symbol
aus. Jetzt ist der Bereich
mit Kacheln des Bildes gefüllt. diese Änderung rückgängig machen, ignoriert Keep den
Erweiterungsmodus und zwingt das Bild, seine
ursprünglichen Abmessungen beizubehalten und es an
der oberen linken Ecke auszurichten Bildmitte beibehalten, werden auch die ursprünglichen Abmessungen
des Bilds beibehalten, die Bildmitte jedoch innerhalb Ausrichtung beibehalten, kann
das Bild verkleinert oder vergrößert werden
, sodass es in den Bereich passt wieder zu „Größe ignorieren“ wechseln, übereinstimmen deckt das Bild nicht
den gesamten Bildschirm ab,
da
die
Seitenverhältnisse nicht Die Option „Ausrichtung mittig halten“
bewirkt dasselbe, zentriert das
Bild
aber auch innerhalb des Bereichs. Bei „Bildausschnitt beibehalten“
wird die Größe des Bilds geändert, wobei das Seitenverhältnis beibehalten Achten Sie
jedoch darauf, dass es den gesamten Bereich
abdeckt Jetzt werden also der linke und
der rechte Rand dieses Bildes beschnitten Wenn Sie sicherstellen möchten, dass
das gesamte Bild angezeigt wird, würden
Sie wahrscheinlich „Seitenverhältnis
beibehalten“ oder „Ausrichtung
zentriert“ verwenden und
die Hintergrundfarbe ändern,
um den ungenutzten Bereich auszufüllen Wenn es Ihnen nichts ausmacht, die Kanten
zuzuschneiden, ist die
Option „Bildausschnitt abdecken auch eine gute Option für
Hintergrundbilder Mit den Schaltern „Horizontal
spiegeln“ und „Vertikal spiegeln“
wird das Bild einfach umgedreht ,
falls
Sie das möchten Lass uns Play drücken und
sehen, wie es aussieht. Denken Sie daran, dass sich die Anker ändern, wenn wir
die
Größe des Spielfensters ändern
und sich darauf auswirken, wie das
Bild gezeichnet wird Und das Bild skaliert
sich zwar von selbst, um es an das Fenster anzupassen, der Titel wird nur von selbst
neu positioniert, da er
auf eine bestimmte Schriftgröße gezeichnet wird Wir können jedoch einige Einstellungen ändern , um mehr Kontrolle
über dieses Verhalten zu haben Wählen Sie im Hauptmenü die Projekteinstellungen aus. Suchen Sie dann unter
Display nach einem Fenster. Hier können wir die Abmessungen unseres
Viewports bearbeiten, indem wir die Abmessungen
des Spielfensters ändern , wenn
wir das Spiel starten, und auch die Abmessungen
des blauen Rechtecks
im Editor Es ist eine gute Idee, dies so
einzustellen, dass es
den Abmessungen Ihrer
Zielveröffentlichungsplattform entspricht den Abmessungen Ihrer
Zielveröffentlichungsplattform Die Anker wurden noch nicht aktualisiert,
aber wenn Sie
die Knoten auswählen oder ihre Größe ändern, müssen
sie aktualisiert werden, und wir können ihre
Anker-Voreinstellungen wieder auf Volltext zurücksetzen I: Wir können ändern ob das Spiel
in einem Fenster oder im Vollbildmodus geöffnet wird, aber ändern Sie
diese Einstellung
erst , wenn Sie Ihr Spiel auf irgendeine Weise
verlassen Du kannst auch ändern, wo das
Fenster auf dem
Bildschirm angezeigt werden soll , indem du den anfänglichen
Positionstyp auf Absolut dann die
Bildschirmkoordinaten für das Fenster änderst Und auch, auf welchem Bildschirm
es angezeigt werden soll indem Sie den Typ
der
Ausgangsposition in die Mitte des anderen Bildschirms ändern Mitte des anderen Bildschirms dann
den Bildschirmindex angeben. Diese Optionen funktionieren nur
bei einem exportierten Projekt,
nicht, wenn wir
sie im Editor ausführen. Wir können das
Fenster randlos machen. Und sogar ändern, ob die Größe
des Fensters geändert werden kann oder nicht. Dies ist eine Möglichkeit,
das Problem zu beheben, aber keine sehr
flexible Lösung Die Einstellungen unter Stretch
bieten bessere Alternativen. Wir können den
Stretch-Modus
des gesamten Spiels von „
Deaktiviert“ auf „Canvas-Objekte“ ändern . Denken Sie daran, dass alle Kontrollknoten vom Canvas-Objekt
erben, sodass sie alle zusammen mit dem Fenster
gestreckt werden Eine weitere Einstellung gibt es für das
Dehnen des gesamten Viewports, was die
Ausgabe von drei D-Kameras einschließt Wenn wir diese Dehnung durchführen, können
wir ändern, ob das Display des Spiels sein Seitenverhältnis
beibehält oder nicht Ignorieren ermöglicht es dem Spiel , sich in
beliebiger Weise zu zerquetschen und zu dehnen Bei „Breite oder Höhe
beibehalten“ kann das Spielfenster nur so weit skaliert werden, wie es die
Breite oder Höhe zulässt Beim Erweitern wird die
Anzeige des Spiels vergrößert und verkleinert, wobei
das Seitenverhältnis
beibehalten wird. Es wird
jedoch so erweitert, dass es
das gesamte Fenster ausfüllt Mithilfe von „Skalieren“ können
alle Leinwandelemente
automatisch auf die
Hälfte oder bis zum
Achtfachen ihrer Größe verkleinert alle Leinwandelemente
automatisch auf die Hälfte oder bis zum
Achtfachen ihrer Größe Nützlich für die Entwicklung
für Plattformen, deren Auflösungen
sich drastisch von
denen Ihres Entwicklungscomputers unterscheiden . Und der Skalierungsmodus kann
auf Ganzzahl gesetzt werden, um
die Skalierung auf die Division
oder Multiplikation mit ganzen Zahlen zu beschränken die Skalierung auf die Division oder Multiplikation mit ganzen Zahlen Dies ist besonders nützlich für
Pixelgrafiken , da es keine Pixelverzerrung
verursacht, wenn
versucht wird, Pixel um
Bruchteile zu dehnen oder zu
verkleinern stehen
Einstellungen für die Ausrichtung von Handgeräten zur Verfügung Entwicklung
mobiler Geräte stehen
Einstellungen für die Ausrichtung von Handgeräten zur Verfügung, mit denen sie sich auf Hochformat,
Querformat oder Rückwärtsrichtung
beschränken oder die Ausrichtung mithilfe des Sensors des Geräts bestimmen können Und der VSync-Modus kann
geändert werden, um zu bestimmen, wie die GPU des Geräts mit der Bildwiederholfrequenz des
Displays
synchronisiert wird mit der Bildwiederholfrequenz des
Displays
synchronisiert Diese Einstellungen sind bei Verwendung
des
Kompatibilitätsrenderers nicht
verfügbar und
gelten auch nicht für alles, was
wir in diesem Projekt tun Wir haben jetzt ein
Hintergrundbild für unseren Titelbildschirm. In der nächsten Lektion werden wir eine Startschaltfläche
hinzufügen. Wir sehen uns in der nächsten Lektion.
18. Taste A: Hallo, Freunde. In
der vorherigen Lektion haben wir unserem Titelbildschirm ein
Hintergrundbild hinzugefügt, und in dieser Lektion
fügen wir eine Startschaltfläche hinzu. fügen
dem Titelbildschirm einen neuen Knoten hinzu, genau wie wir es zuvor getan haben Diesmal
suchen wir nach dem Schaltflächenknoten. Ähnlich wie der Label-Node kann
eine Schaltfläche
Text, aber auch ein Symbol enthalten. Nennen wir die Schaltflächen Start. Geben Sie dann auch den gleichen
Text in das Textfeld ein, damit er
auf der Schaltfläche angezeigt wird. Es gibt auch ein Symbolfeld, wir mit
dem Gadot-Symbol füllen können , um zu
sehen, wie es funktioniert Die Schaltfläche wird als
abgerundetes Rechteck gezeichnet , das
sowohl den Text als auch das bereitgestellte Symbol
umfasst das
sowohl den Text als auch das bereitgestellte Symbol dem flachen Schalter werden
alle Texturen oder Farben
von der Schaltfläche entfernt , sodass nur der Text und das Symbol
gezeichnet Der gesamte
Schaltflächenbereich ist jedoch weiterhin anklickbar, und es gibt immer noch
einen Fokusstil auf der Schaltfläche, der
gezeichnet wird, wenn er den Fokus hat die Abschnitte „Textverhalten“
und „Symbolverhalten“ erweitern, können
wir die
Ausrichtung von Text
und Symbol ändern, um die Art und Weise zu ändern, wie sie auf der Schaltfläche angezeigt
werden Diese Änderungen sind viel
offensichtlicher , wenn die Schaltfläche
größer ist , als sie sein muss, um sowohl den
Text als auch das Symbol
aufzunehmen. Einige der gleichen
Verhaltenseinstellungen sind als Label-Node
verfügbar
, um den Textüberlauf zu kontrollieren Automatisches Umschließen. Und Ausschneiden , wenn die Größe der Schaltfläche
zu klein ist , um den Text
aufzunehmen Und das Symbol kann auf die
Größe der Schaltfläche
erweitert werden auf die
Größe der Schaltfläche
erweitert BD-Optionen sind auch
für Sprachen verfügbar , die von rechts nach links
geschrieben werden. Basisschaltfläche ist eine Klasse, von der
alle Schaltflächen erben, auch Schaltflächen anderer Typen Wir werden diese Einstellungen
in Lektion B
für Schaltflächen durchgehen . Lassen Sie uns zunächst
die Eigenschaften bearbeiten, die von control
übernommen wurden, und beginnen mit dem Layout Ich möchte, dass sich meine
Startschaltfläche auf zwei Dritteln
der Bildschirmhöhe unter meinem Titel befindet. also den Layoutmodus
von Position zu Anker wechsle, ändere
ich die
Anker-Voreinstellungen auf Benutzerdefiniert Verschieben Sie dann den linken Anker auf 0,5 und den oberen Anker auf 0,667 Der rechte Anker darf nicht
weiter links sein als
der linke Anker, daher wird er automatisch auf denselben
Wert geändert Ebenso
darf sich der untere Anker nicht über dem oberen Anker befinden. Die Schaltfläche befindet sich
derzeit unten und rechts neben dem
Anker, daher ändere ich die Wachstumsrichtung in beide
Richtungen. Setzen Sie dann die Ankerversätze , dass die Schaltfläche in der Mitte des
Ankerpunkts liegt Wenn die Schaltfläche positioniert ist, der nächste Schritt darin, ihre Theme-Eigenschaften zu
bearbeiten Wenn Sie möchten, dass die
Schaltfläche einzigartig ist, den Abschnitt
zum
Überschreiben des Themes für diese Schaltfläche
zu verwenden wäre es angemessen, den Abschnitt
zum
Überschreiben des Themes für diese Schaltfläche
zu verwenden. Wenn Sie jedoch möchten, dass mehrere Schaltflächen dieselben
Theme-Eigenschaften
haben, ist es besser, sie nur einmal festlegen zu müssen. Wenn Sie den Stammknoten ausgewählt
haben, haben wir
in der ersten Lektion ein Thema erstellt. Sie können auch jetzt eines erstellen, falls Sie dies noch nicht getan haben. Lassen Sie uns die Standardschrift
und Schriftgröße für unser Thema ändern , und wir können die Auswirkungen
dieser Änderung in der
Themenvorschau sehen . Dieses Design ist zwar eine
Eigenschaft des Stammknotens, nicht der Schaltfläche, aber
Änderungen an diesem Design wirken sich
auch auf die Schaltfläche aus. Das liegt daran, dass das Thema
in einer anderen
Form
der Vererbung über den Szenenbaum vom Elternteil an
das Kind weitergegeben der Vererbung über den Szenenbaum vom Elternteil an wird. Wenn ein Node
Eigenschaften wie den Titel verwendet, die das Design überschreiben, dann setzen diese Einstellungen
die geerbten Theme-Eigenschaften außer Kraft . Wenn man sich
das Theme-Panel anschaut, enthält
unsere Theme-Vorschau einen Button-Node mit den
Standard-Theme-Eigenschaften, mit der
Ausnahme, dass die
Schriftart und Schriftgröße an
die neuen Einstellungen angepasst
wurden. Durch Klicken auf die Plus-Schaltfläche können
wir
der Theme-Like-Schaltfläche Knotentypen hinzufügen. Dadurch werden mehrere Eigenschaften hinzugefügt , die wir
dem Thema hinzufügen und bearbeiten können. Ab dem Farbbereich können
wir die
Farbe des Textes
und des Symbols ändern , während sich die Schaltfläche in verschiedenen Zuständen
befindet. Die normale Schriftfarbe der Schaltflächen muss sich vom Hintergrund
abheben. Ich verwende einfach das
Standard-Hellgrau. Oft hat eine deaktivierte
Schaltfläche grauen Text, manchmal
sogar durchsichtigen Text. Wenn Sie mit der Maus darüber fahren, wird die
Farbe möglicherweise heller. Gedrückt ist manchmal dunkler, und ich füge auch
eine Konturfarbe Dieselben Farboptionen sind auch für das Symbol verfügbar. Diese werden mit den Farben
der Symboltextur multipliziert , um das Ergebnis
zu erzielen Im Bereich Konstante können
wir die Anzahl
der Pixel hinzufügen, die
den Text und das Symbol trennen , wenn sie horizontal ausgerichtet
sind Neben der maximalen
Breite für das Symbol wird auch die Höhe
des Symbols
automatisch
angepasst, Höhe
des Symbols
automatisch wobei das Seitenverhältnis
beibehalten wird. Und wir können auch die
Umrissgröße für den Text angeben. Wir haben uns noch nicht mit
Stilfeldern befasst, aber wenn Sie Stilfelder
unterschiedlicher Größe verwenden, können
Sie diese Eigenschaft hinzufügen und ihren Wert auf eins
setzen, um zu erzwingen dass
die Schaltfläche immer
die Größe ihres
größten Stilfeldes verwendet . Wir können die Schriftart für
alle Schaltflächen ändern, wenn wir möchten, aber ich verwende einfach meine
Standardschriftart für das Design. Ich werde jedoch
die Schriftgröße für
meine Schaltflächen etwas größer
als meine Standardschriftgröße machen . Im Bereich Symbole können
wir ein
Standardsymbol angeben, das für alle Schaltflächen verwendet werden soll. Das in den Eigenschaften
der
Schaltflächen festgelegte Symbol Vorrang vor diesem Symbol
, sofern es bereitgestellt wird. Wenn du also möchtest, dass fast
jeder Button in deinem Spiel dasselbe
Symbol hat, würdest du es hier einstellen. Du könntest aber auch spezielle Buttons
mit einzigartigen Symbolen
haben . Der nächste Abschnitt befasst sich mit Stilen, in denen wir einen
anderen
Hintergrund für die Schaltfläche zeichnen können, als das
standardmäßige transparente schwarze gebogene Rechteck. Beginnend mit
Normal: So sieht die Schaltfläche aus, wenn
sie nichts tut. es dem Thema hinzufügen, haben wir mehrere Optionen für
die Bereitstellung von Stilen. Style-Boox-Textur
wird verwendet, um
importierte Bilder zu zeichnen ,
die als Hintergrund für Schaltflächen verwendet Ich habe diese Schaltflächenbilder
, die ich mit dem bereits ausgewählten
Assets-Ordner
in Gadot importieren werde mit dem bereits ausgewählten
Assets-Ordner
in Gadot Auf diese Weise werden sie automatisch
in diesen Unterordner
importiert in diesen Unterordner Klicken Sie auf das Stilfeld, um es im Inspektor zu
öffnen. Stellen Sie dann die normale Textur
auf das normale Stilfeld ein. Ich möchte
die Textur in keiner Weise ändern, aber der Text und das Symbol passen nicht wirklich gut in
das Hintergrundbild. Deshalb füge ich Inhaltsränder hinzu
, um das Symbol und die
Textur von den Seiten weg
in das flache Innere
der Schaltfläche zu zwingen Textur von den Seiten weg . Wenn wir zum gedrückten Stil übergehen, können
wir eine weitere
Style-Box-Textur hinzufügen. Aber dieses Mal füllen Sie die Textur mit dem gedrückten
Bild der Taste Fügen Sie dann dieselben
Inhaltsränder wie gewohnt hinzu. Und wiederholen Sie dies, um
deaktivierte und mit der Maus verbundene Elemente hinzuzufügen. Ich habe keine spezielle
Textur für Hover Press,
aber wir können ein Style-Feld schnell
duplizieren, indem wir auf das Feld klicken und es
von gedrückt in den Slot ziehen die Schaltfläche
in der Szenenstruktur auswählen, können
wir eine Vorschau davon anzeigen, wie die Schaltfläche aussieht, wenn
sie deaktiviert ist, indem in den Eigenschaften, die
von der Basistaste übernommen wurden,
die Option Eigenschaften, die
von der Basistaste übernommen wurden,
die das Spiel starten, können
wir auch sehen der Stil der Taste ändert
, wenn wir mit der Maus
darüber fahren und sie drücken Sobald
die Taste gedrückt ist, hat sie jetzt den Fokus, was ihr
diesen weißen Rand verleiht Wenn Sie dies entfernen möchten, können
Sie ein anderes
Stilfeld für den Fokus bereitstellen. Oder wir können einfach ein
leeres Stilfeld hinzufügen, um es zu entfernen. Diese Schaltfläche macht noch
nichts, aber wir müssen auf eine weitere Lektion
warten. Wir haben jetzt eine Starttaste
für einen Titelbildschirm. In der nächsten Lektion werden wir Links zu sozialen Netzwerken
hinzufügen. Wir sehen uns in der nächsten Lektion.
19. Button B: Hallo, Freunde.
Bevor wir weitermachen, gehen
wir auf einige weitere
Funktionen von Schaltflächen ein. Denken Sie daran, dass keine
der in dieser
Lektion
vorgenommenen Änderungen gespeichert werden. Wir haben uns mit der deaktivierten Eigenschaft der Basisschaltflächenklasse
befasst, aber hier sind noch viele weitere
Eigenschaften aufgeführt. Umschaltmodus wird die
Taste in eine Umschalttaste umgewandelt, d. h. wenn sie einmal gedrückt wird, bleibt
sie gedrückt, bis sie erneut gedrückt wird Taste gedrückt
wird, kann
der Standardstatus der Taste festgelegt der Standardstatus der Taste während sie als Umschalter
verwendet wird Wenn es sich nicht um einen Schalter handelt, die Taste nicht
so eingestellt werden Wir können ändern, ob die Taste gedrückt
gilt, wenn die Maustaste losgelassen wird oder wenn die Maustaste zum ersten Mal gedrückt
wird Und geben Sie auch an,
mit welcher Maustaste auf die Taste geklickt
wird. Wenn die Option „
Außerhalb gedrückt halten“ aktiviert ist,
bleibt der gedrückte Zustand erhalten
, wenn Sie auf die Schaltfläche klicken und die
Maus außerhalb der Tastengrenzen
bewegen die Schaltfläche , bis die Maustaste losgelassen wird. Eine Tastengruppe kann erstellt werden, um eine Umschalttaste
in eine Optionsschaltfläche
umzuwandeln,
d. h., es
kann nur eine Taste gleichzeitig gedrückt werden Wir werden in
einem späteren Abschnitt sehen, wie das funktioniert ,
wenn wir es verwenden Und schließlich kann der Taste eine Tastenkombination zugewiesen
werden. Verwenden wir die Eingabetaste
als Tastenkombination , um diese Taste zu drücken. die Verknüpfung erweitern,
indem Sie darauf klicken, können
wir sehen, dass sie eine Liste von Ereignissen
enthält, auf
die wir auch
klicken müssen, um sie zu erweitern. Die Liste ist leer und
hat daher die Größe Null. Wir können jedoch auf die Plus-Schaltfläche „
Element hinzufügen“ klicken , um dieser Liste
ein Ereignis hinzuzufügen. auf das Drop-down-Menü klicken, verwenden
wir eine
Eingabe-Event-Taste, um darauf zu reagieren, dass der Spieler
eine Taste auf seiner Tastatur drückt. Wenn Sie auf die
Eingabe-Event-Taste klicken, um sie zu erweitern, gibt es hier viel mehr
Eigenschaften, aber wir müssen nur
die Konfigurationstaste drücken , um
ein Event-Konfigurationsfenster zu öffnen . Dieses Fenster wartet aktiv
auf Eingabeereignisse also eine beliebige Taste auf der Tastatur drücken, wird es
automatisch ausgewählt. Wir können auch die Anforderung hinzufügen
, dass sie
andere Tasten wie
Shift Alt, Strg,
Windows gedrückt halten andere Tasten wie
Shift Alt, Strg, oder
die Steuerungs- oder Befehlstaste
automatisch erkennen die Steuerungs- oder Befehlstaste je nach
Betriebssystem des Benutzers. Wenn Sie auf Okay klicken, werden die erforderlichen Informationen für uns eingegeben. Rückmeldung von Tastenkombinationen wird die Rückmeldung von Tastenkombinationen wird festgelegt,
ob sich der
Stil der Schaltfläche ändert ,
wenn die Tastenkombination verwendet wird Durch Tastenkombination
und
QuickInfo wird der Schaltfläche, auf der der Kurzbefehl angezeigt wird
, automatisch eine QuickInfo
hinzugefügt. Lassen Sie beide aktiviert und schauen wir uns an, wie es aussieht. Mauszeiger über die Schaltfläche bewegen, wird in
der QuickInfo angezeigt, dass die Eingabetaste eine
Tastenkombination zum Drücken dieser Taste ist Durch Drücken der Enter-Taste auf der Tastatur wird auch
die Taste gedrückt Wenn wir diese Optionen ausschalten, wird
der Tooltip entfernt, und obwohl die Enter-Taste immer noch eine Tastenkombination
ist, gibt
sie keine visuelle Rückmeldung darüber, dass die Taste gedrückt
wird. Wählen Sie den Stammknoten aus
und werfen Sie einen weiteren
Blick auf die
Texturoptionen der Style-Box für unsere Schaltfläche. tausche ich meine Textur Zur
Veranschaulichung tausche ich meine Textur gegen
das Gadot-Symbol Texturränder können hinzugefügt werden
, um eine neunteilige Schicht zu erstellen. Texturen mit neun Schichten
können bequem in der
Größe geändert werden ,
wobei die Ecken
des Bilds
ihre ursprüngliche Größe beibehalten die Kanten
entlang einer einzigen Achse
gestreckt und der Innenraum entlang beider Achsen gestreckt, um
den zusätzlichen Raum auszufüllen wie diese Achsendehnungen
implementiert werden , kann in
den Einstellungen für die Achsenstreckung geändert werden Dabei kann
entweder das
Bild gedehnt, gekachelt
oder durch eine Kombination aus Kacheln und
Dehnen versucht werden, oder durch eine Kombination aus Kacheln und Nähte
zu entfernen Mithilfe der Option „Seitenränder erweitern“
können Sie
das Stilfeld größer machen , als es seine
Fläche normalerweise zulassen sollte, sodass es in jede
der vier Richtungen
erweitert Die Unterregion wird verwendet, um
Spritesheets in
einzelne Texturen Wenn Sie auf die Schaltfläche Region
bearbeiten wird ein Regionseditorfenster geöffnet. In diesem Fenster können Sie klicken und ziehen, um die Region
auszuwählen die Kanten
und Ecken nach Bedarf
anzupassen Präzision gibt es Optionen für das
Pixel-Snapping höhere Präzision gibt es Optionen für das
Pixel-Snapping Rasterausrichtung Wenn
Ihr Spritesheet gleichmäßig groß und gleichmäßig verteilt
ist, können
Sie die Rastergröße
und den Versatz so festlegen, dass sie dem Spritesheet entsprechen Wählen Sie dann eine oder mehrere
Rasterzellen aus, um Ihre Textur zu formen. Oder Auto Slice
findet automatisch die Texturen für Sie, und Sie können einfach
eine auswählen, indem Sie darauf klicken. Modulate kann auch
die gesamte Textur
mit einer anderen Farbe multiplizieren und sie so an eine
andere Farbe
anpassen Dies wird häufig verwendet, um einen Farbton hinzuzufügen, oder wenn Ihre Textur
ausschließlich aus Graustufen besteht, kann die Modulation
als Hauptfarbquelle verwendet werden, erstellt aus einer einzigen Textur eine Vielzahl
farbiger Stilfelder Andere Optionen sind
auch für die
Erstellung von Stilfeldern
im Theme-Editor verfügbar Erstellung von Stilfeldern
im Theme-Editor Alle anderen
Style-Box-Optionen haben ebenfalls dieselben Optionen für
den Inhaltsrand
wie die Style-Box-Textur. Eine leere Style-Box zeichnet nichts und hat keine
eindeutigen Eigenschaften Stylebox Line hingegen zeichnet eine einzelne horizontale Linie
über den oberen Rand der Schaltfläche auf die Stylebox-Linie klicken, können
wir die Linienfarbe ändern Dicke. Stellen Sie es auf Vertikal um und vergrößern Sie die
Linie in beide Richtungen. Wenn Sie hier negative Werte verwenden
, wird die Linie verkleinert. Style Box Flat zeichnet ein
einfaches farbiges Rechteck. auf die Style-Box Flat klicken, können
wir ihre Farbe ändern
und sie in beide Richtungen neigen Wenn wir eine Rahmenbreite hinzufügen, können wir auch die Farbe
des Rahmens ändern Und fügen Sie den Rand in
den Hintergrund der Schaltfläche ein. Wenn Sie die Zeichenmitte umschalten, wird der Hintergrund
entfernt, sodass nur der Rand
gezeichnet Wenn wir den Eckenradius hinzufügen, krümmt sich das Rechteck
wie standardmäßig Und mit der Eigenschaft Eckendetail können wir ändern, wie viele
Kanten berechnet werden, um die gekrümmten
Ecken zu erzeugen Eigenschaft Eckendetail Wir können einen Schatten hinter
der Schaltfläche hinzufügen, ihre Farbe und
Größe ändern und sie auch in
beide Richtungen verschieben Und Anti-Aliasing
kann deaktiviert werden, oder wir können seine Größe ändern damit die Kanten glatter aussehen Das deckt alle Schaltflächeneigenschaften und Style-Box-Optionen In der nächsten Lektion werden wir Links zu sozialen Netzwerken
hinzufügen. Wir sehen uns in der nächsten Lektion.
20. Link-Button: Hallo, Freunde. In
der vorherigen Lektion haben wir unserem Titelbildschirm eine Start-Schaltfläche
hinzugefügt. In dieser Lektion werden wir Links zu sozialen Netzwerken
hinzufügen. Beginnen wir damit, dem Szenenbaum eine neue
Notiz hinzuzufügen. Diesmal ist es eine Link-Schaltfläche. Wir werden diesen Knoten nach
der Social-Media-Plattform benennen, in meinem Fall nach Patron. Füllen Sie dann auch das Textfeld mit den
gleichen Informationen den
gewünschten URI kopieren und in das Feld einfügen, ist
nichts weiter erforderlich, damit die Link-Schaltfläche
genau das tut, was wir erwarten Wenn wir das Spiel starten, können wir auf diese Link-Schaltfläche
klicken, um ein Browserfenster mit
der von uns angegebenen URI zu
öffnen der
Option Unterstreichen können wir
ändern, ob der Text immer unterstrichen
ist, nur wenn die
Maus darüber bewegt wird Dieselben BD-Optionen
sind
für Sprachen verfügbar , die
von rechts nach links schreiben, und wir haben dieselben Eigenschaften,
die von der Button-Basisklasse
übernommen wurden, falls wir sie verwenden
möchten Das funktioniert, ist aber nicht das, was ich für meine Social-Media-Links
will. Ich würde es vorziehen, das
Plattformsymbol neben
dem Text zu haben und beide als eine Schaltfläche
anklickbar Dazu benötige ich
einen Knoten, auf dem die Textur beschädigt wurde, um das Symbol anzuzeigen Ich werde dieses Knotensymbol umbenennen
und das Gadot-Symbol vorerst
als Platzhalter verwenden Ich möchte nicht, dass das Symbol
so groß ist, also stelle ich den
Erweiterungsmodus
so ein, dass er die
Größe ignoriert, und den Streckmodus, um das Aussehen beizubehalten Dann skalieren Sie es auf eine
vernünftigere Größe. Als Nächstes verwende
ich, anstatt den Link-Button-Node
für die Anzeige des Textes zu verwenden, den Link-Button-Node
für die Anzeige des Textes zu verwenden, den Label-Node. Ich benenne dieses Node-Handle um und füge mein Handle
in das Textfeld ein. Dann verschiebe das nach
rechts neben das Symbol. Ich muss diese
beiden Knoten bündeln, damit sie wie
ein einziger Knoten agieren. Wir können dies tun, indem wir
einen anderen Knoten als übergeordneten Knoten verwenden, z. B. den Link-Button-Knoten. die beiden Knoten als Gruppe auswählen, können
wir sie über
den Knoten Link-Button ziehen , um sie wieder
der Link-Schaltfläche zuzuordnen Sie sind jetzt also untergeordnete Elemente
des Link-Button-Knotens. Wenn Sie den übergeordneten Knoten verschieben, bewegen sich auch die
beiden untergeordneten Knoten mit, wobei ihre
relative Position beibehalten wird. Wenn wir den Knoten „Link-Button“ vergrößern , sodass er auch die beiden untergeordneten Elemente
abdeckt, wird
dieser gesamte Bereich einer anklickbaren Schaltfläche, die auf die
Social-Media-Plattform
verweist Wir können
den Link-Button-Node auch
an einer beliebigen Stelle auf dem Bildschirm verankern an einer beliebigen Stelle auf dem Bildschirm Dadurch werden
die relativen Positionen
der untergeordneten Knoten automatisch angepasst die relativen Positionen
der untergeordneten Knoten Eine einfachere Möglichkeit, bei
der horizontalen Ausrichtung
der Steuerelemente genauer
vorzugehen und
ihre
Abstände einheitlich zu halten , besteht darin,
einen anderen Kontrollknoten zu verwenden , der genau diesem Zweck
dient Dieser Knoten wird als
horizontaler Box-Container bezeichnet. Er
ordnet automatisch alle seine untergeordneten Objekte horizontal mit gleichbleibendem
Abstand zwischen ihnen Dadurch
wird dieser Knoten zum untergeordneten
Element der Link-Schaltfläche, dann zum Symbol und
zum Griff zu untergeordneten Objekten des horizontalen Box-Containers. Der Layoutmodus für das Symbol und den Griff ist jetzt auf Container
eingestellt. Da sie sich in
einem Container befinden, ist
der Container
für die Bestimmung ihrer
Größe und Position verantwortlich . Diese Eigenschaften
sind also deaktiviert. Die Kinder sind außerdem gezwungen, auf die
kleinste zulässige Größe
zusammenzuklappen, was bedeutet, dass das Symbol auf Null
verkleinert wurde Wenn wir den Erweiterungsmodus so ändern, dass er
auf proportional passt, ist
dieser Erweiterungsmodus
ideal für horizontale Boxen. Dabei ist darauf
zu achten, dass die Breite der
Textur
der Höhe entspricht , die der
horizontale Container zulässt Wählen wir den
Stammknoten aus, damit wir
den Theme-Editor sehen und
den horizontalen
Box-Container zum Theme hinzufügen können. Dieser Knotentyp hat nur
eine einzige Eigenschaft, die wir im Bereich Konstante festlegen
können, nämlich die Anzahl
der Pixel, die verwendet
werden, um
die untergeordneten Knoten voneinander zu trennen. Fühlen Sie sich frei, diesen Wert zu ändern
und zu sehen, was gut aussieht. Wenn Sie den horizontalen
Box-Container ausgewählt haben, war er ursprünglich
standardmäßig
40 mal 40 Pixel groß und wurde so erweitert, dass er
seine untergeordneten Objekte horizontal abdeckt, aber die Höhe bleibt bei 40. Wenn wir auf die Reset-Schaltfläche klicken, versucht
der Container, so weit wie möglich
zusammenzubrechen. Da die Textgröße des
Label-Knotens 31 Pixel
vertikalen Abstand beansprucht, ist
der Container
auch 31 Pixel hoch. Diese Höhe wird
auch dem Symbol zugewiesen, dessen eigene Einstellungen die
Breite an die Höhe anpassen. Da wir jetzt die genaue Größe kennen wir für dieses
Symbol und den Griff benötigen, können
wir diese Zahlen in
die benutzerdefinierte
Mindestgröße der Linkschaltfläche kopieren ,
um sicherzustellen, dass sie
immer alle untergeordneten Elemente
umfasst Setzen Sie dann die Größeneigenschaft , um zu erzwingen, dass es auf diese Größe
zusammengeklappt Wir haben jetzt eine Linkschaltfläche für soziale
Medien , die sowohl ein
Symbol als auch einen Griff enthält, und
beide können in ihrer Gesamtheit angeklickt werden Lassen Sie uns einige neue
Asset-Ordner erstellen, zuerst für Symbole und einen weiteren darin für Social-Media-Symbole, um sie
von anderen Spielsymbolen zu trennen Importiere dann einige
Social-Media-Symbole wobei dieser Ordner ausgewählt ist. Wir können dann das Gdo-Symbol
durch das entsprechende Symbol ersetzen das entsprechende Symbol den Link-Button-Knoten auswählen, können
wir ihn mit
Control D oder Command D duplizieren , um weitere Links zu sozialen Medien
hinzuzufügen Jedes Duplikat fügt
dem Namen
eine steigende Zahl hinzu , da Geschwisterknoten
nicht denselben Namen haben können Alle untergeordneten Knoten werden
ebenfalls dupliziert, behalten aber ihre ursprünglichen Namen, da sie mit
ihren Duplikaten keine Geschwister
sind Wir möchten wahrscheinlich, dass diese Links
vertikal angeordnet werden. Wir können das mit einem
vertikalen Box-Container machen , der genauso funktioniert wie der
horizontale Box-Container, aber seine
untergeordneten Container vertikal anordnet Fügen wir das also als untergeordnetes Element
des Titelbildschirms hinzu und
benennen es in soziale Netzwerke um Wählen Sie dann alle Link-Button-Knoten in einer
Gruppe aus und ordnen Sie sie diesem
vertikalen Box-Container neu zu Der Container
ordnet sie für uns automatisch vertikal Ich benenne jeden Link-Button in die entsprechende
Social-Media-Plattform Jetzt, da wir
alle unsere Links sehen können, ändern
wir ihre
URIs. Ihre Icons Und ihre Griffe, falls nötig. Da meine Tintenschaltflächen
jetzt unterschiedliche Breiten haben, der vertikale Box-Container erweitert
der vertikale Box-Container sie alle auf
die größtmögliche Breite, sodass einige
dieser Linkschaltflächen viel länger sind, als sie sein sollten die Gruppe
alle Links auswählt, können
wir in diesem
Popup-Menü im Vorschaufenster die
Eigenschaft für die
Containergröße diesem
Popup-Menü im Vorschaufenster die
Eigenschaft für die ändern und ihre
horizontale
Containergröße von „Füllen“
auf „Anfang verkleinern Somit reduziert sich
die Breite jeder Link-Schaltfläche auf die zuvor festgelegte
Mindestgröße Diese Eigenschaften
zur Containergröße finden
Sie auch im Layoutbereich
der Eigenschaften,
die von Control
übernommen indem Sie den Bereich zur
Containerdimensionierung erweitern. Es sind sowohl horizontale als auch vertikale
Optionen verfügbar den Behälter zum
Anfang, zur Mitte
oder zum Ende hin
zusammenklappen oder ihn vollständig
in beide Richtungen
füllen Verankern wir diese Links
zu
sozialen Netzwerken in einer Ecke des Bildschirms
, wo sie gut aussehen Ich lege meins in die
untere linke Ecke. Es ist keine gute Idee
, dass diese Art von Symbolen oder Text auf diese Weise den
Rand des Fensters berühren. Normalerweise ziehen wir es vor, einige Ränder zu
haben. Wir können
die Position
des Container-Knotens leicht verschieben, indem wir
seine Anker-Voreinstellungen auf Benutzerdefiniert ändern und
dann die
Ankerversätze des Container-Knotens leicht verschieben, indem wir
seine Anker-Voreinstellungen auf Benutzerdefiniert ändern , indem wir
seine Anker-Voreinstellungen auf Benutzerdefiniert anpassen. Dazu fügen wir einen positiven Wert auf
der linken Seite
hinzu, einen positiven Wert auf
der linken Seite
hinzu um ihn
vom linken Rand
des Fensters weg zu bewegen , und einen negativen Wert nach unten, um
ihn nach oben zu verschieben den Stammknoten auswählen, damit
wir den Theme-Editor sehen können, können
wir, genau wie beim
horizontalen Box-Container, dem genau wie beim
horizontalen Box-Container, dem Theme vertikale
Box-Container hinzufügen, um die Anzahl der Pixel
zu ändern zur Trennung ihrer untergeordneten Objekte
verwendet werden. Ich möchte,
dass die meisten vertikalen Box-Container in
meinem Projekt
den gleichen einheitlichen
Pixelabstand haben den gleichen einheitlichen
Pixelabstand wie meine horizontalen Box-Container. Aber ich werde ein
Theme-Override verwenden, um
diesen speziellen vertikalen
Box-Container zu einer
Ausnahme zu machen diesen speziellen vertikalen
Box-Container zu einer , und
den Abstand verdoppeln , um diese Links
etwas weiter zu verteilen. Und wir können die Reihenfolge
der Links einfach ändern , indem wir sie anklicken und ziehen,
um sie sowohl
im Szenenbaum
als auch im Container neu anzuordnen sowohl
im Szenenbaum
als auch im Container Wir haben jetzt
Links zu sozialen Netzwerken auf unserem Titelbildschirm. In der nächsten Lektion werden wir unserem Thema
eine Variante hinzufügen. Wir sehen uns in der nächsten Lektion.
21. Variation des Thementyps: Hallo Freunde. In
der vorherigen Lektion haben wir
Links zu sozialen Netzwerken zu unserem Titelbildschirm hinzugefügt. In dieser Lektion fügen wir
eine Variante des Themas hinzu. Fügen wir
unserer Szene nur zu
Testzwecken ein neues Label hinzu. Eine ohne jegliche
Theme-Overrides, im Gegensatz zum Titel. Wir werden viele
davon verwenden, um später
alle Arten von Text und
Zahlen auf dem Bildschirm anzuzeigen später
alle Arten von Text und
Zahlen auf dem Bildschirm Wählen Sie den Stammknoten aus, damit
wir den Theme-Editor sehen können. Wir können
unserem Thema einen neuen Typ hinzufügen, den Label-Node. Wie schon zuvor können wir die Farbkonstanten
ändern Schrift, Schriftgröße und
Stil, wenn wir wollen. Ich verwende einfach die
Standardschrift und Standardschriftgröße ich bereits für mein Theme festgelegt habe. Dadurch entsteht ein einheitliches
Erscheinungsbild für den gesamten oder zumindest den größten Teil
des Textes in unserem Spiel. Da der Titel einzigartig ist, verwendet er Theme-Overrides, um seine eigenen speziellen
Theme-Eigenschaften zu definieren Ich mag zwar die stylische
Schrift von Titel,
Text und Startbutton meines Spiels , diese Links zu sozialen Netzwerken sollten sehr klar
und leicht lesbar sein,
vor allem, weil mein Name für
sich genommen so schwierig ist Deshalb habe ich eine zweite Schriftart importiert die nur für diese Links verwendet werden soll, Roboto, während der
Rest des Textes für mein Spiel
in der stilisierten Schrift bleiben sollte Wir könnten jedes
Handle-Label auswählen und den Abschnitt zum Überschreiben
des Themes verwenden , um die Schriftart zu ändern, wie
wir es beim Titel getan haben Aber was ist, wenn wir es ändern oder mehr
dieser Link-Buttons hinzufügen möchten? Wir
müssten dann die Theme-Overrides
der einzelnen Knoten bearbeiten , um
sicherzustellen, dass sie alle übereinstimmen Es wäre besser,
unser Theme zu verwenden, um sie alle auf
einmal festzulegen und sie gleichzeitig
von anderen Label-Knoten zu trennen Aber wir haben den
Labeltyp bereits zu unserem Thema hinzugefügt. In Fällen, in denen wir ein Thema für einige Knoten
festlegen möchten, aber nicht für alle Knoten
desselben Typs, können
wir
dem Thema eine Art
von Variante hinzufügen , indem wir einfach
unseren eigenen Namen in dieses Feld eingeben. Ich nenne es Handle
, denn dafür
werde ich es verwenden. Dieser neue Typ hat noch keine
Eigenschaften, da der Theme-Editor nicht
weiß, was der Basistyp ist. Wir müssen zur letzten Seite gehen und den Basistyp
für diese Variante
festlegen. Und der Basistyp ist der Typ der Knoten,
die wir beeinflussen
wollen, beschriften. Wir können entweder den
Namen in dieses Feld eingeben oder auf die Plus-Schaltfläche klicken , um den
Basistyp aus einer Liste auszuwählen. Dadurch werden
dieser Typvariante
dieselben Eigenschaften hinzugefügt, die auch für einen Labelknoten verfügbar
wären . Wir können also dieselben Farben,
Schriftfarbe, Konturfarbe,
Schattenfarbe,
Konstanten wie
Konturgröße und Schattenversatz,
Schriftart hinzufügen Schriftfarbe, Konturfarbe,
Schattenfarbe, , die ich in Roboto
ändern werde Und die Schriftgröße, die
ich gerne etwas größer als
die Standardgröße Keine dieser Änderungen hat sich auf unsere Beschriftungen,
den Titel, den Text oder die Griffe
ausgewirkt . Wenn wir die Handle-Knoten auswählen, können
wir sie sogar
alle zusammen in Gruppen auswählen. Erweitern Sie dann den Themenbereich. Klicken Sie anschließend neben dem Variationsfeld auf
die Schaltfläche
Bearbeiten und geben Sie den Namen unserer
Theme-Typ-Variante ein. Auf diese Weise
verwenden alle diese Labelknoten nun die Variante des Thementyps, sodass wir
ihre individuellen Einstellungen
gemeinsam anpassen und sie gleichzeitig von anderen
Labels im Projekt
trennen können. Das Ändern von Schrift und
Schriftgröße kann auch dazu führen, dass die Größe der horizontalen Felder an den Text
angepasst wird. Deshalb passe ich
die benutzerdefinierten Mindestgrößen
meiner Tintentasten schnell an. Und ich werde jetzt
diesen zusätzlichen Label-Node löschen da er
für den Titelbildschirm nicht benötigt wird. Wir haben jetzt Links zu sozialen Netzwerken
, die einfacher zu lesen sind. In der nächsten Lektion werden wir einen Hintergrund
für das Hauptspiel
hinzufügen. Wir sehen uns in der nächsten Lektion.
22. Anzeigefeld: Hallo Freunde. In
der vorherigen Lektion haben wir eine
Variante des Thementyps hinzugefügt, um einigen Knoten
ein einheitliches Thema zu geben , das sich von dem anderer
Knoten desselben Typs unterscheidet . In dieser Lektion fügen wir einen grundlegenden Hintergrund
für unser Hauptspiel hinzu. Normalerweise
hätten Spiele unterschiedliche Szenen für den Titelbildschirm
und das Hauptspiel, aber in diesem Projekt
machen wir alles in einer Szene. Standardmäßig ist der
Hintergrund nur grau. Wenn Sie ein
Bild für Ihren Hintergrund verwenden möchten, würden
Sie einen Textur-Re-Node
verwenden, um es zu zeichnen. Ich möchte nicht nur
ein einfaches Bild,
also beginnen wir damit, unserer Szene
einen neuen Knoten hinzuzufügen. Diesmal einen Panel-Knoten
und benenne ihn in Spiel um. Panels können eigentlich nicht
mehr als ein
Standard-Kontrollknoten, außer dass sie auch eine Style-Box
zeichnen. Stellen wir den Anker auf „Full Wracked“, sodass er
das gesamte Fenster abdeckt Das Standardstilfeld für ein Bedienfeld entspricht dem einer Schaltfläche,
lediglich ein halbtransparentes schwarzes Rechteck mit
abgerundeten Ecken Bevor ich das
Bild für mein Panel importiere, erstelle
ich einen neuen
Asset-Ordner für Stile und
darin einen weiteren für Schaltflächen. Verschiebe dann alle meine
Button-Stile in diesen Ordner. Dann noch ein Ordner für Panels, und ich werde diesen
Ordner auswählen, wenn ich die Texturen im
Panel-Stil importiere. den Stammknoten auswählen, damit
wir den Theme-Editor sehen können, fügen
wir dem Thema ein Panel hinzu. Panels haben nur eine
Theme-Eigenschaft, ihr Style-Feld. das Bedienfeld stehen dieselben Optionen zur Verfügung Für das Bedienfeld stehen dieselben Optionen zur Verfügung wie für Schaltflächen (
leer, liniert, flach oder texturiert). Lassen Sie uns eine Style-Box-Textur verwenden, dann darauf klicken, um sie
im Inspektor zu öffnen und
der Textur eine
importierte Textur zuzuweisen . Mit den Standardeinstellungen wird
die Textur so gestreckt, dass sie der Größe des Panels
entspricht, was nicht sehr gut aussieht. Wenn Sie die Eigenschaft „Achse
dehnen“ auf „Kachel“
umstellen, wird das Bild nebeneinander angeordnet,
anstatt es so zu dehnen, dass es
den zugewiesenen Raum ausfüllt Sie die Option „Kacheln anpassen“ verwenden
, werden sowohl das Kacheln als auch das Dehnen so vorgenommen, dass der
gesamte Bereich mit ganzen Kacheln
statt mit Bruchteilen
bedeckt ist mit ganzen Kacheln
statt mit Bruchteilen
bedeckt Dieses Bild ist etwas überladen,
es könnte zu ablenkend wirken Deshalb verwende ich stattdessen das Bild mit dem
Seilrand Wenn wir einige Texturränder hinzufügen, wird
das Bild in neun verschiedene Texturen aufgeteilt,
die dann zur Erstellung
des Stilfeldes verwendet werden . Dabei behalten die Ecken ihre
exakten Pixelmaße bei .
Die Kanten werden gestreckt
oder gekachelt, um die Ecken zu verbinden , und
die Mitte wird gestreckt oder gekachelt, um den verbleibenden
Bereich auszufüllen Jetzt, wo wir einen grundlegenden
Hintergrund für unser Spielfenster haben, müssten
wir ihn standardmäßig
ausblenden, wenn
das Spiel zum ersten Mal läuft, damit wir den Titelbildschirm sehen
können, was wir tun können, indem wir im Szenenbaum auf das Augensymbol
daneben klicken. Aber da wir die meiste Zeit
damit verbringen werden das Spiel zu
entwickeln und
den Inhalt dieses Fensters zu bearbeiten, wäre
es besser, wenn
dieser für uns sichtbar wäre und der Titelbildschirm stattdessen ausgeblendet
wäre. Wir wollen also den Spielknoten
durch den Titelbildschirmknoten austauschen durch den Titelbildschirmknoten den Spielknoten zum Stammknoten
der Szenen
machen. rechten Maustaste auf den Spielknoten und wählen Sie die Option Szenen-Root
machen. Der Spielknoten ist
jetzt der Stammknoten dem der Titelbildschirm
untergeordnet ist. Der Titelbildschirm
wurde also ursprünglich über das Spiel gezeichnet. Um vom
Titelbildschirm zum Hauptspiel zu wechseln, müssen wir
lediglich
den Titelbildschirm ausblenden , indem wir seine Sichtbarkeit
ausschalten. Jetzt wird das Panel-Thema jedoch nicht
mehr
auf den Panel-Knoten angewendet Da das Thema eine Eigenschaft
des Titelbildschirms ist, werde
ich nur den
Titelbildschirm und seine untergeordneten Elemente beeinflussen. Wenn der Titelbildschirm ausgewählt der Themenbereich
erweitert wird, können
wir auf den Pfeil neben
dem Thema klicken und es
als Projektressource speichern. Ich lasse es einfach im Ressourcenordner des
Projekts und benenne es nach der Schriftart. Der Handel gewinnt. Dieses Thema ist jetzt im Ressourcenordner unseres
Projekts gespeichert. So können wir den Spielknoten auswählen, den Themenbereich
erweitern
und das Drop-down-Menü verwenden, um dieses Thema zu laden. Jetzt wird das Thema wie zuvor
auf das gesamte
Projekt angewendet , da es eine Eigenschaft
des Root-Nodes ist. Wir können es auch aus
dem Titelbildschirmknoten entfernen da es sowieso
über den Szenenbaum vererbt wird . Als Nächstes müssen wir
ein Skript an den Spielknoten anhängen, indem wir
es
entweder auswählen und auf die angehängte Skriptschaltfläche klicken oder mit
der rechten Maustaste auf den Knoten klicken und das angehängte Skript
auswählen. Wir nennen dieses Skript
Game Manager und erstellen einen neuen Ordner, der all
unsere Projektskripte enthält. Erstellen Sie dann das Skript
in diesem Ordner. Das Skript wird im
GD-Skript geschrieben und
erbt von Panel
den Typ des Nodes, an den es angehängt
wird Dadurch
wechselt unsere Ansicht automatisch zur Skriptansicht und das gerade erstellte
Skript wird geöffnet Dieses Skript muss nur die Sichtbarkeit des
Titelbildschirms ein- oder ausschalten. Dazu benötigen wir einen Verweis auf den
Titelbildschirmknoten. der rechten Maustaste auf den
Titelbildschirm-Knoten klicken, können
wir auf diesen
als eindeutigen Namen zugreifen ,
solange kein anderer Knoten
im Szenenbaum denselben Namen hat
,
der mit einem Prozentzeichen gekennzeichnet wird. dann auf
diesen Knoten klicken und ihn in das Skript ziehen, die Strg- oder
Befehlstaste
gedrückt halten und die Maustaste
loslassen, speichern
wir einen Verweis
auf diesen Knoten in einer Variablen Ich füge dem
Namen der Variablen einen Unterstrich
hinzu, um sie als privat zu
kennzeichnen,
was bedeutet, dass sie nur von diesem Skript verwendet werden
soll Überschreiben der Ready-Funktion. Das blaue Pfeilsymbol neben der Funktion weist
darauf hin, dass diese Funktion in der Node-Klasse
angegebene Definition überschreibt Diese Funktion wird aufgerufen, wenn der Knoten und alle seine
untergeordneten Knoten bereit sind.
Wir können angeben, dass sich der
Titelbildschirm von selbst öffnet Wenn wir die Starttaste drücken, können
wir vom
Inspektor-Panel zum Node-Panel wechseln, das uns eine Liste
aller Signale gibt , die
dieser Node aussenden kann. Das Signal, auf das wir reagieren
wollen, ist das gedrückte Signal, das ausgegeben wird, wenn
die Taste gedrückt wird. Doppelklicken Sie auf das Signal oder rechten Maustaste und
wählen Sie Verbinden. Wir können dies mit
dem Spielknoten verbinden
, der bei Start Pressed automatisch eine neue Funktion
für uns
generiert . Das grüne
Verbindungssymbol links neben
dieser Funktion zeigt uns, dass eine Signalverbindung diese Funktion
aufruft. Wenn die
Starttaste gedrückt wird, weisen wir den
Titelbildschirm an, sich auszublenden. Ausführen des Spiels wird der
Titelbildschirm angezeigt Wenn wir auf
die Schaltfläche Start klicken, wird
er ausgeblendet
und das darunter liegende
Spielfenster Wir haben jetzt einen Hintergrund
für unser Spielfenster. In der nächsten Lektion werden wir einen Fade-Übergang
hinzufügen. Wir sehen uns in der nächsten Lektion.
23. Farbrechteffekt: Hallo Freunde. In
der vorherigen Lektion haben wir einen Hintergrund für
unser Hauptspielfenster hinzugefügt. In dieser Lektion
fügen wir einen Überblendungsübergang , um zwischen dem
Titelbildschirm und dem Hauptspiel zu wechseln. Derzeit
wird der Titelbildschirm sofort angezeigt,
und wenn Sie die Starttaste drücken
, wird das Spielfenster geöffnet, was etwas verwirrend ist. Es wäre besser, wenn wir schrittweise
umsteigen würden, was wir
mit einem anderen Knoten problemlos bewerkstelligen können Der farblich zerstörte Knoten. Benennen wir ihn in Fade um. Der farbzerstörte Knoten
füllt einfach seine Grenzen
mit einer Volltonfarbe, die wir
im Inspektor ändern können, sodass wir sie auf Schwarz setzen Stellen Sie dann seine Anker auf das gesamte Wrack, sodass es
das gesamte Fenster bedeckt So beginnen die meisten
Spiele mit nur
einem leeren schwarzen Bildschirm, enden und wechseln die Szenen Wir können die als Alpha
bekannte Transparenz
dieser Farbe anpassen , um sie im Laufe der Zeit allmählich
unsichtbar zu machen Laufe der Zeit allmählich
unsichtbar und bei Bedarf
wieder zu durchgehendem Schwarz zurückzukehren. Verstecken wir es, damit wir
unser Spiel sehen können , während wir
daran arbeiten. ein Skript an diesen Knoten anhängen es im Scripts-Ordner
speichern, dient
das Skript
dazu, es ein- und auszublenden Jedes Mal, wenn wir
einen Wert
im Laufe der Zeit anpassen, können
wir eine eingebaute Gadot-Klasse,
ein Tween, verwenden, das wir in einer Variablen
speichern Wenn wir eine Funktion hinzufügen,
nennen wir es zu klar. Die Funktion kann ein Signal zurückgeben , das ausgegeben wird,
wenn sie fertig ist. Als erstes müssen
wir ein neues Tween erstellen. Dann weisen Sie dieses erzeugte
Tween unserer Variablen zu. Dies ist eine Funktion
der Node-Klasse. Jeder Knoten kann ein Tween erstellen. Teilen Sie dem Tween dann mit, dass er eine Eigenschaft als Tween verwenden
soll. Diese Funktion hat vier
Parameter. Welcher Knoten? Wir können das Schlüsselwort
self verwenden, um diesem Knoten mitzuteilen, dass das Skript an den
Fade-Knoten angehängt ist. Welche Eigenschaft? Als
in Anführungszeichen gekapselte Zeichenfolge geben
wir den Namen der
Eigenschaft an, also die Farbe Der endgültige Wert der Eigenschaft, d. h. die Farbe Schreiben wir das vorerst einfach
in Großbuchstaben. Und zuletzt die
Dauer der Zeit. Sagen wir zum Beispiel 1 Sekunde. Wir können dann das
fertige Signal des Tweens zurückgeben, das das Signal
automatisch ausgibt , wenn es fertig ist Clear ist undefiniert,
also geben wir eine Definition, indem wir ihn oben
im
Skript als Konstante deklarieren oben
im
Skript als Eine Konstante ist das
Gegenteil einer Variablen. Beide
speichern zwar Informationen, eine Konstante ändert sich jedoch nie. Sie werden üblicherweise in Schlangengroßbuchstaben
benannt, und wir können ihr
den Wert einer Farbe zuweisen Geben Sie dann in Klammern
Null Rot, Null Grün, Null Blau und Null Alpha an, was schwarz, aber
auch vollständig transparent ist Umstellung auf das
Game Manager-Skript. Geben wir dem
Fade einen eindeutigen Namen und fügen ihn dem Game
Manager als Variable hinzu. Man kann ihm sagen, dass er sich zuerst
zeigen soll. Nachdem der
Titelbildschirm angezeigt wurde, können
wir ihn ausblenden, um den
Titel hinter der Überblendung
nach und nach zum Vorschein zu bringen. Wenn die
Starttaste gedrückt wird, können
wir zuerst zu Schwarz übergehen bevor wir den Titelbildschirm ausblenden, dann wieder zu klar ausblenden. Das Ausblenden des
Titelbildschirms
muss jedoch warten, bis das Abblenden
zu Schwarz abgeschlossen ist. Da wir ein
Signal von dieser Funktion zurückgeben, können
wir den Befehl await verwenden, um diese Funktion
anzuhalten, bis
das Signal empfangen wird. Also müssen wir auch
die beiden schwarzen Funktionen
wieder in unser Fade-Skript schreiben . Diese Funktion macht
genau das Gleiche wie
die andere Funktion, ändert
aber nur
den Endwert, auf den die Farbeigenschaft getweenet
wird Anstatt den
gesamten Code zu duplizieren, wäre
es besser,
dies zu einer privaten Funktion zu machen, als sie von beiden
öffentlichen Funktionen aufrufen zu lassen Wir nennen es
Tween-Farbe und ändern das Endwertargument
der Tween-Eigenschaftsfunktion Fügen Sie dann die endgültige Farbe
als Parameter der
Funktionsdeklaration Sowohl zu klar als
auch zu schwarz können jetzt den
Rückgabewert von Tween Color zurückgeben, wobei clear als Argument oder
Color Dot Black übergeben wird, da Schwarz
für uns bereits in der Farbklasse definiert Wenn wir die Funktion
Two Clear aufrufen,
dann die Funktion Two Black, obwohl das Tween
gerade ausgelastet ist, könnte
das zu
unerwünschtem Verhalten führen Wann immer das möglich ist, sollten
wir zunächst überprüfen,
ob das Tween bereits erstellt wurde
und ob es läuft Wenn beide zutreffen, können wir den Tween beenden,
bevor wir einen neuen erstellen. Dadurch wird
verhindert, dass
Konflikte entstehen, wenn zwei Tweens versuchen, dieselbe Eigenschaft zu
ändern Wenn wir uns nicht ganz sicher sind
, ob wir 1 Sekunde als Dauer verwenden wollen , möchten
wir das vielleicht auch in eine Variable umwandeln Nennen wir es Dauer und
setzen den Wert auf 1 Sekunde. Fügen Sie dann das Export-Tag am Anfang
der Deklaration hinzu, damit wir
dieser Variablen im Inspektor einen anderen
Wert geben können. den Fade-Knoten
im Szenenbaum auswählen, können
wir sehen, dass die
Dauervariable den Wert eins hat, aber wir können ihn
nach Belieben ändern. Ich versuche es mit 2 Sekunden und werde
sehen, wie das aussieht. Wenn das Spiel läuft,
fängt das Fenster komplett schwarz an, wird
aber immer klarer, sodass der
Titelbildschirm dahinter zum Vorschein Wir können derzeit nicht
auf die Start-Schaltfläche klicken da wir tatsächlich
auf das Rechteck mit der Überblendfarbe klicken, obwohl es transparent ist Die Schaltfläche reagiert auch nicht
darauf, wenn Sie mit der Maus darüber fahren. den Fade-Knoten auswählen, müssen
wir
in den Eigenschaften suchen, die vom Steuerelement für
den Mausbereich
übernommen wurden , und Filtereigenschaft in Ignorieren
ändern Jetzt werden die Maussignale
durch den Fade-Knoten zu
den darunter liegenden Knoten geleitet. Versuchen wir also erneut,
das Spiel auszuführen. Wenn wir die
Starttaste drücken, wird sie schwarz, der Titelbildschirm wird
ausgeblendet
und wieder gelöscht, sodass das Spielfenster
sichtbar Wir haben jetzt einen
Fade-Übergang für unser Spiel. Im nächsten Abschnitt werden wir Arbeit am
eigentlichen Spiel
beginnen. Wir sehen uns
im nächsten Abschnitt.
24. Menüleiste: Hallo Freunde.
Im vorherigen Abschnitt haben wir einen Titelbildschirm für
unser Spiel erstellt , der
zum Hauptspiel übergehen kann. In diesem Abschnitt werden wir mit
der Entwicklung des eigentlichen Spiels beginnen . Beginnen wir damit, dem Spielpanel einen neuen
Knoten hinzuzufügen,
einen Knoten in der Menüleiste. Und sortiere es hinter
dem Titelbildschirm. Der Menüleistenknoten
zeichnet von selbst nichts. Wenn Sie also eine visuelle
Darstellung der Menüleiste wünschen, müssten
Sie diesen Knoten
in ein anderes Panel
oder Texturwract einfügen . Verwenden Sie dann das Textur- oder
Stilfeld, um eine tatsächliche Leiste zu zeichnen. Mir geht es gut, ohne einen echten Balken zu
zeichnen, also lösche ich diesen zusätzlichen Knoten. Wie die Menüleiste tatsächlich
funktioniert, kann etwas verwirrend sein. Wenn wir jemals mehr Informationen
darüber benötigen, wie ein Knoten funktioniert, können
wir jederzeit seine Dokumentation überprüfen, indem wir mit rechten Maustaste darauf klicken und Dokumentation öffnen
auswählen. Wir wechseln zwischen der Beschreibungsansicht und öffnen die Dokumentation
für diesen Knoten Wir können der Beschreibung entnehmen , dass dieser Knoten
Menüschaltflächen für jeden
Popup-Menüknoten erstellt , der als Kind hinzugefügt wurde zur Two-D-Ansicht zurück fügen
wir
der Menüleiste einen untergeordneten Knoten vom
Typ Popup-Menü hinzu. Dabei handelt es sich nicht unbedingt um
einen Kontrollknoten, aber er ist nah genug dran. Indem Sie einfach den
Popup-Menüknoten als untergeordnetes Element der Menüleiste hinzufügen, fügt
die Menüleiste automatisch eine Menüschaltfläche mit
demselben Namen wie der Knoten hinzu. Benennen wir diesen
Knoten in etwas um, das in einer
Menüleiste
häufiger vorkommt, wie z. B. Datei. Ich werde auch einen weiteren für
Einstellungen und einen weiteren Namen hinzufügen. Möglicherweise müssen Sie
einige andere Änderungen vornehmen bevor die Menüleiste aktualisiert wird. Die Menüschaltflächen überlappen sich mit dem Rand des Spielfensters, was nicht besonders gut aussieht Es wäre besser, wenn es weiter vom
Fensterrand
wegbewegt Wir könnten es manuell verschieben, indem entweder seine Transformationsposition oder Anker und Ankerversätze Aber ich möchte nicht, dass eines meiner Spielelemente den Rand
berührt, also wäre es besser rundum
Ränder anzubringen,
die für alles gelten Der Panel-Knoten
ist kein Container und kann
daher weder
die Position
noch die Größe seiner untergeordneten Knoten kontrollieren . Das Hinzufügen von Inhaltsrändern zu seinem
Stilfeld wird ignoriert. Fügen wir also dem Spielfenster einen Container
hinzu, insbesondere einen, der
Ränder hinzufügt , den Randcontainer. Machen Sie ihn dann zum
direkten Kind
des Spielfensters und die
Menüleiste zum untergeordneten Element des
Randcontainers. Wählen Sie den Stammknoten aus, damit
wir den Theme-Editor sehen können. Fügen wir dem Theme
einen Randcontainer hinzu. Der Randcontainer zeichnet
nichts. Er hat nur Konstanten in
seinen Theme-Eigenschaften. Wie viele Pixel
Randabstand werden zu jeder Seite hinzugefügt? Da der Titelbildschirm
ein gleichgeordnetes Element des
Randcontainers ist ein gleichgeordnetes Element des
Randcontainers kein untergeordnetes Element, bleibt er von den
Rändern unberührt Fügen wir dem Thema auch
eine Menüleiste hinzu. Die Menüleiste ermöglicht es uns, die Schriftfarbe
aller von
ihr erstellten Menüschaltflächen in
all den verschiedenen
Schaltflächenzuständen zu
ändern aller von
ihr erstellten Menüschaltflächen in , die wir zuvor gesehen haben. Im Bereich Konstanten haben
wir den
Pixelabstand zwischen den Menüschaltflächen und die Größe der
Schriftkonturen Wir können die
Schrift und Schriftgröße ändern, aber ich verwende meine Themes, die
Standardeinstellungen dafür Es gibt keine Symbole,
und wir können
die Stilfelder für
die Menüschaltflächen ändern die Stilfelder für
die Menüschaltflächen die von der Menüleiste in
allen Schaltflächenzuständen
erstellt werden. Für meine Menüschaltflächen verwende
ich wie gewohnt
den Stil Box leer und kopiere ihn in den Deaktiviert und ein Style-Feld flach für gedrückt und kopiere ihn in
Hover und Hover Wenn ich das Stilfeld leer öffne, füge
ich nur einige
Inhaltsränder hinzu, damit die Schaltfläche etwas
größer ist als der Text Und für das flache Stilfeld füge
ich dieselben
Inhaltsränder einige abgerundete Ecken hinzu
und dunkle die Farbe ab Machen Sie dann das Feld im Hover-Stil einzigartig, sodass es nicht
an die anderen gebunden Öffnen
Sie es dann und ändern
Sie es in eine hellere Farbe Mal sehen, wie das aussieht
, wenn wir das Spiel starten. Die Menüs befinden sich alle
in der Menüleiste. Sie haben ein geschwungenes,
flaches Feld heller ist, wenn Sie mit der Maus darüber fahren,
und dunkler, wenn Sie darauf drücken Ihre Popup-Menüs sind
derzeit jedoch leer. Es gibt einige
Optionen, die wir im Inspektor verwenden können , um
das Verhalten
der Menüschaltflächen zu ändern. Der flache Schalter ignoriert die Stilfelder für die Menüschaltflächen und zeichnet einfach deren Text Hover ausschalten,
wird der Spieler gezwungen, auf die Menüschaltflächen zu klicken, um zwischen ihnen zu
wechseln, anstatt nur Und das bevorzugte globale Menü ermöglicht es, diese
Menüleiste
von Mac-Betriebssystemen als globales Menü außerhalb
des Spielfensters Wenn du also nicht möchtest
, dass das passiert, kannst
du es hier ausschalten. Wenn Sie jedoch
das globale Menü verwenden, können
Sie angeben wo im globalen
Menü mit dem Hinzufügen
Ihrer benutzerdefinierten Popup-Menüs begonnen
werden soll , wobei der Startindex negativ eins ist.
In diesem Fall bedeutet das automatisch Und natürlich sind
BD-Optionen auch für Sprachen
verfügbar, die von rechts nach links
schreiben. Wir haben jetzt eine Menüleiste
mit mehreren leeren Menüs. In der nächsten Lektion werden
wir
die Popup-Menüs mit
verschiedenen Optionen füllen die Popup-Menüs mit
verschiedenen Optionen Wir sehen uns in der nächsten Lektion.
25. Popup-Menü: Hallo Freunde. In
der vorherigen Lektion haben wir unserem Spiel eine Menüleiste hinzugefügt. In dieser Lektion werden wir
Optionen für die Popup-Menüs hinzufügen. Wenn Sie den
Popup-Menüknoten auswählen
und sich die
Eigenschaften im Inspektor ansehen, befindet sich unten ein erweiterbarer
Abschnitt mit dem Namen Elemente Hier können wir alle
Optionen hinzufügen, die in
diesem Popup-Menü verfügbar sein
werden,
wie „Neues Spiel“, „ Speichern“, „
Laden“ und „Beenden Diese Elemente können
neu angeordnet werden, indem Sie auf die Pfeile klicken oder
das Hamburger-Symbol ziehen Ich erstelle einen neuen Asset-Ordner für Menüsymbole und importiere
einige Menüsymbole Weisen Sie dann jedem
Menüelement ein eigenes Symbol zu. Für Einstellungen füge ich ein weiteres Element hinzu und mache dieses
als Checkbox aktivierbar Dies wäre
für etwas geeignet , das ein- oder ausgeschaltet werden kann, wie zum Beispiel die Stummschaltung Dann füge ich ein weiteres
Popup-Menü als untergeordnetes Element dieses Popup-Menüs hinzu,
um ein Untermenü zu erstellen, das ich Schwierigkeit nenne. Bei den Optionen in diesem Popup-Menü handelt es sich um meine Schwierigkeitseinstellungen, jeweils als
Optionsfeld aktiviert werden können,
was bedeutet, dass jeweils nur einer ausgewählt
werden kann Die Option Einfach ist standardmäßig aktiviert. Einfach, normal und schwer. Im Hilfemenü füge ich ein Element für etwa
mit einem weiteren Symbol hinzu. Dann noch ein Punkt mit
der Aufschrift Support. Wenn Sie auf den Schalter zum
Trennen klicken, ist diese Menüoption keine
anklickbare Schaltfläche, sondern ein Trennzeichen zwischen
verwandten Gruppen von Menüelementen,
wobei der Name als Bezeichnung in dieses
Trennzeichen geschrieben wird Ich füge dann ein weiteres Element unter
dem Trennzeichen hinzu. Dabei handelt
es sich um einen Link zu meinem Patron mit dem
Social-Media-Symbol Wählen Sie den Stammknoten aus, damit
wir den Theme-Editor sehen können. Fügen wir dem Thema ein
Popup-Menü hinzu. Die Farbe des Schriftbeschleunigers wird für die Anzeige von Tastenkombinationen
verwendet, aber wir haben nicht die Möglichkeit, diese im Inspektor
hinzuzufügen. Unsere Popup-Menüs haben auch
keine Titel, aber die restlichen
Schriftfarbenoptionen sollten Ihnen bekannt vorkommen, zusammen mit zusätzlichen
Schriftfarbeneinstellungen für Trennzeichen Im Bereich „Konstante“ haben
unsere Popup-Menüs keine Schaltfläche zum Schließen, aber die horizontale
Trennung kann verwendet werden, um Abstand
zwischen dem Symbol
und dem Text jedes Elements Die maximale Breite des Symbols
ist nützlich, um
die Größe der Symbole so zu begrenzen die Größe der Symbole so zu der
Schrifthöhe des Textes
entspricht. In diesen Popup-Menüs wird es keine Einrückungen geben, aber durch Auffüllen können zusätzliche Pixel am Anfang und
Ende jedes Elements hinzugefügt werden,
sodass nur ein
bisschen mehr Platz
zur sodass nur ein
bisschen mehr der Schriftgröße sind wir inzwischen
sehr vertraut kann auch
auf Text und Trennzeichen angewendet
werden Diese Popup-Menüs können nicht in der
Größe geändert werden und haben keine Titel die vertikale
Trennung kann jedoch
die Anzahl der Pixel
zwischen den einzelnen Menüoptionen angepasst die Anzahl der Pixel
zwischen den einzelnen Menüoptionen Es gibt Eigenschaften für
Schriftart und Schriftgröße
der Menüoptionen,
Titel und Trennzeichen Ich lasse einfach all diese Optionen stehen
und verwende die Standardeinstellungen des Themes. der Seite mit den Symbolen können Sie die Symbole
ändern, die für Checkboxen,
Schließschaltflächen,
Optionsfelder und Untermenüs
verwendet werden Schließschaltflächen,
Optionsfelder und Untermenüs Ich habe einige neue
Symbole importiert, um sie für diese zu verwenden, also werde ich sie einfach
alle ersetzen Diese Bilder haben eine
quadratische Größe von 16 Pixeln und werden nicht in der Größe verändert. Stellen Sie also sicher, dass Sie
ein einigermaßen kleines
Bild für diese Symbole verwenden ein einigermaßen kleines
Bild für diese Symbole Auch wenn unsere
Popup-Menüs keine geschlossene Schaltfläche
haben, füge
ich diese beiden hinzu. Auf der Stilseite können wir
ein Stilfeld für das
Popup-Menüfenster hinzufügen . Ich verwende eine
Style-Box-Textur,
die mit dem Stahlblechbild gezeichnet wurde die mit dem Stahlblechbild und gebe ihr Texturränder , damit die Schrauben
nicht gedehnt werden. Das Feld im Hover-Stil wird
gezeichnet, wenn der Mauszeiger auf die
Menüoption zeigt. Ich verwende eine flache Stilbox
und lasse sie genauso aussehen
wie die Menüschaltflächen Da mein Trennzeichen Text enthält, kann
ich die
Stilfelder „Bezeichnetes Trennzeichen
links“ und „Bezeichnetes
Trennzeichen rechts“ verwenden Stilfelder „Bezeichnetes Trennzeichen
links“ und „Bezeichnetes
Trennzeichen rechts , um zu ändern, wie
das Trennzeichen links und rechts
vom Text meines Trennzeichens
gezeichnet wird . Wenn das Trennzeichen
keinen Text enthält, wird das Feld für den Trennzeichenstil verwendet, um es zu zeichnen. Eingebettete Rahmen werden in unseren Popup-Menüs nicht
verwendet. Schauen wir uns an, wie diese
Popup-Menüs aussehen, wenn wir das Spiel starten. Wenn Sie auf eine
unserer Menüschaltflächen klicken, wird
das Popup-Menü zusammen mit dem Panel
angezeigt. Sie können mit der Maus
über jedes Objekt fahren und es anklicken, aber keine der Optionen
bewirkt noch etwas, und das
Untermenü mit dem Schwierigkeitsgrad ist nicht Dies erfolgt nicht automatisch. Wir müssen es
über ein Skript hinzufügen. Lassen Sie uns also ein Skript zu
unserem Einstellungs-Popup-Menü hinzufügen. Im Skriptordner gespeichert und vom Popup-Menü Wenn wir uns einen Verweis auf
das Untermenü mit dem Schwierigkeitsgrad holen, brauchen wir nur zu tun,
wenn dieser Knoten bereit ist und somit auch seine
untergeordneten Knoten bereit sind Dann können wir eine Funktion
der Popup-Menü-Klasse aufrufen Fügen Sie ein Untermenüknotenelement hinzu, das
eine Bezeichnung, ein Popup-Menüknoten
und optional die Indexnummer erforderlich sind, und optional die Indexnummer an
der das Untermenü eingefügt
werden soll Wir können einfach den Namen des
Knotens für das Label und den Knoten selbst verwenden. Wenn Sie den Index ignorieren, wird
das Untermenü am Ende
hinzugefügt Fügen wir dem
Datei-Popup-Menü ein weiteres
Skript hinzu, damit wir Verknüpfungen hinzufügen
können Alles, was wir tun müssen, ist Variablen
vom Typ Shortcut zu
exportieren , damit wir sie im Inspektor
festlegen können. Wenn der Knoten dann bereit ist, können
wir überprüfen, ob
diese Abkürzungen
einen Wert haben , bevor wir sie als
Verknüpfungen zu
den Indexnummern
der einzelnen Elemente in
diesem Popup-Menü festlegen Verknüpfungen zu
den Indexnummern . Wir können jede
dieser Abkürzungen im Inspektor mit herkömmlichen
Tastenkombinationen füllen ,
die wir erwarten würden Strg- oder Befehls-N
für neues S für Speichern, L für Laden und E für Beenden Dann sollten wir zurück
zum Theme-Editor gehen und eine Schriftfarbe für
unsere neuen Shortcuts
hinzufügen. Wenn wir das Spiel jetzt starten, enthält
unser Dateimenü Verknüpfungen und unser Einstellungsmenü ein
Untermenü mit Optionsfeldern. Das Untermenüsymbol ist jedoch hinter dem Text des Elements
versteckt. Leider ist das Untermenüsymbol aufgrund
der Anordnung
dieser Elemente nur
sichtbar, Untermenüsymbol aufgrund
der Anordnung
dieser Elemente nur
sichtbar wenn das Element
nicht das längste ist. Um dem abzuhelfen, könnten wir Code schreiben , um die Breite
des Panels manuell zu
bearbeiten , oder wir
können einige
unserer anderen Elemente so umbenennen , dass sie länger
als das Untermenüelement sind. Ich muss etwas mehr
horizontale Trennung
und Polsterung hinzufügen , um
meiner großen Schriftgröße gerecht zu Schauen wir uns die
Eigenschaften des Untermenüs an. Die ersten drei Optionen
bestimmen, ob das Popup-Menü nach dem
Klicken auf eine Option ausgeblendet Wenn wir die Option „Bei aktivierbarem Element
ausblenden
“ deaktivieren , wird das Popup-Menü nicht ausgeblendet, wenn Sie auf ein Kontrollkästchen klicken oder die Optionsfelder
ändern Dies kann
für die Popup-Menüs mit Einstellungen
und Schwierigkeitsgraden nützlich sein Popup-Menüs mit Einstellungen
und Schwierigkeitsgraden Ein Statuselement
ähnelt einem Kontrollkästchen, kann jedoch mehr als zwei Status
haben und muss
über ein Skript erstellt werden. Die Popup-Verzögerung des Untermenüs
gibt an, wie lange die Maus über das Untermenü fahren muss bevor das Pop-up angezeigt wird Suche zulassen macht
jede Menüoption
im Popup-Menü mit
Tastatureingabe durchsuchbar , solange das
Popup-Menü angezeigt wird Die anderen Optionen
dienen der Integration dieses Popup-Menüs in verschiedene
Betriebssystemmenüs das Spiel erneut ausführen, ist
alles räumlicher angeordnet
und wir können
Tastatureingaben verwenden, um das
Popup-Menü zu durchsuchen, das den Fokus hat Wir haben jetzt Popup-Menüs für
jede unserer Menüschaltflächen. In der nächsten Lektion werden wir
Skripte für unsere Menüoptionen schreiben . Wir sehen uns in der nächsten Lektion.
26. Signale: Hallo, Freunde. In
der vorherigen Lektion haben wir unserer Menüleiste Menüoptionen
hinzugefügt. In dieser Lektion werden wir Skripte
schreiben, die darauf reagieren, dass sie jeweils gedrückt werden. Beginnen Sie mit dem
Datei-Popup-Menü wechseln Sie vom
Inspektor-Panel zum Node-Panel wo wir alle
Signale sehen können, die dieser Node aussenden kann. Kann auf das Signal „ID
gedrückt“ reagieren, indem es
mit dem Skript für das
Datei-Popup-Menü verbunden wird. Unser Skript reagiert also darauf
, dass der Spieler
einen der Menüeinträge auswählt oder die Tastenkombinationen
drückt. Im Gegensatz zur Taste übergibt uns dieses
Signal als Argument. Die generierte Funktion hat also einen passenden Parameter
desselben Typs, die ID-Nummer des
Elements, das gedrückt wurde. Zurück auf der Registerkarte Inspektor können
wir die ID-Nummern der
einzelnen Elemente sehen , falls wir sie
kennen oder bearbeiten müssen. In dieser Funktion können wir
eine Match-Anweisung verwenden, um
unterschiedlichen Code auszuführen , je nachdem, welches Element gedrückt wurde. Und halten Sie die Dinge organisiert, indem Sie einfach für jede
Funktion eine andere Funktion aufrufen. Lassen Sie uns einfach
Anweisungen ausdrucken , die besagen, welche
Funktion vorerst aufgerufen wurde. Nachdem wir ein neues Spiel gestartet
haben, müssen wir viele
unserer Kontrollknoten
auf ihre Standardzustände zurücksetzen , was ziemlich verwirrend wäre,
wenn es plötzlich passieren Schauen wir uns also einen Verweis auf den Fade-Node
an. Dann können wir warten
, bis
die neuen Speicherdaten auf Schwarz umgestellt werden, und
danach wieder auf Löschen übergehen. Es ist unmöglich,
genau vorherzusagen, wie
viele Dinge auf die Erstellung der
neuen Speicherdaten reagieren müssen. Anstatt
sie alle hier zurückzusetzen, wäre
es besser, ein Signal
auszusenden Wir können unsere eigenen
Signale genau wie Variablen deklarieren. Nennen wir es Reset. Geben Sie es dann aus, nachdem wir die neuen Speicherdaten
erstellt haben. Jeder Knoten im Szenenbaum kann
sich mit diesem Signal verbinden und auf seinen Standardstatus
zurücksetzen , wenn der Spieler ein neues Spiel starten
möchte. Da dieser Vorgang nicht sofort
abläuft, sollten
wir möglicherweise einschränken,
wann er aufgerufen werden kann. Wenn der
Spieler beispielsweise schnell hintereinander auf
Neues Spiel drückt und Spiel
lädt, würde
dies zu
unerwünschtem Verhalten führen. Lassen Sie uns eine weitere
Variable als booleschen Wert deklarieren, die angibt, ob dieses Skript
ausgelastet ist oder nicht Wenn dann eine ID gedrückt wird und dieses Skript ausgelastet ist, ignoriert
es die Eingabe Wenn Busy auf True gesetzt
wird,
bevor es auf Schwarz übergeht, und auf False nach dem
Fading auf Clear gesetzt
wird, kann sich
keine dieser Funktionen gegenseitig
stören,
nachdem eine Das Laden des
Spiels entspricht vorerst
im Wesentlichen dem Starten
eines neuen Spiels Wenn Sie das Spiel beenden,
müssen Sie nur Busy auf True setzen, auf Schwarz
verblassen und dann
dem Szenenbaum mitteilen, dass er das Spiel beenden soll Dadurch wird die Anwendung
auf allen Plattformen außer dem Web geschlossen auf allen Plattformen außer dem Web Webspiele haben in der Regel überhaupt nicht
die Möglichkeit, sie zu beenden. Schauen wir uns als Nächstes
das Einstellungsmenü an und verbinden das zugehörige
ID-Signal mit dem Skript. Im Moment
deklariere ich einfach eine Variable
, die den aktuellen Wert
von mute als booleschen Wert enthält,
was natürlich
standardmäßig auf False gesetzt ist, und eine was natürlich
standardmäßig auf False gesetzt ist, und für den Schwierigkeitsgrad,
eine
weitere als Ganzzahl, die standardmäßig Dieses Popup-Menü hat nur
ein Element, den Schalter für die Stummschaltung. Also bestätige ich einfach
, dass die Idee Null ist, rufe
dann eine Funktion
auf, um den Wert von
Mute so einzustellen , dass er das Gegenteil
von dem ist, was er derzeit ist dieser Funktion
eine Definition geben und den Wert
von mute als booleschen Wert
akzeptieren, müssen
wir das Kontrollkästchen so setzen,
dass es tatsächlich aktiviert wird mit der Maus
über eine Eigenschaft im Inspektor fahren, auf
die wir über ein Skript
zugreifen möchten, können
wir den Eigenschaftspfad sehen, Punkt Null, Schrägstrich CHEC rechten Maustaste klicken, können wir diesen Pfad auch in die Zwischenablage
kopieren dann die Set-Funktion aufrufen, die den
Eigenschaftspfad als erstes Argument akzeptiert, können
wir dies
in Anführungszeichen einfügen Gefolgt vom Wert wollen
wir ihn stummschalten. Dadurch wird das Kontrollkästchen markiert, aber es wird nichts
stummgeschaltet. im unteren
Bereich auf Audio umschalten, können
wir den
Audiobus-Editor von Godo sehen
, der standardmäßig nur über einen
Bus verfügt, den Master-Audiobus, dessen Busindex Null ist Die meisten Spieleprojekte werden über
einen Bus für Musik, Soundeffekte
und Voiceover verfügen einen Bus für Musik, Soundeffekte , sodass jedes als
separate Gruppen verwaltet werden
kann Zurück in unserem Skript können
wir über einen eingebauten
Singleton-Audioserver auf
diesen Masterbus zugreifen einen eingebauten
Singleton-Audioserver auf
diesen Masterbus Greifen Sie dann auf die Funktion set
bus mute übergeben Sie den Busindex
, der Null ist, und den Wert
von mute als Argumente werden wir uns die Singleton-Klassen In der nächsten Lektion werden wir uns die Singleton-Klassen genauer das Signal „ID gedrückt“
des Untermenüs mit
demselben Skript verbinden , können
wir den Schwierigkeitsgrad
so einstellen dass er der ID
entspricht, die gedrückt wurde Da sie in aufsteigender
Reihenfolge sind, ist das sinnvoll. Wir müssen dann die
Eigenschaft Checked für alle Elemente festlegen , da Optionsfelder niemals
zulassen sollten , dass mehr als eines gleichzeitig aktiviert
werden kann Mithilfe von vier Schleifen können
wir jedes Objekt in der Anzahl der Punkte auf dem
Schwierigkeitsgrad iterieren jedes Objekt in der Anzahl der Punkte auf dem
Schwierigkeitsgrad Das wird also
Null, Eins, Zwei zählen. Wir können dann dieselbe
Funktion wie zuvor verwenden, dieses Mal im Einblendmenü mit dem
Schwierigkeitsgrad, und die Eigenschaft „Objekt Null
geprüft“ so
einstellen, die Eigenschaft „Objekt Null
geprüft“ so
einstellen dass sie angibt, ob der Wert des Elements der ID
entspricht, die gedrückt wurde. Aber wir wollen nicht
nur Punkt Null setzen. Also ersetzen wir Null
durch Prozent S. Dies markiert eine Position innerhalb der Zeichenfolge, die durch einen Wert
ersetzt wird. Wenn Sie auf die Zeichenfolge
ein weiteres Prozentzeichen setzen, wird durch den Wert, durch den sie
ersetzt wird durch den Wert, durch den sie
ersetzt werden soll,
Element Null aktiviert, Element eins markiert und Element zwei, mit Null
markiert
ist, gleich ID. Eins entspricht ID und zwei entspricht ID. Bevor wir
das Hilfeskript erstellen, wollen wir schnell ein einfaches
Info-Fenster
zusammenstellen , indem wir
dem Spiel
einen Panel-Container hinzufügen , ihn
umbenennen und sortieren,
sodass er über den
anderen Spielelementen dargestellt wird. Fügen Sie dann einen vertikalen
Box-Container, eine Bezeichnung und eine Schaltfläche hinzu. Das Label könnte das Projekt,
seine aktuelle Version und
wer es entwickelt,
beschreiben . Die Schaltfläche wird verwendet, um dieses Fenster zu
schließen, und kann so eingestellt werden, dass es auf die Mitte verkleinert anstatt die
Breite des Containers auszufüllen Wir werden das dann in
der Mitte des Bildschirms verankern. das
Signal, das die Taste gedrückt hat, mit dem Info-Node verbinden, brauchen
wir kein Skript, das an den Node
angehängt ist. Wir können einfach die
Hide-Funktion auswählen, die in
der Control-Klasse definiert ist , indem wir nur die Skriptmethoden
ausschalten Habe sie standardmäßig ausgeblendet. Und gib ihm einen eindeutigen Namen. Lassen Sie uns abschließend ein neues Skript
für das Hilfe-Popup-Menü
erstellen . Und schnappen Sie sich auch einen Verweis auf das Info-Fenster und verbinden Sie dessen
ID-Signal mit dem Skript. die ID abgleichen und uns daran erinnern, dass das Trennzeichen
auch eine ID belegt, können
wir entweder
Informationen über
unser Spiel anzeigen oder eine
URI in einem Webbrowser öffnen. Verwenden Sie das Singleton OS, kurz für Betriebssystem, verwenden Sie die Funktion Shell Open geben Sie
dann die Website an Dies funktioniert jedoch nicht für
Web Build. Wenn der Name des
Betriebssystems also HTML five lautet, sollten
wir stattdessen
das JavaScript Bridge Sileton verwenden , um Folgendes auszuwerten Der Punkt href mit der Position des Fensterpunkts
entspricht dann der Website. Das funktioniert jetzt
auf jeder Plattform. Lass uns das Spiel starten und
versuchen, unsere Tasten zu drücken. Wenn Sie im Hauptspiel die Taste „
Strg“ drücken, wird es schwarz. Wir sehen die
Ausgabe der neuen Spielnachricht und sie wird wieder eingeblendet. Das Laden macht das Gleiche. Und beim Speichern wird nur die Nachricht
ausgegeben. Wir können
die Stummschaltung aktivieren und deaktivieren, den Schwierigkeitsgrad
der Optionsfelder
ändern, das Info-Fenster
öffnen, schließen und
meine Patrion-Seite im
Standard-Webbrowser öffnen meine Patrion-Seite im
Standard-Webbrowser Wir haben jetzt alle
unsere Menüoptionen, die auf
Spielerinteraktionen reagieren In der nächsten Lektion werden wir die
Speicherdaten
der Spieler hinzufügen und sie verwalten Wir sehen uns in der nächsten Lektion.
27. Daten speichern: Hallo Freunde. In
der vorherigen Lektion haben wir alle unsere
Menüoptionen mit Skripten verbunden. In dieser Lektion erstellen wir die Speicherdaten des Spielers und verwalten sie mit den Menüoptionen. Um einen Saffle zu verwalten, müssen
wir ein neues Skript
erstellen , das beschreibt, was darin enthalten ist Nennen wir es so
etwas wie
Daten speichern und von der
Ressource erben statt vom Knoten Bei dieser Ressource handelt es sich nicht
um
etwas, das gezeichnet oder dem Szenenbaum hinzugefügt wird, sondern es handelt sich lediglich um eine
Sammlung von Daten, die die Informationen des
Spielers
beschreiben da sie
zum Spielen des Spiels benötigt werden Beginnend am Anfang des
Skripts vor Extensions müssen
wir dieser Ressource
einen Klassennamen geben, müssen
wir dieser Ressource
einen Klassennamen geben indem das Schlüsselwort Klassenname
mit einem Unterstrich Diese werden üblicherweise in Pascal-Groß- und
Kleinschreibung geschrieben. Wir können diesem Skript dann beliebige Variablen
hinzufügen. Fügen wir hinzu, ob
die Lautstärke stummgeschaltet ist oder nicht wäre ein boolescher Wert und der
Schwierigkeitsgrad Und auch alle anderen Variablen , die
zum Spielen des Spiels benötigt werden könnten, wie zum Beispiel das aktuelle
Gold des Spielers allen
Variablentypen muss Primitive wie Boolean,
Integer, Float Bei allen
Variablentypen muss es sich um
Primitive wie Boolean,
Integer, Float
oder String oder um eingebaute Klassen handeln, die nur
diese primitiven Typen
wie Vektoren oder Farben enthalten wie Vektoren Alle Informationen, die Sie
speichern möchten, müssen mit dem Export-Tag versehen sein speichern möchten, müssen Möglicherweise möchten Sie einige Variablen ohne
das Export-Tag hinzufügen
, da dieses nicht
zwischen den Spielsitzungen bestehen bleibt Zwar
haben all diese Variablen natürliche Standardwerte, wir können ihnen auch unsere
eigenen Standardwerte zuweisen Oder wenn wir
komplexe Algorithmen oder die Generierung von
Zufallszahlen einbeziehen möchten , wäre
es besser,
die vom Objekt
geerbte initialisierte Funktion zu überschreiben die vom Objekt
geerbte initialisierte Funktion Godot ruft
diese Funktion beim
Erstellen der Ressource automatisch für uns auf, sodass wir alle benötigten Variablen initialisieren können Dieses Skript muss gespeichert werden bevor wir es
in anderen Skripten verwenden können Als Nächstes wechseln wir
zum Dateiskript. Da die Ressource einen Klassennamen
hat, können
wir eine Variable deklarieren,
indem wir sie als Typ verwenden. Dann kann die neue
Menüoption im Spiel
eine neue Ressource
dieses Typs erstellen , indem der Klassenname
gefolgt vom Punkt Nu verwendet wird. Um unser Spiel zu speichern, müssen
wir
auch wissen,
wo wir es auf dem
Betriebssystem des Spielers speichern können, was am besten
in einer Konstante gespeichert wird. Nennen wir es Pfad als Zeichenfolge. Zum Glück löst Godot
dieses Problem für uns,
indem es den
Shortcut-Benutzer Colon Slash Slash zur Verfügung stellt
, der
automatisch auf
eine geeignete Stelle
auf jeder Plattform Wir müssen der Datei nur einen Namen geben. Wenn Sie dem Namen mit der
Dateierweiterung Punkt TRS folgen, wird eine
Textressourcendatei
generiert, die von jedem in Notepad gelesen und bearbeitet werden
kann Definitiv eine gute Idee für
Debugging- und Indi-Projekte. Um unser Spiel zu speichern, müssen wir
nur auf
eine eingebaute Singleton-Klasse,
Resource Saver, zugreifen, die
eine Funktion namens Save hat Dies akzeptiert eine Ressource
und einen Pfad als Argumente. Das Laden des Spiels
ähnelt dem Speichern, außer dass wir den Wert
der Speicherdaten einer anderen
eingebauten Singleton-Klasse zuweisen , Resource Loader, der
eine Funktion namens load hat, die dasselbe
Pfadargument
akzeptiert Diese Singletons, die
wir weiterhin verwenden, sind nur Skripte, die Klassen
enthalten, nicht unähnlich vielen, die wir geschrieben haben, aber sie sind Teil der
Gadot-Game-Engine Sie werden Singletons genannt , weil sie so
geschrieben sind
, dass es immer nur
eine Instanz von
ihnen geben kann Instanz von Das macht sie sehr zugänglich
, weil wir direkt über den Klassennamen
auf die eindeutige Instanz
zugreifen können , so wie wir es hier getan haben ,
ohne sie in einer Variablen
speichern zu müssen Wir müssen nicht wissen, wo
sie sich befindet oder sie finden, weil der Klassenname selbst ein direkter Verweis auf
die Instanz davon ist, gerade weil
es nur eine gibt. Die meisten Skripte, die wir als
Entwickler schreiben ,
müssen nicht eindeutig sein, und es ist sogar
vorzuziehen, dass sie nicht sind. Wir nehmen zum Beispiel das
Fade-Skript, es gibt keinen Grund, warum wir nicht genau dieses Skript
auf einem anderen Knoten
im Szenenbaum platzieren
und für einen
anderen Zweck wiederverwenden
könnten auf einem anderen Knoten
im Szenenbaum . Aber dann ist die Notwendigkeit, auf
den Knoten zu verweisen , an den das Skript
angehängt ist, indem man
es in einer Variablen
speichert , die einzige Möglichkeit zu
wissen, auf welches Fade-Skript
wir zugreifen wollen, da es
mehrere Instanzen geben würde. Es ist möglich,
unsere eigenen
Singleton-Klassen in Gadot zu erstellen , aber das brauchen wir
für dieses Projekt nicht Game Manager-Skript Geben
wir dem Dateiknoten aus dem einen eindeutigen Namen und speichern einen
Verweis darauf in einer Variablen Wenn dann die
Starttaste gedrückt wird, können
wir dem Dateiknoten mitteilen, dass er ein neues Spiel starten
soll. Das Dateiskript kümmert sich für uns um das verblassende Backend, sodass
wir es von hier entfernen können den Standardwert
busy auf true setzen kann der Player
keine dieser Funktionen
vom Titelbildschirm
aus aufrufen , was derzeit
mithilfe der Tastenkombinationen möglich ist Und wir sollten auch
die Starttaste deaktivieren , um zu verhindern, sie
mehr als einmal gedrückt wird. Gib ihm einen eindeutigen Namen. Wir müssen
es nicht in einer Variablen speichern da wir es nur
einmal verwenden werden und die Eigenschaft disabled einfach auf true
setzen können , wenn wir es drücken. Im Einstellungsskript müssen
wir einen Verweis
auf das Datei-Popup-Menü in einer Variablen speichern, um
auf die Speicherdatenressource zuzugreifen, und wir können diese
temporären Variablen löschen. Wenn Sie den Schalter Stummschalten auswählen, müssen
wir
den Wert für Stummschalten
auf das Gegenteil von dem setzen , was in den Speicherdaten
gespeichert ist Wir werden den
Wert der Datenressource
zum
Speichern von Dateien so einstellen, dass er dem Wert „Stumm“ entspricht, sodass er das Gegenteil von dem ist,
was er zuvor war Ebenso muss beim Ändern
des Schwierigkeitsgrades auch der Wert
in den Speicherdaten des Spielers festgelegt werden. Wenn neue Speicherdaten
erstellt oder geladen werden, müssen
wir diese
Werte so einstellen, dass sie mit den Speicherdaten übereinstimmen. also das
Datei-Popup-Menü auswählen, können
wir das benutzerdefinierte
Signal, das wir in der letzten Lektion erstellt haben, mit
dem Einstellungsmenü-Skript verbinden , um automatisch
eine neue Funktion aufzurufen. Dadurch können wir die
Stummschaltung und den Schwierigkeitsgrad so einstellen entsprechen, was in den neu
erstellten oder geladenen Speicherdaten enthalten ist. Lass es uns ausprobieren, indem wir das Spiel
ausführen. Wenn Sie die Tastenkombinationen
auf dem Titelbildschirm verwenden, werden
sie ignoriert. Durch Drücken der Starttaste werden jetzt unsere ersten Speicherdaten
erstellt. Wenn wir im Menü Speichern auswählen, wird auf unserem Computer eine Speicherdatei
erstellt, die wir in einem beliebigen
Texteditor wie Notepad öffnen können Wir können die Werte
unserer Variablen sehen. Zurück im Spiel können wir
die Werte für Stummschaltung
und Schwierigkeitsgrad ändern , das Spiel
speichern und die Änderungen sofort
in unserer Speicherdatei
sehen. Wenn wir das Spiel beenden
und von vorne beginnen, können
wir unsere
Speicherdatei laden und sehen die Änderungen
an den gespeicherten Werten vorgenommen wurden. Wir haben jetzt alle unsere
Menüoptionen funktionsfähig. In der nächsten Lektion werden wir Überblick über das Gold des Spielers
behalten. Wir sehen uns in der nächsten Lektion.
28. Zähler: Hallo, Freunde. In
der vorherigen Lektion haben wir die Speicherdaten der
Spieler verwaltet. In dieser Lektion fügen
wir dem Bildschirm einen Zähler hinzu
, um den
Überblick über ihr Gold zu behalten. Lassen Sie uns zunächst über
das allgemeine Bildschirmlayout nachdenken und entscheiden, wo diese Informationen
platziert werden sollen. die Menüleiste in
der oberen linken Ecke befindet, denke
ich, Da sich die Menüleiste in
der oberen linken Ecke befindet, denke
ich, dass die
Ressourcenzähler
der Spieler in derselben horizontalen
Linie wie die Menüleiste den zusätzlichen
Platz oben rechts
sinnvoll nutzen,
sodass der Rest des Fensters für das Hauptspiel verfügbar Nachdem der
Randcontainer ausgewählt ist, sollten wir ihn zunächst in der
vollen Größe des Spielfensters verankern Fügen Sie dann einen vertikalen
Box-Container hinzu, um
die Menüleiste über den
anderen Komponenten anzuordnen die Menüleiste über den , die wir
noch nicht hinzugefügt haben. Zum vertikalen Box-Container fügen
wir einen horizontalen
Box-Container hinzu, der
die Menüleiste links und
die Ressourcenzähler rechts anordnet Die
Ressourcenzähler selbst, sowohl
über ein Symbol als auch über eine Zahl werden ebenfalls horizontale
Box-Container sein Nennen wir diesen einen Namen Gold. Geben Sie ihm dann einen texturzerstörten Knoten und einen Label-Node
als untergeordnete Elemente Ich habe dieses Goldmünzensymbol, das ich für die Währung meines
Spiels verwenden werde, das werde ich als
Textur für mein Wenn Sie eine solche
Benutzeroberfläche erstellen, ist
es eine gute Idee,
Ihre Zähler standardmäßig auf die höchstmögliche
Anzahl einzustellen
, die Sie zulassen möchten Auf diese Weise wissen Sie, wie viel Speicherplatz stehen
muss, um sie
unterzubringen Ich denke, 10 Millionen sollten hier eine ausreichend
große Zahl Der Zähler ist
derzeit nach
dem horizontalen Box-Container
rechts neben
der Menüleiste sortiert dem horizontalen Box-Container ,
aber ich würde es vorziehen, in
der oberen rechten Ecke zu stehen und alle zusätzlichen Ressourcenzähler ich hinzufügen könnte,
in der linken Ecke aufzufüllen die
Menüleiste auswählen, können wir ihr sagen, dass sie horizontal
ausdehnt, um so viel Platz wie möglich
auszufüllen . Dadurch werden die restlichen untergeordneten Felder des
horizontalen Felds so weit
wie möglich
nach rechts bewegt Wenn ich jetzt
meinen Goldzähler dupliziere, wird
jeder Zähler nach rechts
hinzugefügt, wodurch die vorherigen nach links verschoben werden. Als Nächstes fügen wir dem Goldknoten ein Skript
hinzu, das
dafür verantwortlich ist, dass die
angezeigte Zahl immer mit der
Goldanzahl in den Speicherdaten des
Spielers
übereinstimmt . Nennen wir es also Counter und speichern wir es im
Scripts-Ordner. Um auf die Speicherdaten des
Players zugreifen zu können, müssen
wir einen Verweis auf
den Dateiknoten in einer Variablen speichern , und um die
Texteigenschaft
des Label-Nodes zu ändern ,
benötigen wir auch das. Dann können wir eine Funktion schreiben
, die den Zähler aktualisiert. Alles, was wir tun müssen, ist,
die Texteigenschaft
des Label-Knotens
auf den Wert von file data
dot gold als Zeichenfolge festzulegen die Texteigenschaft
des Label-Knotens
auf . Immer wenn der Spieler
ein neues Spiel startet oder sein Spiel lädt, wird
das Reset-Signal ausgegeben, das wir mit
dieser Funktion verbinden können , um den Zähler zu
aktualisieren. Als Nächstes müssen wir
ein oder zwei öffentliche Funktionen schreiben , die den Wert ändern. Ich werde zwei
separate Funktionen schreiben,
eine, die die Ressource empfängt, und eine zum Ausgeben
der Ressource, wobei beide einen
Integer-Parameter für den Betrag akzeptieren. Beim Empfang
setzen wir einfach die neue Menge der Ressource auf
die Summe, die
wir erhalten haben, und
aktualisieren dann den Zähler. Möglicherweise haben wir jedoch entschieden
, dass es
eine maximale Menge geben sollte , die angezeigt werden kann. Lassen Sie uns diese
Einschränkung also hier durchsetzen. Wir exportieren eine weitere
Variable für die maximale Menge
und geben ihr einen Wert. Wir können dieses Maximum dann
mit der Minimalfunktion erzwingen . Die Minimalfunktion gibt den kleinsten
aller angegebenen Werte zurück. Also entweder die Menge der Ressource plus
die
hinzugefügte Menge oder die
zulässige Höchstmenge , je nachdem, welcher Wert kleiner ist Wenn wir die Ressource ausgeben, müssen
wir zunächst prüfen,
ob der Spieler
genug von der Ressource hat , um den Betrag auszugeben Wenn die Menge der Ressource geringer
ist als die
Menge, die ausgegeben wurde, würden
wir wahrscheinlich nicht mit der
Transaktion
fortfahren und zurückkehren wollen . Wenn der Spieler genug hat, können wir die Menge
um den Betrag reduzieren und den Zähler
aktualisieren. Wir können diese Funktion
nützlicher machen , indem wir einen booleschen Wert zurückgeben. False, wenn
der Spieler nicht genug
hat, oder true,
wenn Somit kann jede Spiellogik, die
diese Funktion aufruft, auf
das Ergebnis des Versuchs,
diese Ressource auszugeben,
entweder als wahr oder falsch reagieren das Ergebnis des Versuchs,
diese Ressource auszugeben ,
entweder als wahr oder falsch Lassen Sie uns zu Testzwecken die Eingabefunktion
überschreiben, die ein
Eingabeereignis als Parameter akzeptiert. Prüfen Sie dann, ob entweder die Aufwärts
- oder die Abwärtstaste gedrückt wurden. Wenn die Aufwärtstaste gedrückt wurde, lasse
ich den Spieler
eine zufällige Goldzahl von 1 bis 100 erhalten eine zufällige Goldzahl von 1 bis 100 Ebenso geben sie, wenn
sie nach unten drücken, eine
zufällige Menge Gold aus, und ich drucke das Ergebnis aus Beim Ausführen des Spiels können wir
sehen, dass der Zähler so
eingestellt wurde , dass er dem ursprünglichen
Wert des Goldes des Spielers entspricht. nach unten drücken, wird der
Betrag reduziert bis sie es sich nicht mehr
leisten können, Geld auszugeben. In diesem Fall wird der
Zähler nicht reduziert und die Ausgabe
wechselt auf Falsch. Wenn Sie nach oben drücken,
wird der Zähler erhöht und schließlich
wird die maximale Menge erreicht. Das wird bei Gold ziemlich
gut funktionieren, aber was ist, wenn wir
verschiedene Ressourcen haben, die wir mit
all den gleichen Funktionen behandeln wollen? Wir würden für jede Ressource ein anderes
Skript benötigen, was kein sehr gutes Design ist. Lassen Sie uns dieses Skript also
flexibler gestalten und den Namen
der Ressource, die
dieser Zähler
verfolgt, als Zeichenfolge exportieren der Ressource, die
dieser Zähler . Denken Sie daran, diesen exportierten
Wert im Inspektor mit exakt
derselben Schreibweise einzustellen wie die Variable in den
Speicherdaten des Players , die Sie zählen
möchten. Außerdem ändere ich meinen maximalen Goldwert wieder auf den
Wert, den er haben sollte. Wir müssen außerdem
eine weitere Variable deklarieren , um die Menge zu
speichern. Jetzt
können beide Transaktionsfunktionen damit beginnen, zunächst die
Menge der Ressource aus den
Speicherdaten
des Spielers abzurufen. Dabei wird die G-Funktion verwendet, die den
Eigenschaftsnamen als Zeichenfolge akzeptiert. Also geben wir ihr
den Namen der Ressource. Wir werden dann
unsere Transaktionen mit
der lokalen Variablen durchführen, anstatt
direkt auf der lokalen Variablen durchführen, anstatt die Speicherdaten
der Spieler zu verweisen Und nachdem wir
unsere Funktionen ausgeführt
haben, können wir die Variable
in den Speicherdaten
des Players auf die gleiche Weise setzen , indem wir die Set-Funktion
verwenden, den Namen
der Eigenschaft
als Zeichenfolge und ihren neuen Wert
übergeben als Zeichenfolge und ihren neuen Wert Außerdem müssen wir die
aktuelle Menge aus den Speicherdaten
des Spielers ermitteln,
wenn wir den Zähler aktualisieren. Jetzt können wir den
Goldknoten duplizieren und ihn ohne Änderungen am Skript eine andere Ressource
verfolgen lassen, sondern nur die Werte
der exportierten Variablen ändern. Fügen wir den Speicherdaten der Spieler eine weitere Ressource
hinzu, etwa Roboter mit
einem Anfangswert von eins. dann auch eine Verbindung
zum Reset-Signal her, um diesen
neuen Ressourcenzähler
automatisch zu aktualisieren. Wenn wir das Spiel jetzt starten, beide Zähler die Menge der
verschiedenen Ressourcen an, die
in den Speicherdaten der Spieler enthalten sind verschiedenen Ressourcen an, die
in den Speicherdaten der Spieler enthalten Denken Sie daran, die Eingabefunktion zu entfernen oder
auszukommentieren ,
bevor Sie weitermachen Außerdem hätte die
Zähleranzeige nach dem Einstellen
des Mengenwerts
aktualisiert Wir haben jetzt
Ressourcenzähler für unser Spiel. Im nächsten Abschnitt werden wir mit der
Implementierung einiger
Spielmechaniken beginnen Implementierung einiger
Spielmechaniken Wir sehen uns
im nächsten Abschnitt.
29. Linienbearbeitung A: Hallo Freunde.
Im vorherigen Abschnitt haben wir eine
Menüleiste für unser Spiel erstellt. In diesem Abschnitt werden wir mit
der Implementierung einiger
Spielmechaniken beginnen . Lassen Sie uns damit beginnen,
den horizontalen
Box-Container zusammenzuklappen und ihn vielleicht etwas
aussagekräftigeres
umzubenennen Wir können dann ein weiteres Kind zur vertikalen Box hinzufügen , um
den Rest
des
Spielfensters zu füllen Ich verwende einen anderen
Randcontainer. Ich werde dieses
Margin-Containerschiff nennen, weil ich es verwenden werde, um Informationen über
das Schiff des Spielers
anzuzeigen und es so zu
erweitern, dass es den Rest
des Spielfensters vertikal ausfüllt . Innerhalb des Randcontainers platziere
ich eine vertikale
Kiste, ich eine vertikale
Kiste um einige
Komponenten vertikal anzuordnen.
Beginne mit einem Labelknoten
, auf dem einfach „Mein Schiff“ steht, sodass der Spieler weiß, dass es sich um sein Schiff
handelt. Darunter
füge ich eine Textur ein,
um ein Bild des Schiffes zu zeichnen, verwende das Gadot-Symbol
als Platzhalterbild, weise es an, die
Größe des Bildes zu ignorieren
und gebe ihm benutzerdefinierte Abmessungen
von 150 Pixeln Und zum Schluss noch ein Statistikblock des Schiffs Ähnlich wie bei einem horizontalen oder
vertikalen Box-Container können
wir
mithilfe eines Grid-Containers auf einfache Weise eine große
Anzahl von Kontrollknoten
in einer Rasterformation organisieren . wir dieser Statistik einen Namen
und geben ihr zwei Spalten, eine für Beschriftungen und
eine weitere für Werte. Für die Statistiken füge ich jeweils
zwei Labelknoten hinzu, den Schiffsnamen, den Schiffstyp, die Anzahl der Besatzungsmitglieder
und die Menge der
Ladung, die es aufnehmen kann. Die Beschriftungen auf der linken Seite
des Rasters geben an, um welche
Art von Wert es sich handelt. Die Beschriftungen auf der
rechten Seite können vorerst mit
Beispielinformationen
gefüllt werden , aber wir möchten, dass diese mit
Informationen in den Speicherdaten des
Spielers verknüpft werden . Der Rastercontainer sortiert
seine untergeordneten Objekte
automatisch nach der angegebenen Anzahl
von Spalten, wobei alle Zeilen
und Spalten ausgerichtet bleiben. Wenn ich alle drei untergeordneten Knoten des vertikalen Box-Containers
auswähle, lasse ich sie
zur Mitte hin schrumpfen Ich möchte, dass der
Spieler den Namen
seines Schiffs ändern kann den Namen
seines Schiffs ändern Lassen Sie uns
also den
Knoten mit der Bezeichnung in einen Linienbearbeitungsknoten ändern Dieser Knoten ermöglicht es
dem Spieler,
den darin enthaltenen Text zu bearbeiten ,
während er das Spiel spielt. Ich lege das alles in einen Panelcontainer, sodass es
einen schönen Rand hat. Weisen Sie dann den vertikalen
Box-Container an, senkrecht zur
Mitte des Panel-Containers zu
schrumpfen Auf diesem Display können wir
deutlich sehen, welche Informationen wir für
jedes Schiff
benötigen: ein Bild, einen
Namen, den Schiffstyp, die Mindest
- und
Höchstbesatzungszahl und die Frachtkapazität Ähnlich wie wir es mit
den Speicherdaten der Spieler gemacht
haben, können wir ein Ressourcenskript erstellen
, das diese Informationen enthält. Lassen Sie uns zunächst einen neuen
Skriptordner mit dem Namen Resources erstellen, in den wir das Skript zum Speichern von
Daten einfügen können. Erstellen Sie dann einen neuen Ordner für Schiffe und erstellen Sie
in diesem Ordner ein neues Skript mit dem Namen ship
inheriting from resource Hier können wir Variablen exportieren,
genau wie wir es mit
den Speicherdaten der Spieler getan haben ,
um ein Schiff zu beschreiben, einschließlich einer Textur mit
zwei D für das Bild, einer Zeichenfolge für den Typ und Ganzzahlen für
die minimale Besatzung, maximale Besatzung und die
Frachtkapazität Ich schließe den Namen des
Schiffes aus, da er nicht
mit dem Schiffstyp verknüpft Achten Sie darauf, dieses Skript zu speichern. der rechten Maustaste auf den
Schiffsressourcenordner klicken, können
wir jetzt eine neue Ressource erstellen und so viele
Schiffe bauen, wie wir möchten. Ich baue drei Schiffe, einen Kutter, einen Fang und einen Schoner auf die Ressource doppelklicken, können
wir sie im Inspektor öffnen und die exportierten Variablen bearbeiten, das
Bild mit
einem Bild eines Kutter
füllen und die Variablen Typ, Besatzungsgrenzen und Frachtkapazität Jede unserer Ressourcen
kann
die exportierten Variablen mit
ihren eigenen eindeutigen Werten füllen und
so eine Kategorie
ähnlicher Objekte für
unser Spiel erstellen, so eine Kategorie
ähnlicher Objekte für
unser Spiel erstellen die alle dieselben
Eigenschaften, aber
unterschiedliche Werte haben Eigenschaften, aber
unterschiedliche Um meine Skripte besser zu organisieren, werde
ich ja einen
Unterordner für die Benutzeroberfläche erstellen Dort werde ich all
meine Untermanuskripte ablegen ,
ausblenden und Dann noch ein Ordner
für Manager
, der den
Spielmanager und ein weiteres neues Skript enthält
, das ich an
den Schiffsknoten anhänge und es Schiffsmanager
nenne Der Schiffsmanager wird
dafür verantwortlich sein , alles zu verwalten, was mit seinen Kindern
passiert, einschließlich der Aktualisierung der
angezeigten Bilder und Texte. Um das zu tun,
muss
dieses Skript wissen, welche Schiffe
es im Spiel gibt. Also werden wir eine Reihe
von Schiffen als Variable exportieren. Wenn wir einen Blick in den Inspektor werfen, können
wir unsere Anordnung
von Schiffen sehen und ihr
drei Elemente hinzufügen und jedes mit
einem anderen Schiff bestücken Ich habe meine
Schiffe so konzipiert, dass sie als
Upgrades dienen , und würde es vorziehen , wenn
sie
vom schlechtesten zum besten sortiert würden Also setze ich den
Kutter auf Index Null, den Fang und
dann den Schoner Nun müssen wir aus
den Speicherdaten des Spielers nur noch wissen , welches Schiff der Spieler
gerade besitzt Dies kann einfach sehr effizient
gespeichert werden da es sich nur um den
Array-Index des Schiffs handelt. Wenn ich zum
Speicherdaten-Skript übergehe, füge
ich eine exportierte Ganzzahl für die Schiffsindexnummer des Spielers und lasse sie standardmäßig auf Null setzen. Während ich hier bin,
füge ich auch eine Zeichenfolge für
den Schiffsnamen hinzu. Zurück im Schiffsmanager-Skript, um die Schiffsinformationen des
Spielers anzuzeigen, benötigen
wir einen Verweis auf
das
Datei-Popup-Menü , um auf die Speicherdaten des
Spielers zuzugreifen. Ich werde diesen
Knoten in meine Schiffsinfo umbenennen. Dann schnappen Sie
sich Verweise auf die Knoten Texture Wrec, Line Edit und Label Ich benenne jede
dieser Variablen damit ich weiß, dass sie
den aktuellen
Chip des Spielers beschreiben , und auch eine lokale Variable, die die Schiffsindexnummer des
Spielers ich eine private Funktion schreibe, um die
Schiffsinformationen des Spielers zu aktualisieren, setzt
jeder Knoten die entsprechende Eigenschaft auf
die eines Schiffs im Array und
verwendet die
Schiffsindexnummer des Spielers, um das Array zu indexieren. Ich zeige die minimale
und maximale Besatzung zusammen indem ich sie in Zeichenketten zusammenfüge und sie
durch einen Bindestrich trenne Dann zeige ich auch
die Frachtkapazität mit ihren Einheiten in Tonnen an Wenn ein neues
Spiel gestartet oder geladen wird, wird
das Reset-Signal
ausgegeben und wir können uns mit diesem Signal verbinden , um die
Schiffsinformationen des Spielers automatisch zu aktualisieren. A nach dem Abrufen ihrer
Schiffsindexnummer aus den Speicherdaten Aber unser Schiff
hat noch keinen Namen. Ich werde nach dem Zufallsprinzip
Schiffsnamen aus einer Liste generieren, indem
ich zuerst eine Konstante namens Schiffsnamen
am Anfang
meines Skripts deklariere, die aus einer
Reihe von Zeichenketten bestehen wird Ich werde dieses Array dann
mit einer Reihe
gängiger Schiffsnamen füllen mit einer Reihe
gängiger Schiffsnamen das Schiff in der Funktion zum Zurücksetzen auf Dateien Wenn das Schiff in der Funktion zum Zurücksetzen auf Dateien keinen Namen hat, weise
ich ihm einen zufällig
ausgewählten Namen aus dieser Liste Indizieren des Arrays
mit einer zufälligen Ganzzahl zwischen Null und der Größe
des Arrays minus eins Als letztes
müssen wir dem Line-Edit-Node
die Möglichkeit geben, den Schiffsnamen
des Spielers zu ändern. Das können wir tun
, indem wir
sein Textsignal
mit dem Schiffsmanager-Skript verbinden sein Textsignal
mit dem Schiffsmanager-Skript Dies wird nach dem
Drücken der Enter-Taste weggelassen. Es gibt auch Signale
für jedes Mal der Text ändert oder wenn die
Textgrößenbeschränkung erreicht wurde. In unserer neu generierten Funktion
gibt es zwei mögliche
Situationen, die wir berücksichtigen
sollten ob der
Zeilenbearbeitungstext leer ist oder nicht. Da uns der neue Text als Parameter
übergeben wurde, können
wir ihn einfach
in eine if-Anweisung einfügen wobei true nicht leer
und false leer ist. Wenn der neue Text nicht leer ist, können
wir ihn dem Schiffsnamen des
Spielers zuweisen. Wenn er jedoch leer ist,
können wir das Gegenteil tun den Text
in der
Bearbeitungszeile auf den vorherigen
Wert des Schiffsnamens
zurücksetzen auf den vorherigen
Wert des Schiffsnamens Dadurch wird verhindert, dass der Spieler ein Schiff ohne Namen hat Es ist auch eine gute Idee,
dem Zeilenbearbeitungsknoten mitzuteilen , dass er
den Fokus loslassen soll, unabhängig vom Ergebnis. Der Schiffsname kann direkt aus
den
Speicherdaten des Spielers
gelesen werden , wenn er aktualisiert wird. zur 2-D-Ansicht zurückkehren, können
wir sehen, dass die Schiffsinformationen
unserer
Spieler mit
Platzhalterinformationen gefüllt Wenn wir das Spiel starten, wird
alles automatisch durch die Informationen ersetzt, die mit dem Kutterschiff
verknüpft sind, und dem Schiff wurde ein
zufälliger Name aus der Liste zugewiesen Wir können auf den
Zeilenbearbeitungsknoten klicken, um
den Namen des Schiffes zu ändern , und die
Eingabetaste drücken , um die Änderung zu senden. Der Versuch, dem
Schiff keinen Namen zu geben, wird abgewiesen. Das Spiel speichern und dann ein neues Spiel
starten. Der Schiffsname wird
durch einen zufällig
generierten ersetzt und
beim Laden des Spiels wird
unser gespeicherter Schiffsname wiederhergestellt. Wir haben jetzt die
Schiffsinformationen unserer Spieler angezeigt und
können den Schiffsnamen bearbeiten. In der nächsten Lektion werden wir uns mit den Optionen
befassen, die für die Linienbearbeitung von
Eigenschaften und Themen
zur Verfügung stehen Wir sehen uns in der nächsten Lektion.
30. Linienbearbeitung B: Hallo Freunde. In
der vorherigen Lektion haben wir dem Spieler erlaubt, den Namen seines Schiffes zu
ändern. In dieser Lektion
gehen wir auf die
verfügbaren Optionen für die Linienbearbeitung und die
Themengestaltung den Linienbearbeitungsknoten auswählen, schauen wir uns seine
Eigenschaften im Inspektor an Mithilfe der Texteigenschaft können
wir ihr einen Standardwert geben. Wenn die Texteigenschaft leer ist, wird der Platzhaltertext stattdessen mit
einer anderen Schriftfarbe
angezeigt Wir können den Text mittig
ausrichten, oder? Oder wenn Sie die gesamte Zeile ausfüllen
, werden die Wörter gleichmäßig verteilt. Wir können die Länge
des eingegebenen Textes einschränken. Es ist eine gute Idee, zu testen, wie
viel Text bequem mit einem breiten Buchstaben
wie einem großen M oder W
dargestellt werden kann mit einem breiten Buchstaben
wie einem großen M oder W
dargestellt Verwenden Sie
dann diesen Wert, um
die maximale Textlänge zu beurteilen. Wenn die Zeilenbearbeitung nicht editierbar
ist, kann
der Spieler nicht
darauf klicken und ihren Inhalt bearbeiten Wenn die Option „Auf
Textlänge erweitern“ aktiviert ist, wird
das Feld erweitert, um den darin enthaltenen Text
aufzunehmen Sie das Kontextmenü aktivieren, kann der Spieler mit rechten Maustaste auf die
Zeile am Knoten klicken , um ein Kontextmenü anzuzeigen. Wir können das im
Theme-Editor sehen , ohne das Spiel zu starten. Das Kontextmenü passt
sich automatisch den Popup-Menüs unseres
Spiels an und enthält all die
typischen Dinge, die wir
erwarten würden , wie Ausschneiden, Kopieren,
Einfügen, Alles auswählen,
Löschen, Rückgängig machen und Wiederherstellen, ein Untermenü zum Ändern
der Textrichtung und Optionen zum Anzeigen und Einfügen von
Steuerzeichen Wenn du
dieses Kontextmenü nicht einschließen möchtest ,
kannst du es hier ausschalten Für Konsolen- und
Mobilplattformen ist die
Integration
virtueller Tastaturen verfügbar, und es gibt mehrere
Optionen für die virtuelle Tastatur,
insbesondere für die Eingabe von Zahlen, Dezimalzahlen,
Telefonnummern, E-Mails,
Passwörtern kann eine Schaltfläche zum Löschen hinzugefügt werden Wenn Sie darauf klicken, wird der
gesamte Text aus der Zeilenbearbeitung entfernt Die im
Kontextmenü angezeigten
Tastenkombinationen werden verwendet, wenn das
Kontextmenü nicht angezeigt wird Diese können hier deaktiviert werden. gibt es eine Option
zum Deaktivieren des Einfügens Linux-Plattformen gibt es eine Option
zum Deaktivieren des Einfügens
mit der mittleren
Maustaste Sie können auch ändern, ob
der Player Text mit der Maus oder
der Tastatur
auswählen kann Text mit der Maus oder
der Tastatur
auswählen Fokusverlust deaktivieren wird der Text abgewählt ,
der
markiert war, als der Zeilenbearbeitungsknoten den Fokus verlor Drag-and-Drop-Auswahl
können Sie steuern,
ob der Spieler Text innerhalb dieser Zeilenbearbeitung anklicken und
ziehen kann Text innerhalb dieser Zeilenbearbeitung anklicken und
ziehen Der rechten Seite des Knotens kann ein Symbol zugewiesen werden, um dem Spieler besser zu signalisieren
, dass dieser Text editierbar ist Ein Stift ist üblich, aber ich verwende ein Federsymbol, das zur
Ästhetik meines Spiels passt Wenn es sowohl ein rechtes als auch ein leeres
Symbol gibt
, wird jedes Mal, wenn Text gelöscht
werden muss,
die Schaltfläche zum Löschen anstelle des rechten Symbols gezeichnet wird jedes Mal, wenn Text gelöscht
werden muss,
die Schaltfläche zum Löschen anstelle des rechten Symbols gezeichnet. Flach“ funktioniert genauso wie Schaltflächen Sie entfernt alle Stile
aus dem Knoten und zeichnet nur
den Text und das Symbol. Beim Zeichnen von Steuerzeichen handelt es sich um
dieselbe Umschaltoption, die auch im Kontextmenü
verfügbar war die auch im Kontextmenü
verfügbar ermöglicht das Zeichnen von
Steuerzeichen Schließlich wählt „Alles im Fokus auswählen“
automatisch den gesamten Text
aus,
wenn der Knoten zum ersten Mal den Fokus übernimmt. Unter der Kategorie Karat können
wir das
Karat anweisen, zu blinken, und das Zeitintervall zwischen den
Blinkbewegungen angeben Die Spalte Karat ist der Zeichenindex der aktuellen Position des
Karats Wir können es sehen, wenn wir die Zeilenbearbeitung so
erzwingen , dass das Karat
auch ohne Fokus angezeigt wird. Wenn wir die Zeilenbearbeitung für
geheime Informationen
wie ein Passwort verwenden , können
wir „geheim“ einschalten, und jedes Zeichen
wird
als das hier
angegebene geheime Zeichen gezogen . sind
auch die Optionen
Graphem aus Karat und BD Für
komplexere Schriftsysteme
außerhalb des römischen Alphabets sind
auch die Optionen
Graphem aus Karat und BD verfügbar außerhalb des römischen Alphabets Für mein Spiel verwende ich
den Platzhaltertext als
Name Deines Schiffes mit einer maximalen Länge von 16 Zeichen und lasse das Feld erweitern, um den Text
aufzunehmen Ich behalte das rechte
Symbol als Feder bei, wähle den gesamten Text im Fokus aus und
aktiviere das leere Karat Davon abgesehen sind
die restlichen Optionen
standardmäßig in Ordnung den Stammknoten auswählen, damit
wir den Theme-Editor sehen können, fügen
wir dem Thema die
Zeilenbearbeitung hinzu Im Bereich Farbe
können wir die Farbe des
Karats und der Löschtaste
wie gewohnt ändern Karats und der Löschtaste und drücken. Wir können die
Schriftfarbe von normalem Text,
Platzhaltertext, ausgewähltem Text
und nicht bearbeitbarem Text
sowie die
Konturfarbe aller Texte
und die Farbe des Felds ändern Platzhaltertext, ausgewähltem Text und nicht bearbeitbarem Text , das hinter dem ausgewählten Text
gezeichnet wird hinter dem ausgewählten Text
gezeichnet Im Bereich Konstante können
wir die
Breite des Karats ändern, die minimale
Zeichenbreite für
das Feld Zeile****,
gemessen in MS,
und die Dicke
des Schriftumrisses
festlegen das Feld Zeile****,
gemessen in MS, und die Dicke
des Wie bei allem, was Text können
wir die
Schriftart und Schriftgröße ändern, aber ich werde sie als
Standard für das Thema belassen und wir können das für die Schaltfläche zum Löschen
verwendete Symbol überschreiben. Die
Farben der durchsichtigen Schaltflächen werden
als Modulation für
diese Icon-Textur verwendet . Schließlich können
wir im Bereich „Stil“ Stilfelder
dafür bereitstellen, wie die Linienbearbeitung
normalerweise aussieht , wenn sie im Fokus ist
und wenn sie schreibgeschützt ist. Ich verwende den Stil Box
Flat für normal. Klicken Sie dann darauf, um es zu bearbeiten, fügen Sie meine üblichen sieben
Pixel an Ecken, und Inhaltsrändern hinzu. Ich habe dieselbe Farbe wie der Hintergrund mit einer
dunkleren Randfarbe. Dann dupliziere ich
das Stilfeld flach zur Fokusoption, mache es einzigartig und
öffne es dann zur Bearbeitung. Wenn der Fokus gesetzt ist, ändere ich den Rand in eine hellere
Farbe und füge einen Schatten hinzu. Wir können in der Themenvorschau sehen, wie unsere Änderungen
aussehen. Nur zum Lesen, ich
verwende einfach ein leeres Style-Feld. Lassen Sie uns auch den
Grid-Container zu unserem Thema hinzufügen. Genau wie die horizontalen und
vertikalen Box-Container hat
der Grid-Container nur Konstanten für seine
Themeneigenschaften, die Anzahl der Pixel, die
seine Zeilen und Spalten trennen Vergiss nicht zu testen,
wie deine Änderungen aussehen, indem du dein Spiel ausführst Wir haben jetzt unseren Line-Edit-Node so konfiguriert, dass er der
Ästhetik unseres Spiels entspricht. Und in der nächsten Lektion kann der Spieler ein neues Schiff
kaufen. Wir sehen uns in der nächsten Lektion.
31. Optionsschaltfläche: Hallo Freunde. In
der vorherigen Lektion haben wir dem Spieler erlaubt, den Namen seines Schiffes zu
ändern. In dieser Lektion lassen wir den
Spieler ein neues Schiff kaufen. Ich werde nur
eine sehr ähnliche Zusammenstellung
von Informationen auf der rechten Seite
dieses Panel-Containers neu erstellen und die Statistiken
eines Schiffs-Upgrades
anzeigen, die Statistiken
eines Schiffs-Upgrades
anzeigen das zum Kauf
verfügbar ist beginne mit einem
vertikalen Kistencontainer,
dem ich zum Verkauf stehende Schiffe nenne und
dann beide in
eine horizontale Kiste lege, dann beide in
eine horizontale Kiste lege um sie Seite an Seite zu
organisieren Wenn beide
untergeordneten Notizen ausgewählt sind und sie
aufgefordert werden, horizontal zu
expandieren, teilen
sie sich den
verfügbaren Speicherplatz gleichmäßig auf Innerhalb von zum Verkauf stehenden Schiffen kopiere
ich die
Labeltextur „Wrack Grid Container und alle zugehörigen Labelknoten Ich lasse die
zum Verkauf stehenden Schiffe vertikal zur Mitte hin
verkleinern , damit sie
dem Layout auf der linken Seite entsprechen dem Layout auf der linken Seite Ich ändere das Etikett dahingehend
, dass Schiffe zum Verkauf stehen. Aber ich ändere den Namen in Kosten, ändere das linke Etikett
in ein Rechteck mit Textur
und verwende mein Münzsymbol anstelle von
Text, und verwende mein Münzsymbol anstelle von um anzuzeigen, dass es sich um den Kaufpreis
handelt. Ich stelle es so ein, dass es
proportional zur Breite passt und das Seitenverhältnis so beibehalte , der Höhe
des Knotens auf der rechten Seite
entspricht. Ändern Sie das dann wieder in den normalen Label-Knoten und füllen Sie
es mit einer Beispielnummer Verschieben Sie diese dann an den
unteren Rand des Rasters. Ich werde dann auch unten eine Schaltfläche hinzufügen , damit der
Spieler dieses Schiff kaufen kann. Und schrumpfe es
horizontal zur Mitte , damit es dem Layout
entspricht Es macht vielleicht nicht viel Sinn, nur einen Chip zum Verkauf anzubieten, also ändere ich den
Schiffstyp in eine Optionsschaltfläche Dies ist eine Schaltfläche
, die dem Spieler mehrere
Optionen zur Auswahl bietet. Diese Optionsschaltfläche erbt ihre
Themeneigenschaften von Mir geht es gut, mein
Button-Design für die Kaufen-Schaltfläche zu verwenden, aber ich möchte, dass die
Optionsschaltfläche einen
anderen Stil hat den Stammknoten auswählen
, um den Theme-Editor zu sehen, fügen
wir dem Theme eine
Optionsschaltfläche hinzu. Auf diese Weise können wir
die Theme-Eigenschaften überschreiben , die
die Optionsschaltfläche von der Schaltfläche
erbt Die meisten Designeigenschaften
für die Optionsschaltfläche sind identisch mit denen
des normalen Schaltflächenknotens, sodass wir die Schrift- und
Symbolfarben aller
Schaltflächenstatus
ändern Symbolfarben aller
Schaltflächenstatus Schriftkonturfarbe, Schriftart
und Schriftgröße Felder für
Schriftkonturfarbe, Schriftart
und Schriftgröße sowie Stil für die einzelnen
Schaltflächenstatus. Ich verwende den Stil Box Flat für mein Optionsfeld und lasse es genauso aussehen wie
den Zeilenbearbeitungsknoten. Duplizieren Sie dann dieses
Stilfeld, um es zu drücken, machen Sie es einzigartig und ändern die Rahmenfarbe in
einen helleren Farbton. Verwenden Sie es, um den Mauszeiger zu bewegen, den Mauszeiger zu
drücken und zu fokussieren. Dann verwende ich einfach ein leeres
Style-Feld für Deaktiviert. Wir können im
Theme-Vorschaufenster sehen, wie unsere
Änderungen aussehen ,
ohne das Spiel zu starten. Im Bereich Symbole können
wir das
Aussehen des Abwärtspfeils ändern , indem wir
ein anderes Symbol angeben. Genau wie bei den Popup-Menüs ist
dieses Symbol 16 Pixel im Quadrat groß
und wird nicht in der Größe verändert.
Es ist wichtig, dass das Symbol, durch das Sie es
ersetzen, die
richtige Es gibt auch eine
Designeigenschaft für ein Symbol , das links neben dem Text auf
der Schaltfläche gezeichnet wird Ich füge einfach ein weiteres Symbol hinzu , um dir zu zeigen, wie
das aussieht. Im Bereich Konstante
gibt es eine Eigenschaft, mit der Sie
die Größe der Schaltfläche so einstellen können, dass sie dem größten Stilfeld
entspricht größten Stilfeld falls Ihre
Stilfelder unterschiedliche Größen haben. Dies funktioniert, wenn mein
Optionsfeld deaktiviert ist, da das leere Stilfeld kleiner
ist als der Rest. Der Pfeilrand gibt an,
wie viele Pixel sich zwischen dem Abwärtspfeil und
der rechten Seite der Schaltfläche befinden. horizontale Abstand
gibt an, wie viel Abstand
zwischen dem Symbol auf der linken Seite
und dem Text der Schaltfläche besteht . Die maximale Breite des Symbols kann
verwendet werden , um die Größe
des linken Symbols zu begrenzen. Es hat keine Auswirkung
auf den Abwärtspfeil. Pfeil modulieren: Wenn ein
anderer Wert als Null angegeben wird, modulieren
wir das Pfeilsymbol
mit der Schriftfarbe
des Button-Textes in all
seinen verschiedenen Schaltflächenzuständen Und die Umrissgröße zeichnet wie wir wissen,
einen Umriss um
den Text Ich möchte das linke Symbol nicht
für mein Spiel
verwenden , also lösche ich es. den
Optionsknotenpunkt auswählen, schauen wir uns seine
Eigenschaften im Inspektor an. Der Bereich mit erweiterbaren
Elementen funktioniert genauso wie der, den wir
zum Erstellen unserer Popup-Menüs verwenden Also füge ich für
jedes Schiff in meinem Spiel einen Gegenstand hinzu. Jedem Gegenstand kann auf Wunsch
ein Symbol zugewiesen, deaktiviert oder als Trennzeichen verwendet werden. Die ID-Nummer wird
verwendet, um zu identifizieren , welcher Eintrag in der Liste gerade ausgewählt
ist. Wenn diese Option negativ
ist, ist kein Element ausgewählt. An längstes Objekt anpassen“ wird
die Größe der gesamten Schaltfläche so
angepasst, dass sie dem Element
mit dem längsten Text am besten entspricht. deaktiviert ist, wird die Größe der
Schaltfläche
so angepasst, dass sie nur an den Text
des ausgewählten Elements Und mit der
Option „Erneute Auswahl zulassen“ kann der Spieler dasselbe Objekt auswählen, das bereits ausgewählt
ist, wodurch das ausgewählte Signal ausgegeben sind auch viele der gleichen Optionen verfügbar, die wir von der
Schaltfläche und der Basistaste übernommen haben , die wir bereits untersucht haben Es ist klar, dass jedes meiner
Schiffe eine andere Immobilie
benötigt,
ihren Kaufpreis. also zu ScriptView wechsle, füge
ich
dem Schiffsskript eine Variable für
den Schiffspreis Denken Sie daran, das Skript zu speichern. Geben Sie dann jeder Schiffsressource einen anderen Wert
für ihren Preis. Ich benenne meinen Button in By um. Lassen Sie uns das Signal „Bei
gedrückter Taste“ mit dem
Schiffsmanager-Skript verbinden . Und auch das
Signal, das mit der Optionstaste ausgewählt wurde. Es gibt auch ein Signal
, das ausgegeben wird , wenn ein Element im
Popup-Menü aktiviert ist, falls Sie es benötigen. Genau wie wir es mit den Schiffsinformationen der
Spieler gemacht
haben, füllen wir die
Informationen auf der rechten Seite des Bildschirms
mit den Informationen über das Schiff aus,
das auf
der Optionsschaltfläche
anhand seines Index ausgewählt wurde Optionsschaltfläche
anhand seines Index Wir müssen also Verweise auf die
Optionsschaltfläche mit
der zerstörten Textur
und die Labelknoten
sowie die By-Schaltfläche
speichern Optionsschaltfläche mit
der zerstörten Textur
und die Labelknoten
sowie die By-Schaltfläche und die Labelknoten
sowie die Da ich all
diese Knoten
in einen horizontalen Box-Container sortiert habe , sind
all diese Pfade nicht mehr gültig Ich könnte alle
meine Knoten umbenennen, sodass sie
eindeutige Namen haben und
eindeutige Namensreferenzen verwenden, aber ich füge stattdessen einfach den horizontalen Box-Container
zum Pfad hinzu. Wir können fast alle
Codezeilen
von der Aktualisierung der
Schiffsinformationen des Spielers in die
Funktion für
den ausgewählten Typ kopieren Aktualisierung der
Schiffsinformationen des Spielers in den ausgewählten Typ , um
die Informationen über
das zum Verkauf stehende Schiff zu aktualisieren , einfach
den Array-Index auf
den Index des ausgewählten Schiffs
ändern . Das funktioniert nur, wenn die
Array-Indizes des
Schiffs-Arrays den ID-Nummern
der Objekte im Popup-Menü der
Optionsfelder übereinstimmen. Wir können
dies garantieren, indem wir
die Optionsfelder
selbst aus diesem Skript generieren . Indem wir die Ready-Funktion
außer Kraft setzen, können wir jedes
der Schiffe im Schiffsarray durchgehen der Schiffe im Schiffsarray dann ein Objekt zur
Optionsschaltfläche hinzufügen ,
nämlich den Schiffstyp Da das Schiffs-Array von Null an
indexiert wird und jedes Objekt
dem Optionsfeld
hinzugefügt wird
, stimmen die ID-Nummern exakt überein müssen wir aber
alle Gegenstände aus
der Optionsschaltfläche entfernen und Damit das funktioniert, müssen wir aber
alle Gegenstände aus
der Optionsschaltfläche entfernen und das Spiel leer
starten lassen Wenn ein neues Spiel gestartet
oder ein Spiel geladen wird, rufen
wir den Index des
Schiffes ab, das der Spieler bereits besitzt. Ich möchte
dem Spieler nicht erlauben, dasselbe Schiff zu kaufen, das er bereits besitzt oder eines, das von geringerer Qualität ist. Ich zähle also von Null bis zur Größe
des
Schiffsarrays und deaktiviere jeden Gegenstand, dessen
Indexnummer
kleiner oder gleich dem aktuellen Schiffsindex des
Spielers ist. Ich wähle dann
das nächste Upgrade dem Spieler
zur Verfügung steht
, falls es eines gibt. Wenn das aktuelle Schiff des Spielers
die letzte Indexnummer
der Schiffs-Reihe ist , gibt es keine Upgrades mehr Deshalb sage ich der Optionsschaltfläche
, eine negative Zahl auszuwählen, und alle Optionen
werden deaktiviert. Andernfalls kann mit der
Optionsschaltfläche das Objekt ausgewählt , dessen Index um eins höher ist als der
aktuelle Schiffsindex des Spielers. Da ich die Auswahl
eines negativen Werts zulasse, ist
das natürlich
kein gültiger Array-Index Deshalb muss ich der
Funktion bei
Typ Wert ausgewählt eine
Bedingung hinzufügen, um dem gerecht zu werden. Und entfernen Sie stattdessen alle
Informationen. Das Letzte, was ich tun möchte,
ist den Kaufen-Button zu deaktivieren, wenn der Spieler nicht genug Geld
hat , um das aktuell
ausgewählte Schiff zu kaufen. Ich schnappe mir einen Verweis auf
den Goldzähler des Spielers. Ich setze einfach den Wert
von Buy Dot disabled auf das Gegenteil von
Gold Dot hat genug übergebe den Wert des
aktuell ausgewählten Chips Diese Funktion gibt es nicht, also wechseln wir zum
Counter-Skript und fügen es schnell hinzu. die Definition von Ausgaben kopieren, müssen
wir einfach herausfinden,
ob
die Menge der Ressource
größer oder gleich dem fraglichen
Betrag ist . Solange ich hier bin, werde ich
die Eingabefunktion auskommentieren , damit ich
schummeln kann, um mehr Geld zu bekommen Wenn wir abschließend auf „Kaufen“ klicken, rufen
wir Gold Dot Spend auf, geben den Preis
des aktuell
ausgewählten Schiffs zum Verkauf
weiter . Wenn wir das in
eine I-Anweisung einfügen, können wir darauf reagieren, ob
der Spieler genug
Gold dafür hat oder nicht der Spieler genug
Gold dafür hat Das sollte niemals passieren,
da wir
die Schaltfläche präventiv deaktiviert haben, wenn
sie nicht genug Gold haben,
aber es ist in Ordnung, Redundanz zu
haben Wenn die Transaktion erfolgreich
war, setzen
wir den
aktuellen Schiffsindex des Spielers
auf das aktuell ausgewählte Schiff auf das aktuell Aktualisiere dann auch die
Schiffsinformationen des Spielers und die zum Verkauf stehenden Schiffe. Andernfalls drucke ich
eine Fehlermeldung aus , damit ich
weiß, dass das passiert ist. Wenn Sie den ausgewählten Index
der Optionsschaltfläche
über unser Skript festlegen , wird
das Signal für das ausgewählte Element nicht ausgelassen. Stattdessen können wir unsere
Funktion aber auch einfach direkt aufrufen. Wenn wir den ausgewählten
Index übergeben, setzen wir ihn einfach auf. Beim Starten des Spiels beginnt der
Spieler mit einem Kutter und der Fang
wird zum Verkauf angeboten. die Optionstaste erweitern, darf
der Spieler keinen weiteren Kutter kaufen, kann
aber auch den Schoner
sehen Beim Kauf des Fangs werden die Schiffsinformationen
des
Spielers aktualisiert und der Schoner
wird zum Verkauf angeboten die Optionsschaltfläche erweitern, ist
der Schoner jetzt
die einzige Wenn ich mir mehr Geld gebe, wähle
ich den Schoner erneut aus, um den
Kaufen-Button zu aktivieren Wenn wir ihn kaufen,
stehen jetzt keine Schiffe mehr zum Verkauf. Ich sollte auch
den Kaufen-Button deaktivieren , wenn
es nichts zu kaufen gibt. Wir haben jetzt Schiffe zum Verkauf, die der Spieler
als Upgrade kaufen kann. In der nächsten Lektion werden wir
mehrere verschiedene
Informationsseiten erstellen mehrere verschiedene
Informationsseiten , zwischen denen der
Spieler wechseln kann. Wir sehen uns in der nächsten Lektion.
32. Horizontaler geteilter Behälter: Hallo Freunde. In
der vorherigen Lektion haben wir dem
Spieler erlaubt,
größere und bessere Schiffe zu kaufen . In dieser Lektion
ermöglichen wir dem Spieler, die Größe
von Bereichen des Spielfensters
zu ändern Diese
Schiffsverwaltungsseite aus meinem Spiel ist klar in zwei
Informationsbereiche unterteilt aktuelle Schiff
des Spielers und Schiffe, die der
Spieler kaufen kann in einem
horizontalen Kastencontainer angeordnet sind in einem
horizontalen Kastencontainer angeordnet und nehmen
nicht den gesamten
Platz ein, der für sie vorgesehen ist. Sie werden
also erweitert, um den Raum gleichmäßig
aufzuteilen In Fällen wie diesem
gibt es einen Kontrollknoten, den wir verwenden
können, um dem Spieler
mehr Kontrolle über das Layout zu geben, sodass er
die Größe der Aufteilung eines Raums zwischen zwei
Kontrollknoten ändern kann, einen geteilten Container Geteilte Container können
horizontal oder vertikal sein, können
aber nur zwei
untergeordnete Knoten haben. Dadurch wird
der verfügbare Platz zwischen
ihnen aufgeteilt der verfügbare Platz zwischen und der
Spieler kann ihn auch anpassen Wenn ich diesen Knoten umbenenne, werden
alle meine Knotenpfade unterbrochen. Also lasse ich
den Namen einfach so wie er ist. Es sieht nicht so aus, als ob sich
etwas geändert hat, aber wenn wir das Spiel starten und
die Maus über die Mitte
des Spielfensters bewegen,
gibt es jetzt eine Leiste, auf die
wir klicken können, um sie zu greifen und nach links oder
rechts zu ziehen, um die Größe jeder Seite zu ändern Jede Seite darf nur
bis zu dem Punkt schrumpfen, an dem ihre eigenen untergeordneten
Kontrollknoten nicht weiter zusammenbrechen
können den horizontal
geteilten Container auswählen, schauen wir uns seine
Eigenschaften im Inspektor an Der Offset für die Teilung kann verwendet werden
, um die Position
der Teilung anzupassen . Dabei steht Null
für die Position, an der sie sich von Natur aus hinter dem
ersten untergeordneten Kontrollknoten befinden
würde.
Negativ bewegt sich nach links und
Positiv bewegt sich nach rechts. Zusammengeklappt“ wird
der Offset der Teilung ignoriert, der erste
untergeordnete Kontrollknoten und der
Splitt wird unmittelbar danach positioniert. Sichtbarkeit des Ziehers kann
verwendet werden, um den Dragger auszublenden,
sodass er unbrauchbar wird, oder er kann sowohl ein- als auch ausgeblendet Die Sichtbarkeit des Ziehers kann
verwendet werden, um den Dragger auszublenden,
sodass er unbrauchbar wird, oder er kann sowohl ein- als auch ausgeblendet
werden, wodurch
der Pixelabstand
zwischen den untergeordneten Knoten aufgehoben wird. der Pixelabstand
zwischen den untergeordneten Knoten aufgehoben wird den Wurzelknoten auswählen, sodass
wir den Theme-Editor sehen können, können
wir den horizontal
geteilten Container zu unserem Theme hinzufügen Im Bereich Konstante können
wir das automatisch
ausgeblendete Verhalten des
Grabbers entfernen , indem wir
den Wert auf Null setzen, wodurch der
Grabber immer sichtbar wird minimale Grabdicke
ist die Pixelbreite oder -höhe des anklickbaren Bereichs, der generiert wird, dass er
den Grabber umgibt, da die Grabber-Symbole normalerweise sehr dünn
sind
und der Abstand die Anzahl der
Pixel ist, die die beiden untergeordneten Kontrollknoten da die Grabber-Symbole normalerweise sehr dünn
sind
und der Abstand die Anzahl der
Pixel ist, die die beiden untergeordneten Kontrollknoten voneinander trennen Im Bereich mit den Symbolen gibt es drei
verschiedene Grabber-Symbole, aber wir müssen nur das oberste Symbol
ändern Die horizontalen und vertikalen
Grabber sind Eigenschaften
der übergeordneten Klasse
Split Container und werden von diesem
horizontal geteilten Container-Node nicht verwendet Ausführen des Spiels können wir
sehen, dass sich der Grabber nicht
mehr automatisch versteckt, wenn
die Maus ihn nicht berührt Der Bereich,
der die beiden untergeordneten Knoten voneinander trennt ist breiter als zuvor, ebenso wie der anklickbare Wir haben unseren Randcontainer jetzt in zwei Bereiche aufgeteilt, deren
Größe verändert werden kann. In der nächsten Lektion geben
wir dem Spieler mehrere Informationsseiten denen er wechseln kann Wir sehen uns in der nächsten Lektion.
33. Tabulator-Container: Hallo Freunde. In
der vorherigen Lektion haben wir dem Spieler erlaubt, die
Größe eines Teils des Spiels zu ändern In dieser Lektion werden wir
zulassen, dass das Spiel mehrere verschiedene
Informationsseiten
anzeigt Mein Spielfenster
sieht jetzt voller aus, und ich könnte nicht mehr
Mechaniken
einbauen, ohne den Spieler damit
zu
überfordern , dass zu viele Informationen
auf einmal angezeigt werden. Um dieses Problem zu lösen,
machen wir den Knoten, der
sich unter der
Menüleiste befindet, zu einem Tab-Container. Aus der Beschreibung geht hervor
, dass der Tab-Container für
jedes untergeordnete Steuerelement eine Registerkarte erstellt, in der jeweils nur eine
angezeigt
wird . Der Schiffsknoten wird zu einem
untergeordneten Element des Tab-Containers. Es wird zu einem Tab innerhalb
des Tab-Containers. Ich werde mehrere weitere Tabs hinzufügen, indem ich dem Tab-Container weitere
untergeordnete Tabs
hinzufüge. Sie alle werden
Margin-Container sein. Ich werde einen haben, damit der Spieler die Besatzung seines
Schiffes verwalten kann, einen anderen für den Kauf
und Verkauf von Fracht und einen für die Navigation
zu einem anderen Hafen Die vom
Tab-Container generierten Tabs können neu angeordnet
werden, indem
die Reihenfolge der untergeordneten Tabs geändert wird Mit der Neuanordnung
des Szenenbaums wird
das Schiffsmanager-Skript seinen Pfad zum
Goldressourcenzählerknoten
unterbrochen haben seinen Pfad zum
Goldressourcenzählerknoten
unterbrochen Ich kann das beheben, indem ich
dem Zähler einen eindeutigen Namen gebe und die
Prozentzeichen-Annotation
anstelle des Knotenpfads verwende anstelle des zur Two-D-Ansicht zurück und
wählen den Tab-Container wir zur Two-D-Ansicht zurück und
wählen den Tab-Container aus. Schauen wir uns nun
die Eigenschaften
des Tab-Containers
im Inspektor an. Die Tabs sind standardmäßig links ausgerichtet, können
aber auch
nach rechts oder in die Mitte verschoben werden. Sie können auch an
den unteren Rand des Tab-Containers verschoben werden . Aktuelle Registerkarte ist die
untergeordnete Indexnummer der Registerkarte, die
gerade angezeigt wird. Wenn es so viele
Tabs gibt, dass sie nicht alle über die gesamte Länge
des Tab-Containers passen, die zusätzlichen Tabs abgeschnitten
und es
werden Navigationstasten bereitgestellt der Spieler durch sie
blättern Wenn das Ausblenden von Tabs deaktiviert ist, wird der Tab-Container so erweitert, dass er
all seine Tabs aufnehmen kann Wenn Sie die sichtbaren Tabs ausschalten, wird die gesamte Tab-Leiste
ausgeblendet. Die Tabs existieren noch und
können per Skript verwendet werden, aber der Spieler wird sie nicht
anklicken können. Alle Tabs vorne können verwendet
werden, um all
deine Tabs über den Inhalt zu ziehen statt darunter. Ich werde später zeigen, wie
das aussieht. Wenn „Ziehen zum Neuanordnen“ aktiviert ist, kann
der Spieler auf die Tabs klicken
und sie ziehen, um ihre Positionen
in der Tab-Leiste neu anzuordnen Wenn diese Einstellung
aktiviert ist und mehrere
Tab-Container sichtbar
sind
und Sie möchten, dass der Spieler
auf mehrere
Tab-Container sichtbar
sind Tabs klicken und sie von einem Tab-Container zum anderen
ziehen kann , können Sie für alle
Tab-Container festlegen, dass sie dieselben Tabs haben
und
die
Gruppen-ID neu anordnen, um diese
gemeinsame Nutzung von Tabs zu ermöglichen Wenn
der Standardwert negativ ist, dürfen
Tabs nicht in einen anderen
Tab-Container verschoben werden anderen
Tab-Container verschoben Wenn die Option „Verwendete Tabs“ für
die
Mindestgröße deaktiviert ist, wird die Größe des Tab-Containers an
den Inhalt der
einzelnen ausgewählten Tabs angepasst wird die Größe des Tab-Containers an
den Inhalt der
einzelnen ausgewählten Tabs Wenn diese Option aktiviert ist,
hat jeder Tab die Größe
des größten Tabs Tab-Fokusmodus kann verwendet
werden, um zu steuern wie die Tabs in der
Tableiste den Fokus erhalten, wobei standardmäßig sowohl Maus
- als auch Tastatursteuerung Sie können darauf beschränken
, dass nur
Mausklicks zugelassen werden, um
der Tableiste den Fokus zu geben also die
Tabulatortaste auf der Tastatur oder die
Pfeiltasten drücken , kann
der Player den
Fokus nicht auf die Tableiste umschalten Wenn die Tableiste jedoch durch Klicken
fokussiert
wird, können die Pfeiltasten trotzdem
verwendet werden , um zwischen den Tabs zu navigieren, oder es können keine Tasten verwendet werden, um zu verhindern, dass die
Tab-Leiste den Fokus übernimmt. Der Spieler kann immer noch auf die Tabs
klicken, um zwischen ihnen zu
wechseln, aber sie werden nicht fokussiert, sodass die Pfeiltasten nicht zum Wechseln der Tabs verwendet
werden. Wenn die Option „Auswahl aufheben“ aktiviert
ist,
kann der Wert des
aktuellen Tabs auf einen
negativen Wert von eins gesetzt werden , sodass alle
Tabs nicht ausgewählt werden Nachdem ich die Eigenschaften
für meinen Tab-Container konfiguriert
habe, lasse ich ihn vertikal erweitern den
gesamten Bereich meines
Spielfensters ausfüllt den Stammknoten auswählen, damit
wir den Theme-Editor sehen können, fügen
wir dem Theme einen Tab-Container
hinzu. Ab dem Abschnitt mit den Symbolen können
wir die Symbole überschreiben, die für
die
Schaltflächen zum Inkrementieren und Verringern verwendet werden , mit denen der Spieler durch die
abgeschnittenen Tabs und
ihre hervorgehobenen
Gegenstücke
scrollt , die
angezeigt werden, wenn der Spieler mit der Maus über sie
fährt. Wir können auch die
Drop-Markierung, die beim
Ziehen und Ablegen eines Tabs zwischen den Tabs
angezeigt wird,
und das Menüsymbol ändern beim
Ziehen und Ablegen eines Tabs zwischen den Tabs
angezeigt wird, , wenn dieser Tab-Container mit einem Popup-Menü versehen
wurde, wenn dieser Tab-Container mit einem Popup-Menü versehen
wurde,
sowie dessen Markierung. Im Bereich Farben können
wir eine
Modulationsfarbe für den Drop-Marker angeben Eine Schriftkonturfarbe und
Schriftfarben für jeden Status
der Tabs in der Tab-Leiste. Bevor wir mit den
restlichen Themenoptionen fortfahren, lassen Sie uns das Spiel ausführen und sehen,
wie diese Einstellungen funktionieren. Da meine Tabs abgeschnitten werden, können
wir auf
die Schaltflächen zum Erhöhen und
Verringern klicken , um
durch sie zu navigieren Ich kann auf
Tabs klicken und sie ziehen,
um sie neu anzuordnen Die Drop-Markierung wird
gezogen und moduliert, um
anzuzeigen, wo die Tabs
positioniert werden, wenn ich die positioniert werden, wenn ich wird kein Menüsymbol
angezeigt, da diesem Tab-Container noch kein Popup-Menü
zugewiesen wurde kein Popup-Menü
zugewiesen Ich ändere die
Drop-Marker-Modulation wieder auf Weiß. Ich lösche jetzt die überschüssigen
Tabs in meinem Tab-Container. Wenn wir ein Popup-Menü als
untergeordnetes Element des Tab-Containers hinzufügen, wird kein neuer Tab generiert, da der Popup-Menüknoten kein Kontrollknoten
ist. Ich werde es als oberstes untergeordnetes Element
des Tab-Containers platzieren , um
die Sache zu vereinfachen. Und füge einfach ein Element in das Popup-Menü ein,
das besagt: Hallo, wenn wir ein Skript
an den Tab-Container anhängen, werde
ich dieses
Skript nicht in meinem Spiel behalten, also belasse ich
es einfach im
Hauptressourcenordner mit
dem Standardnamen. Wenn wir die Ready-Funktion außer
Kraft setzen, können wir die
Tab-Container-Funktion set pop up aufrufen, die ein
Popup als Argument akzeptiert Also können wir das
Get-Child mit dem
Child-Index Null übergeben , das oberste Kind, den
Popup-Menüknoten Als Nächstes wechsle ich zum
Ship Manager-Skript. Tabs können nicht nur
Text, sondern auch Symbole enthalten. Aber genau wie das Popup-Menü müssen
sie
über ein Skript hinzugefügt werden. Lassen Sie uns also eine
Variable exportieren, die das Symbol für
die Schiffsregisterkarten sein wird ,
als Textur mit zwei D, die wir
im Inspektor auffüllen können In der Ready-Funktion können
wir dann,
da wir wissen, dass es sich um ein direktes
Kind des Tab-Containers handelt, Get parent aufrufen, um auf den übergeordneten
Knoten dieses Knotens zu verweisen Rufen Sie dann die Funktion
des Tab-Containers auf, setzen Sie das Tab-Symbol und akzeptieren die Indexnummer des Tabs und die Icon-Textur
als Argumente. Also übergebe ich ihm den Index Nummer drei und die exportierte Textur. zum Theme-Editor
im Bereich Constant zurückkehren, können
wir diesem Symbol
eine maximale Pixelbreite zuweisen. Die Anzahl der Pixel,
die das Symbol vom
Text der einzelnen Tabs trennen , die Größe der Schriftkontur und Anzahl der Pixel des Randabstands an beiden
Enden der Tab-Leiste hinzugefügt
werden. Wie immer
ignoriere ich die Einstellungen für
Schrift und Schriftgröße und verwende
meine Standard-Designeinstellungen. Im Bereich Stil können
wir ändern, wie
der Tab-Container, Tab-Leiste und die Tabs dargestellt werden. Ich werde sie alle mit Box-Texturen im
unterschiedlichen Stil einrichten. Panel ist die Hintergrundfüllung
des Tab-Containers, in dem das
aktive Kind gezeichnet wird. Dies wird normalerweise
nahtlos mit dem
ausgewählten Tab-Stil dargestellt . Dieses Bild hat abgerundete Ecken, daher füge ich
Texturränder von 16 Pixeln hinzu. Ich kopiere das in den
Stil für den ausgewählten Tab, mache es
aber einzigartig,
da ich nicht möchte, dass die Tabs die abgerundeten
Ecken am unteren Rand haben. den Abschnitt mit der Unterregion erweitern dann auf die Schaltfläche Bereich
bearbeiten klicken, können
wir nur einen Teil des bereitgestellten Bildes verwenden , um
das Stilfeld zu
zeichnen Mit der Rasterausrichtung kann
ich
die unteren 16 Pixel abschneiden, um die abgerundeten Ecken zu
entfernen Jetzt sieht die ausgewählte Registerkarte so aus, als wäre sie
direkt mit dem Panel verbunden Ich werde auch die
unteren Texturränder entfernen. Dadurch werden der Text und
das Symbol auf der ausgewählten Registerkarte nach unten verschoben , sodass sie mehr so aussehen, als
ob sie sich über den anderen befinden. kopiere diese beiden nicht ausgewählten
und mache sie einzigartig Ich ersetze die
Textur durch eine dunklere, füge dann den unteren
Texturrand wieder ein und
verschiebe den Text und das Symbol nach oben Dann wiederhole den Vorgang für das
Hinzufügen verschiedener Texturen für Hard Focus und Deaktiviert Dem Hintergrund der Tableiste kann
auch ein Stilfeld zugewiesen werden, also verwende ich einen Schatten. Beim Ausführen des Spiels
haben wir jetzt eine stilisierte Tab-Leiste, und die Registerkarte „Schiff“
hat sogar ein Schiffssymbol Das Menüsymbol wird auf
der rechten Seite angezeigt, und wir können darauf klicken, um
ein Popup-Menü aufzurufen Ich habe nicht vor, dieses Menü für
irgendwas in meinem Spiel zu
verwenden ,
also werde ich es löschen. Entferne das Skript aus
dem Tab-Container und lösche das Skript aus
meinen Projektressourcen. Wenn Ihre Tabs sehr kunstvoll gestaltet sind und Sie
ihnen
Erweiterungsränder zuweisen, die so groß sind, dass sich mit dem Inhalt
der ausgewählten Registerkarte überschneiden, können
in
diesem Fall alle Tabs, die im Vordergrund stehen, verwendet werden, um alle Tabs vor
dem Inhalt der ausgewählten Registerkarte zu zeichnen dem Inhalt der ausgewählten Registerkarte Ich werde diese Änderungen
wieder so machen, wie sie waren. Wir haben jetzt mehrere Tabs , zwischen denen der Spieler
wechseln kann Im nächsten Abschnitt werden
wir weitere neue
Kontrollknoten verwenden, um mehr Mechaniken hinzuzufügen. Wir sehen uns
im nächsten Abschnitt.
34. Baum A: Hallo Freunde.
Im vorherigen Abschnitt haben wir dem Spieler erlaubt, sein Schiff
zu verwalten. In diesem Abschnitt ermöglichen wir es dem Spieler, seine Crew zu verwalten. zum Reiter Crew wechsle, füge
ich diesem Tab eine ähnliche
Knotenstruktur hinzu wie der Schiffs-Tab. Ich
beginne mit einem horizontal
geteilten Container, beginne mit einem horizontal
geteilten Container zwei vertikale
Boxen
enthält,
einen für die Crew, die der
Spieler derzeit hat,
und einen für
Leute, die er anheuern einen für die Crew, die der
Spieler derzeit hat, kann Beide erweitern sich horizontal und füllen den Raum vertikal aus. Dann füge
ich auf der linken Seite einen neuen Knoten hinzu, der als Baum bezeichnet wird
, und lasse Baum bezeichnet wird
, und lasse den Baum so erweitern, dass er
den Raum vertikal ausfüllt. Wenn wir den Stammknoten auswählen und uns
den Theme-Editor ansehen, sehen
wir hier einen Baum mit verschiedenen
Typen von Baumelementen,
darunter
Klartext, editierbarer Text, eine Checkbox, eine Rollbox und eine Liste mit Optionen Die letzten drei werden ebenfalls als untergeordnete Elemente eines
anderen Baumelements
sortiert Es gibt eine Bildlaufleiste, mit der Sie durch
die Baumelemente blättern
können , wenn der Baum
höher als der zugewiesene Bereich ist höher als der zugewiesene Elemente der übergeordneten Baumstruktur
können reduziert
oder erweitert werden , um ihre untergeordneten Elemente ein- oder
auszublenden Ich dachte, das wäre
eine nette Art, die Befehlskette für
die Besatzungsmitglieder
meines Schiffes darzustellen . Wenn Sie den Baum erneut auswählen, gibt es keine Möglichkeit,
ihn von hier aus mit Baumelementen zu füllen Das muss
über ein Skript geschehen. Da ich weiß, dass
der Szenenbaum
im Szenen-Tab des Gudo-Editors auf dieselbe Weise funktioniert, kann
ich
mithilfe von Basisknoten genau das, was ich in meinem Baum haben
möchte, neu erstellen mithilfe von Basisknoten genau das, was ich in meinem Baum haben
möchte der Spitze der
Hierarchie steht der Kapitän, gefolgt vom ersten Offizier, dem zweiten
und dem dritten Kumpel In alten Zeiten hatten sie vielleicht
auch einen vierten Kumpel. Ich kann diese Knoten neu anordnen, sodass der erste Partner die
Autorität über den zweiten,
dritten und vierten Partner hat , und jedem von ihnen weitere Kinder
hinzufügen Der zweite Kamerad ist für die Navigation
zuständig, er hat
also einen
Navigator, einen Steuermann, einen
Brelman, einen Topman und Matrosen also einen
Navigator, einen Steuermann, einen
Brelman, einen Topman unter Der dritte Offizier ist für Sicherheit und Kampf zuständig
. Sie haben
also den Bootsmann oder Bootsmann, einen Bootsbauer in modernem
Englisch, einen Zimmermann,
einen Chirurgen und einen Kanonier unter seinem Kommando . Und schließlich wäre der vierte
Offizier, falls es einen gäbe, für
Logistik und Ressourcen zuständig, also
würde er den Koch, den Metzger und den Geldbeutel befehligen Vielleicht möchte ich auch
zahlende Passagiere an
Bord des Schiffes zulassen zahlende Passagiere an
Bord des Schiffes Wenn ich ein Skript
an den Crew-Tab anhänge, exportiere
ich ein Symbol dafür, es mit dem
Crew-Symbol für mein Spiel und lege es als
Tab-Container-Tab-Symbol für diesen Tab in der Bereitschaftsfunktion genauso wie den Tab Schiff Dann suche ich mir einen Verweis auf
den Baumknoten. Schreiben wir eine Funktion, die dem Baum ein Element
hinzufügt. Wir können dem Baum ein Element
hinzufügen, indem dessen Funktion
create item
aufrufen, die optionale
Argumente für das übergeordnete Element
des zu erstellenden Elements und
die untergeordnete Indexnummer akzeptiert . diese
Argumente ignorieren,
wird dieses Element als Wurzel
des Baums erstellt Wenn wir
etwas an diesem Element ändern möchten, müssen
wir einen
Verweis darauf in
einer Variablen vom Typ Baumelement speichern einer Variablen vom Typ Baumelement Ich nenne es neues Objekt. Dann können wir die Funktion
„Text
festlegen“ für dieses neu erstellte Baumelement aufrufen , das eine
Spaltennummer und Textargumente erforderlich sind. Der Baum hat derzeit
nur eine Spalte, daher ist der Spaltenindex Null, und ich gebe den
Text, auf den ich
ihn setzen möchte , als Parameter
der Funktion ein. ich weiß, dass ich viele Baumelemente
haben werde, speichere
ich sie in einem Wörterbuch weise
dann dem Baumelement im Textindex das neue Element
zu. Um nun also den
Captain zum Baum hinzuzufügen, muss ich
nur meine Funktion
aufrufen und dabei den Namen des obersten untergeordneten Knotens des
Baums
übergeben. Wenn ich den Rest zum Baum hinzufügen möchte, muss
ich beim
Aufruf
von create item auch
das übergeordnete Baumelement angeben , sodass das ein weiterer
Parameter der Funktion sein kann. Wenn diese
Funktion für den Captain aufgerufen wird, ist das übergeordnete
Baumelement Null. Jetzt muss ich
die Hierarchie, die ich in meinem Szenenbaum
erstellt habe, durchqueren die Hierarchie, die ich in meinem Szenenbaum
erstellt habe, jedes Element dem Baum
mit dem richtigen Elternteil
hinzufügen. Das scheint kompliziert
, scheint kompliziert
, kann
aber mit Rekursion vereinfacht werden,
also
mit einer Funktion, die sich selbst aufruft Um es noch einfacher zu halten, werde
ich die rekursive
Logik vom
Hinzufügen eines Baumelements trennen und
dies in einer separaten Funktion tun,
die ich populate tree nennen werde Der erste Parameter
dieser Funktion
ist der aktuelle
Knoten im Szenenbaum,
und ich muss auch
das übergeordnete Baumelement kennen ,
falls es eines gibt Ich kann dann die
AD-Baumelement-Funktion aufrufen, indem ich den Namen
des Knotens als Text
spezifiziere und
das übergeordnete Baumelement weitergebe. Ich werde das dann in
einer lokalen Variablen speichern und
es von der
AdTree-Elementfunktion zurückgeben es von der
AdTree-Elementfunktion Mithilfe einer Vierschleife, um alle untergeordneten Elemente dieses
Knotens zu
durchlaufen, können
wir diese Funktion zum
Auffüllen der Baumstruktur einfach erneut auf dem untergeordneten Knoten aufrufen und ihm
das übergeordnete Baumelement zuweisen,
das
vom aktuellen Knoten generiert wurde Wenn der aktuelle Knoten keine untergeordneten Knoten
hat, wird
diese vierfache Schleife nicht ausgeführt Die Ready-Funktion
muss diesen Prozess nur einleiten, beginnend mit dem obersten untergeordneten Knoten des
Baums und ohne übergeordnetes Baumelement. Beim Ausführen des Spiels wird der
Baum
mit der exakten
Knotenstruktur aus dem Mycinbaum befüllt mit der exakten
Knotenstruktur aus dem Mycinbaum Jedes Element im
Baum kann ausgewählt werden und übergeordnete Elemente können
reduziert oder erweitert werden Lassen Sie uns den
Baumknoten auswählen und uns seine Eigenschaften
im Inspektor ansehen. Durch Spalten können dem Baum zusätzliche
Spalten hinzugefügt werden, sodass jedes Baumelement mehrere Texteinträge erhält,
einen für jede Spalte. Ich werde drei
Spalten für meinen Baum haben, in denen Rollen, Namen und Bezahlung angezeigt werden. Spaltentitel sind standardmäßig
ausgeblendet, können
aber
mit diesem Kontrollkästchen sichtbar gemacht werden. Erneute Auswahl zulassen gibt
das gewählte Signal erneut aus, wenn der Spieler auf
das ausgewählte Objekt klickt. Wir können dann ändern, ob
die rechte Maustaste zur Auswahl von Objekten verwendet
werden kann oder nicht die rechte Maustaste zur Auswahl von Objekten verwendet
werden kann „Suche zulassen“ ermöglicht es dem Spieler durch die drei
Elemente zu
navigieren, indem er tippt, der Text der einzelnen Elemente übereinstimmt. Beim Ausblenden werden die Pfeile zum
Einklappen oder Erweitern ausgeblendet, und wenn das rekursive Falten aktiviert wird, kann der Spieler die Umschalttaste
gedrückt halten , um Kinder
rekursiv zu erweitern oder einzuklappen Mit „Wurzel ausblenden“ wird
das Objekt im Wurzelbaum ausgeblendet. In meinem Fall
wäre das der Captain. Die Flaggen im Drop-Modus
können ändern, wie der Spieler Daten per
Drag-and-Drop in den Baum zieht, aber das würde den
Rahmen dieses Kurses sprengen Auswahlmodus kann ändern, ob der Spieler
ein einzelnes Objekt,
mehrere Objekte oder
eine Reihe des Baums auswählt mehrere Objekte oder
eine Reihe des Baums Horizontales und
vertikales Scrollen kann ebenfalls aktiviert oder deaktiviert Jetzt, wo mehrere Spalten
und Titel sichtbar sind, füge
ich
jeder meiner Spalten Titel hinzu, indem Funktion „
Spaltentitel festlegen“ der Baumstruktur
aufrufe Stellen Sie dann auch die letzte
Spalte so ein, dass sie nicht erweitert wird. Die Rollen- und
Namensspalten werden also den größten Teil
der Baumstruktur
einnehmen. Nachdem wir einen Verweis
auf das Datei-Popup-Menü gefunden
haben, müssen wir das Signal zum Zurücksetzen
der Datei mit
dem Crew-Manager-Skript verbinden , um
darauf zu reagieren, dass der Spieler entweder ein neues Spiel
startet oder
sein Spiel lädt, und
die verbleibenden zwei Spalten des Baums mit dem
Namen und
den Lohnsätzen der Mannschaft füllen die verbleibenden zwei Spalten des Baums mit dem
Namen und
den Lohnsätzen der Mannschaft Da die Baumbestandteile in einem Wörterbuch
gespeichert sind, wäre
es sinnvoll, auch die Besatzungsdaten
des Spielers in
einem passenden Wörterbuch
zu speichern Besatzungsdaten
des Spielers in
einem Vorerst werde ich
dieses Wörterbuch einfach so initialisieren, dass es bereits eine Stammbesatzung für
das Schiff
enthält , angefangen
beim Kapitän Jedes Besatzungsmitglied benötigt mehrere Informationen, damit sie
in einem anderen Wörterbuch gespeichert werden können, wodurch der Kapitän
einen Standardnamen und einen Lohnsatz von Null Gold Dann füge ich einen Navigator, einen Steuermann, einen Topman und einen Seemann hinzu,
jeweils mit einem Namen und einem Lohnsatz Zurück im Crew-Manager-Skript können
wir, wenn die Datei zurückgesetzt ist, wenn die Datei zurückgesetzt ist, den Baum mit den Besatzungsmitgliedern
des Spielers füllen, aber wir müssen möglicherweise auch diejenigen
löschen werden also
jede Rolle im Baum durchgehen und überprüfen, Wir werden also
jede Rolle im Baum durchgehen und überprüfen, ob die
Crew des Spielers diese Rolle innehat Rufen Sie dann eine weitere Funktion geben Sie den
Baum-Gegenstand an, den wir ändern, zusammen mit dem Namen und dem
Vergütungssatz,
in den wir sie
ändern mit leeren Werten , mit leeren Werten für den Fall, dass der Spieler diese Rolle
nicht hat diese Funktion schreiben und dieselben Parameter
akzeptieren, können
wir einfach den
Text des Baumelements
in den anderen Spalten so einstellen ,
dass er den übergebenen Werten entspricht. Jetzt wird der Baum automatisch mit den Namen und
Lohnsätzen der Besatzung des Spielers
gefüllt ,
aber ich möchte, dass die Gehälter des
Kapitäns leer
sind und ihr
Name editierbar Das
Element Baumwurzeln so einzustellen, dass es
in Spalte eins editierbar ist, ist mit einem Funktionsaufruf ziemlich
einfach Wenn ich dann
ein Teammitglied einfüge, lege ich den Text der
zweiten Spalte nur fest , wenn es sich bei dem
Element nicht um das Stammelement handelt Indem wir das
Signal „Objekt bearbeitet “ mit dem
Crew-Manager-Skript verbinden, können
wir darauf reagieren, dass der Spieler den Namen seines Kapitäns
bearbeitet Das liefert
uns keine Argumente, aber sie werden
in der Baumklasse gespeichert und können
mit Get-Funktionen abgerufen werden. Bei meinem Baum nur ein Baum-Objekt bearbeitet werden, sodass ich eigentlich nichts anderes wissen
muss als das, was der Spieler
für den Namen des Kapitäns eingegeben Wenn es nicht leer ist, ändere ich Namen
des Kapitäns in
den Speicherdaten des Spielers Oder wenn es leer ist, setze das Baumelement auf den Wert
zurück Das funktioniert, solange
jede Rolle einzigartig ist, aber ich möchte vielleicht einige Rollen
mit mehreren Besatzungsmitgliedern
haben mit mehreren Besatzungsmitgliedern In diesen Fällen
ändere ich den in meinen Speicherdaten
gespeicherten Wert von einem Wörterbuch, das ein Besatzungsmitglied
beschreibt, zu einer Reihe von Wörterbüchern, die
eine Liste von Besatzungsmitgliedern beschreiben Ich gebe dem Spieler
mehrere Matrosen und Top-Männer, um die grundlegenden
Segeloperationen des Schiffes durchzuführen, jeder mit eindeutigen Namen, aber ich lasse
ihren Lohn gleich weil mein Schiff Zurück im
Crew-Manager-Skript muss
ich beim Erstellen des Baums so
viele Baumelemente hinzufügen, wie die maximale Anzahl es
möglich ist,
die maximale Anzahl
doppelter Rollen, was ich
im Szenenbaum angeben werde,
indem ich X gefolgt von einer Zahl
zum Namen der Rolle hinzufüge. Wenn ich dann den Baum auffülle, suche
ich im Namen
des Knotens nach dem Buchstaben X und speichere ihn
in einer Variablen Wenn der Buchstabe X nicht gefunden wird, wird als Ergebnis
eine negative Zahl zurückgegeben Neue Variablen für
die Rolle und
Menge dieser Rolle deklarieren , die Rolle standardmäßig
den Knotennamen
und die Menge
standardmäßig eins verwendet,
wenn X gefunden wird, dann kann
ich diese Werte mithilfe
der Teilzeichenfunktion
aus dem Knotennamen herauslesen , wobei
die Rolle
vor X steht und die vor Rufen Sie dann Ad Tree Item mit den Variablen auf. das Hinzufügen eines Baumelements ist ein
neuer Mengenparameter erforderlich Wenn die
Menge größer als eins ist, muss der Glossareintrag für dieses Baumelement ein Array von Baumelementen
sein, ähnlich wie das Crew-Wörterbuch. Das Erstellen des
Baumelements kann
dann in einer Vierschleife erfolgen, bei der bis zur Menge
gezählt wird. Je nachdem, ob es sich um eine Menge handelt oder
nicht, können Sie entweder den
Glossareintrag für
den Artikel festlegen oder ihn
an die Artikelgruppe anhängen Ich möchte jedoch nicht, dass ein ganzer Haufen leerer Rollen
in der Baumstruktur wiederholt stelle ich die
Sichtbarkeit der Elemente in der Baumstruktur
so ein, dass sie nur für das erste Element
wahr dann für den Rest falsch Wenn das
Signal zum Zurücksetzen der Datei empfangen wird, muss ein
anderer Code ausgeführt werden,
je nachdem, ob es sich bei
der Rolle um ein Array handelt oder nicht. Wenn es sich um ein Array handelt und der Spieler diese Rolle
in seinem Mannschaftswörterbuch hat, entspricht die Anzahl dieser Rolle der Größe des Arrays. Iteration durch alle Rollen, die im Baum
verfügbar sind Wenn I kleiner als die Menge ist, das Baumelement
in der Indexrolle I kann das Baumelement
in der Indexrolle I mit
den Besatzungsdaten des Spielers
in denselben Indizes gefüllt werden den Besatzungsdaten des Spielers
in denselben Indizes Andernfalls sind sie leer. Und die Sichtbarkeit des Elements
kann auch auf true gesetzt werden, wenn entweder I Null ist oder I kleiner als die Menge
ist. wird also immer mindestens eine von
jeder Rolle angezeigt, auch wenn der
Spieler sie noch nicht hat. Beim Ausführen des Spiels können wir
sehen, dass dem Spieler jetzt mehrere Besatzungsmitglieder zugewiesen die den besten Rollen „Männer“ und „Seeleute Wir haben jetzt einen Baumknoten, der die Besatzung des Spielers
anzeigt. In der nächsten Lektion gehen
wir auf
die Themenoptionen ein, die
für den Baumknoten verfügbar sind. Wir sehen uns in der nächsten Lektion.
35. Baum B: Hallo Freunde. In
der vorherigen Lektion haben wir einen Baum verwendet, um die Crew
des Spielers darzustellen. In dieser Lektion werden wir uns mit
den Themenoptionen befassen, die
für den Baumknoten verfügbar sind. Vorher werde
ich
diesen Namensparameter jedoch in
Crewname ändern diesen Namensparameter jedoch in
Crewname , um
die Warnung zu löschen. Nachdem der Stammknoten ausgewählt ist, fügen
wir den Baumknoten
zum Thema des Spiels hinzu. Ab dem
konstanten Bereich können
wir festlegen, ob die horizontalen Linien
zwischen den einzelnen Baumelementen gezeichnet werden sollen, indem wir die Eigenschaft der Zeichenhilfe
auf Null oder nicht Null setzen. Das Gleiche kann für
die
Beziehungslinien gemacht werden , die die Beziehungen zwischen Eltern und Kindern
von Baumelementen deutlicher zeigen Beziehungen zwischen Eltern und Kindern . Die
Breite der Beziehungslinie kann hier geändert werden. Und wir können sowohl für
Beziehungslinien zwischen
Kindern als
auch für
Elternbeziehungen unterschiedliche Breiten angeben Beziehungslinien zwischen
Kindern als auch für
Elternbeziehungen Wir können auch die
übergeordnete Beziehungslinie von
nicht ausgewählten Beziehungslinien für Geschwister
trennen nicht ausgewählten Beziehungslinien für Geschwister indem wir einen Pixelrand hinzufügen der horizontalen Trennung handelt es sich die Pixel des
Abstands zwischen den Spalten des Baums
sowie um die linke Seite des Baums, sowie um die linke Seite des wenn
das Falten deaktiviert ist Zellen von
Baumelementen können in
allen vier Richtungen einen Randabstand
von Pixeln erhalten . Der Elementrand sorgt außerdem für einen zusätzlichen
Einzug links von drei Elementen Umrissgröße ist die Schriftkontur mit der
wir inzwischen sehr vertraut sind Scrollrahmen und die
Scrollgeschwindigkeit dienen nur dazu, das Verhalten
beim Scrollen per
Drag-and-Drop zu ändern, nicht das
natürliche Verhalten der Bildlaufleiste Deshalb werden wir sie nicht verwenden Wir können einen horizontalen
Pixelabstand
zwischen den Baumelementen und
der vertikalen Bildlaufleiste
sowie einen vertikalen
Pixelabstand
von der horizontalen
Bildlaufleiste hinzufügen , sowie einen vertikalen
Pixelabstand falls es einen gibt Und wir können den
Bildlaufleisten auch Ränder geben. vertikale Trennung
sorgt für eine Pixeltrennung zwischen den einzelnen Baumelementen. Baumelemente können
mehrere Schaltflächen enthalten, und wir können diese
Eigenschaft verwenden, um
den horizontalen Abstand
zwischen den Schaltflächen zu ändern . maximale Breite von Symbolen kann verwendet
werden, um
die Größe der für Baumelemente
bereitgestellten Symbole zu begrenzen . Ihre Höhe wird
automatisch
angepasst, Ihre Höhe wird
automatisch um
ihr Seitenverhältnis beizubehalten. Ich exportiere ein weiteres Symbol aus meinem Crew Manager-Skript und füge es der Wurzel
des Baums in Spalte eins hinzu, sodass der Spieler
deutlich sehen kann,
dass er den Namen
seines Kapitäns bearbeiten darf. Beim Ausführen des Spiels
hat der Name des
Kapitäns jetzt ein Symbol, das
dem Spieler anzeigt , dass
er bearbeitet werden kann. Zurück im Theme-Editor
im Bereich Farben
gibt es Schriftfarben für den Standardtext von Baumelementen, deaktivierten Schrifttext für ein Baumelement bearbeitet werden kann
oder ein Kontrollkästchen, aber auch deaktiviert ist, die Schriftkonturfarbe, die Schriftfarbe der
ausgewählten Baumelemente und auch die Schriftfarben für den
Spaltentitel Wir können hier die Farbe
der Richtlinien ändern, und wir können auch die Farbe
der
Beziehungslinien ändern und
unterschiedliche Farben für die
Beziehungen zwischen Kindern und Eltern
verwenden. Farbe der Ablageposition
ist die Farbe, angegeben wird, wo
Objekte abgelegt werden, die gezogen wurden, und die benutzerdefinierte
Schriftmarkierung von Schaltflächen wird nur für benutzerdefinierte Schaltflächen verwendet wenn die Maus darüber
bewegt wird Wir werden keine dieser Optionen
verwenden. Es gibt unterschiedliche Schrift- und Schriftgrößenoptionen für die Baumelemente und
die Spaltentitel, aber ich werde dafür weiterhin meine
Theme-Standardeinstellungen verwenden Im Bereich mit den Symbolen können
wir ändern, wie die Erweiterungs
- und Reduzierungspfeile aussehen, ebenso wie die Kontrollkästchen, wenn
sie aktiviert oder deaktiviert sind,
aktiviert oder deaktiviert sind und den Status
unbestimmt aktiviert oder deaktiviert sind und den Status
unbestimmt Hilfreich für Eltern, Elemente, die Listen
mit Checkboxen enthalten, wie untergeordnete Objekte zu
behandeln Listen
mit Checkboxen enthalten, wie untergeordnete Objekte zu So können Eltern
das unbestimmte Kontrollkästchen anzeigen um anzuzeigen, dass einige, aber nicht alle
Kinder Dieses Verhalten ist
jedoch nicht automatisch und muss über ein Skript gesteuert werden. Das
Symbol mit dem Auswahlpfeil
weist auf Optionsfelder hin
, die ein Popup-Menü anzeigen, und das nach oben zeigende Symbol wird für
Drehfelder verwendet , mit denen
Zahlen innerhalb eines Bereichs bearbeitet Der Spieler kann auf den Aufwärtspfeil klicken
, um den Wert zu erhöhen, oder auf den
Abwärtspfeil, um den Wert zu verringern Um diese verschiedenen
Arten interaktiver Baumelemente zu erstellen , gehe
ich zu meiner Funktion
Besatzungsmitglieder bevölkern Dann rufe ich in Spalte zwei, der Gehaltsspalte,
die Funktion
Set Cell Mode auf und
ändere ihren Modus Wenn der Wert von
Pay nicht leer ist, setze ich seine editierbare
Eigenschaft auf true Andernfalls setze ich es auf False. Jetzt können wir sehen, dass die drei
Gegenstände in der Gehaltsspalte
Checkboxen sind und nur aktiviert wenn der Spieler ein
Crewmitglied für diese Rolle hat Das Symbol für den Zellenmodus zeigt
nur ein Symbol ohne Text an. Benutzerdefiniert kann verwendet werden, um benutzerdefinierte Schaltflächen zu erstellen, aber das werden
wir nicht tun Wenn wir es auf den Bereichsmodus setzen, können wir damit
entweder
eine Optionsschaltfläche erstellen , indem wir
eine durch Kommas getrennte Liste von
Optionen als Texteigenschaft bereitstellen , oder
einen numerischen Bereich, der als Spinbox bearbeitet
werden kann Wir können die Bereichseigenschaften der
Spinbox konfigurieren ,
indem wir set range config aufrufen die Spalte, den
Minimalwert, Maximalwert und den Schrittwert angeben
und den aktuellen Wert festlegen, indem wir set range aufrufen, die Spalte und
der Wert als Float
bereitgestellt Wenn der Wert von Pay jedoch leer
ist, ändere ich den
Zellenmodus auf Zeichenfolge und
zeige ihn einfach als
leeren, nicht editierbaren Beim Ausführen des Spiels
kann der Spieler die Gehaltssätze seiner Besatzungsmitglieder
innerhalb
von einem
bis neun Gold pro
Tag ändern innerhalb
von einem
bis neun Gold pro , wobei in Schritten
jeweils ein Gold pro Klick angegeben Bei dieser Interaktion wird auch das
Signal
ausgegeben, dass der Baum bearbeitet wurde. Ich muss also überprüfen, ob es sich bei
dem Objekt, das bearbeitet wurde, um das Stammelement
des Baums handelt , bevor
ich den Namen des Kapitäns bearbeite. Ich muss hier auch einen
zusätzlichen Code schreiben, um den Gehaltssatz
des Besatzungsmitglieds
in den Speicherdaten des Spielers zu ändern Gehaltssatz
des Besatzungsmitglieds . Ohne die
Rolle oder den Array-Index
des Besatzungsmitglieds zu kennen ,
dessen Gehalt bearbeitet wurde kann ich nicht viel tun, außer
sie alle durchzugehen
und zu überprüfen, um welchen es sich handelt ich also
alle drei Elemente durchgehe, überprüfe
ich zuerst, ob es sich um
ein Array Wenn es sich nicht um ein Array handelt, sondern um
das Element, das bearbeitet wurde, lege ich die
Bezahlung dieser Rolle auf neuen Bereichswert fest,
der in eine Ganzzahl umgewandelt Wenn es sich bei der Rolle um ein Array
handelt, muss ich
dieses Array durchsuchen , bis ich das Objekt gefunden habe,
das bearbeitet wurde Jetzt erhalte ich den Array-Index, dem ich die Bezahlung des Besatzungsmitglieds in dieser Rolle
und
die Array-Indexnummer festlegen kann . Zurück im Theme-Editor,
im Style-Bereich, können
wir das
Style-Box-Panel ändern, das hinter dem Baum eingezeichnet ist. Ich verwende einfach ein leeres
Style-Feld, um es zu ignorieren. Ebenso wie der Fokusstil
, der über den
gesamten Baum gezogen wird, wenn er den Fokus hat
, den ich ebenfalls entfernen werde,
indem ich ihn auf leer setze. Wir können die
Stilfelder für die Titelschaltflächen
ganz normal ändern, wenn wir mit der Maus darüber fahren
und wenn sie gedrückt werden Ich möchte nicht, dass meine Titel
als Schaltflächen dienen, daher verwende ich dafür auch leere
Stilfelder Das einzige Stilfeld, das
ich für
meinen Baum verwenden möchte , ist, wenn ein
Baumelement ausgewählt wird. Also setze ich es auf
ein flaches Stilfeld, gebe ihm eine schattenhafte Farbe
mit abgerundeten Ecken und kopiere es in das
Stilfeld für den ausgewählten Fokus Der Baumknoten kann automatisch horizontale und
vertikale Bildlaufleisten
enthalten, sodass wir diese möglicherweise auch zum Thema
hinzufügen möchten Im Bereich mit den Symbolen können
wir Symbole
für das Inkrementieren und
Verringern im normalen
hervorgehobenen und gedrückten Zustand bereitstellen Verringern im normalen
hervorgehobenen und gedrückten Denken Sie daran, dass bei
der vertikalen Bildlaufleiste der Punkt
inkrementiert wird, der nach unten
zeigt Ich möchte diese
Schaltflächen nicht in meine Bildlaufleisten aufnehmen,
aber ich möchte sie verwenden, um
den anklickbaren Mausbereich zu definieren den anklickbaren Also füge ich sie als
Platzhaltertexturen und gebe ihnen eine Breite von
acht Pixeln, aber keine Daher
wird nichts von ihnen gezeichnet. Dann kann
ich im Stilbereich das
Scroll-Stil-Feld auf ein flaches Style-Feld setzen. Machen Sie daraus eine sehr
schmale schwarze Linie,
indem Sie links und rechts einen unsichtbaren Rand
hinzufügen. Ich kopiere das dann auch in
den Focus-Stil. Für den Grabber
mache ich die gleiche Farbe wie meine Buttons mit abgerundeten
Ecken und einem Schatten das in die
anderen beiden Stile kopiere, Wenn ich das in die
anderen beiden Stile kopiere, mache
ich sie einzigartig,
stelle die Farbe des
Glanzlichters heller
und der gedrückten Farbe dunkler Dieselben
Optionen sind auch für die horizontale
Bildlaufleiste
verfügbar. Wir haben unseren Baumknoten jetzt gestaltet, dass er der Ästhetik unseres
Spiels entspricht. In der nächsten Lektion werden wir es
dem Spieler ermöglichen, Besatzungsmitglieder einzustellen und zu
entlassen. In der nächsten Lektion sehen wir uns.
36. Bildlauf-Container: Hallo Freunde. In
der vorherigen Lektion
haben wir uns mit den Themenoptionen befasst, haben wir uns mit den Themenoptionen für den Baumknoten
verfügbar sind In dieser Lektion ermöglichen wir
dem Spieler, Besatzungsmitglieder einzustellen und zu
entlassen Ich beginne damit,
unterhalb des Baumknotens eine Schaltfläche mit der
Aufschrift Feuer hinzuzufügen und die Schaltfläche horizontal zur Mitte hin zu
verkleinern Verbinde dann das gedrückte Signal mit dem Crew Manager-Skript Wir können abfragen, welches
Element
aus dem Baumknoten ausgewählt wurde , und es in einer Variablen
speichern. Wenn nichts ausgewählt wurde oder wenn es sich bei dem ausgewählten
Objekt um den Kapitän handelt
, der in meinem Spiel
den Spieler selbst repräsentiert, dann
sollte das Drücken des Feuerknopfes nichts bewirken. Wenn also etwas
anderes als der Kapitän ausgewählt wurde, erhalte
ich die Rolle,
die ausgewählt wurde, als Text in Spalte 0
des ausgewählten Baumelements. Dann teile ich meine Logik danach auf ob die Rolle
mehrere Personen zulässt, entweder die Rolle aus
der Crew des Spielers lösche oder überprüfe, ob die Größe
der dieser Rolle
zugewiesenen Crew nicht Null ist, bevor ich
die Person mit demselben Index wie
der Array-Index des
ausgewählten Baumelements entferne die Person mit demselben Index wie
der Array-Index des
ausgewählten Baumelements Das ist nur notwendig
, weil die Rolle immer
noch als leerer Eintrag dargestellt wird, auch wenn dem Spieler niemand dieser Rolle
zugewiesen ist Nachdem ich das Besatzungsmitglied gefeuert
habe, kann ich einfach das Zurücksetzen der
Datei aufrufen, um
den Mannschaftsbaum mit den neuen
Informationen zu aktualisieren . Lass es uns ausprobieren. Wir können jedes
Besatzungsmitglied außer dem Captain entlassen. Der Versuch, leere
Einträge abzufeuern, bringt nichts. Im Skript zum Speichern der Daten entferne
ich die ursprüngliche
Crew mit Ausnahme des Kapitäns und initialisiere
die Arrays als leer Als Nächstes muss ich eine Liste mit
Leuten
erstellen, die nach Arbeit suchen
, die der Spieler einstellen kann Also füge ich auf
der rechten Seite dieses Fensters einen Rastercontainer und darunter
eine Schaltfläche mit der Aufschrift „
Einstellung verkleinern“ in die horizontale
Mitte Ich lasse den
Rastercontainer so erweitern, dass er
den Raum sowohl horizontal als auch vertikal
ausfüllt den Raum sowohl horizontal als auch vertikal
ausfüllt dem
Rastercontainer drei Spalten gebe, füge
ich zwei Labelknoten und ein Textur-Rect als
Spaltenüberschriften Benennen Sie sie und füllen Sie
sie mit ihrer Rolle, ihrem Namen und meinem Münzsymbol Ich lasse die Rollen
- und Namensschilder so weit wie möglich
vergrößern, sodass sie
den Platz ausfüllen, Gehaltsspalte bis zum Ende
zusammenklappen Ich muss
ein Skript schreiben, das dieses Raster mit
potenziellen Kandidaten
füllt Aber zuerst möchte ich mich nicht durch die
Menge an Speicherplatz
einschränken lassen . Ich brauche Scrollbalken
wie der Baum. Der Baumknoten beinhaltet automatisches
Scrollen. Aber wenn ich möchte, dass mein
Grid-Container scrollt, muss
ich einen weiteren
Knoten hinzufügen, einen Scroll-Container Der Scrollcontainer kann
nur einen untergeordneten Knoten haben, er so zuschneidet
, dass er in
sein Steuerrechteck passt. Falls
der untergeordnete Knoten nicht hineinpasst sein Steuerrechteck ,
bietet er Scrollbalken, die ich erweitern werde, um den dafür vorgesehenen Platz
auszufüllen Wir können die Auswirkungen
des Scroll-Containers sehen indem wir die untergeordneten
Knoten mehrfach duplizieren, sodass er nicht mehr vertikal
passt und solange Text hinzugefügt wird, bis er
nicht mehr horizontal passt den
Scroll-Container-Knoten auswählen, werfen
wir einen Blick auf seine
Eigenschaften im Inspektor Follow Focus weist
den Scroll-Container an,
die Scroll-Position
automatisch anzupassen , sodass
der Fokuskontrollknoten jederzeit
sichtbar bleibt . Sowohl der horizontale als auch der
vertikale Scrollmodus bieten mehrere Optionen. Die Standardoption Auto zeigt die
Bildlaufleiste
nur an, wenn sie benötigt wird, aber wir können sie so ändern, dass
sie entweder immer angezeigt oder nie angezeigt oder deaktiviert ist.
Wir erweitern den
Scroll-Container so, Wir erweitern den
Scroll-Container dass er
zu seinem untergeordneten Knoten
in dieser Dimension passt, dass er
zu seinem untergeordneten Knoten
in dieser Dimension passt,
sodass kein Scrollen mehr erforderlich
ist. Touch-Scrollen
kann eine tote Zone hinzugefügt werden , um
die Empfindlichkeit anzupassen den Scroll-Bereich erweitern, können
wir die
Standard-Scroll-Position entweder horizontal oder
vertikal um Pixel ändern
sowie die
Schrittweite oder -verringerung ändern, wodurch die
Scroll-Position verschoben wird,
wenn der Spieler auf diese Tasten
klickt Ich habe die Schaltflächen zum Inkrementieren und
Verringern aus meinem Bildlaufleistendesign entfernt Jetzt bin ich bereit, dieses Feld mit
potenziellen Besatzungsmitgliedern zu
füllen , die darauf warten, vom Spieler eingestellt zu werden Ich werde den Text in
meinen Spaltenüberschriften zentrieren, um zu
verhindern, dass sie vom Scrollcontainer abgeschnitten Also verbinde ich das Signal zum
Drücken der Einstellungstasten mit dem
Crew Manager-Skript Zuerst hole ich mir einen Verweis auf
den Grid-Container-Node. Ich muss auch alle
möglichen Rollen
kennen, die eingestellt werden können, die ich in einem Array speichere,
und eine Liste aller
zufälligen Personen, die ich generiere, die ich auch
in einem anderen Array speichere. Nachdem Sie
den Mannschaftsbaum generiert haben, legen Sie die möglichen
Rollen so fest, dass sie
der Reihe von Schlüsseln aus dem Verzeichnis der
Baumelemente entsprechen Kapitän und Passagier
aus den potenziellen Rollen
entfernt , die eingestellt werden können. Ich rufe dann eine
andere Funktion auf, um das höhere Raster zu füllen Das erste, was ich
tun werde, wenn ich
das höhere Raster auffülle , ist,
seinen Inhalt mit einer
anderen Funktion zu löschen seinen Inhalt mit einer
anderen Wenn das erledigt ist,
wiederhole ich das mehrmals, sagen
wir 15, und füge
eine neue Person zu der Liste
der Arbeitssuchenden eine neue Person zu der Liste
der Arbeitssuchenden Dieser Eintrag im Array
wird ein Wörterbuch sein, das eine Rolle, einen Namen
und einen Vergütungssatz
enthält, wobei der Name und der Vergütungssatz Labelknoten sind, mit
ihrem Klassennamen Punkt neu
initialisiert Bei der Rolle wird es sich um eine Checkbox handeln, der es sich um einen weiteren Knoten handelt, der von
button erbt Auf diese Weise kann der Spieler die Checkboxen aller Personen,
die einstellen möchte,
ankreuzen,
bevor er auf
die Schaltfläche „Einstellen“ klickt , um sie alle auf einmal
einzustellen Alle drei Knoten haben eine Texteigenschaft, die gefüllt werden
muss Ich gebe ihnen einfach
alle zufälligen Werte,
angefangen damit, dass es sich bei der Rolle eine zufällige Auswahl
aus möglichen Rollen handelt. Ich wähle einen zufälligen Namen
aus einer konstanten Reihe von Zeichenketten aus, genauso wie
ich die Schiffsnamen gemacht habe eine große Liste
potenzieller Namen in meinem Skript
in einem Regions-Tag
bereit , den ich
reduzieren kann , damit er
nicht im Weg ist. Für ihren Lohn verwende ich einfach eine zufällige Ganzzahl 1—9
, die in eine Zeichenfolge umgewandelt Alle drei Knoten können dem übergeordneten Raster als Kinder hinzugefügt
werden dem übergeordneten Raster als Kinder Das Löschen des Rasters
ist so einfach
wie das Durchlaufen der
Gruppe von Leuten, die nach Arbeit
suchen, und Q bei allen drei
Wörterbucheinträgen kostenlos
aufrufen und dann das Array löschen Wenn wir das jetzt ausführen, hat die
Checkbox kein Theme, sie
erbt ihre
Theme-Eigenschaften von Fügen wir also
dem Spieldesign eine Checkbox hinzu und lassen
es passender aussehen Ab dem Style-Bereich haben
Checkboxen alle die
gleichen Styles wie Buttons, die ich entfernen werde, indem sie alle auf „Style Box leer“ setze. Dann
gibt es im Bereich „Symbole neben demselben Symbol, das von der Schaltfläche
übernommen “
neben demselben Symbol, das von der Schaltfläche
übernommen wurde, aktivierte
und
deaktivierte Symbole , aktivierte
und
deaktivierte sowie eine Reihe von
Optionsfeldern Wie immer
belasse ich die Schriftart und
Schriftgröße, um die
Standardeinstellung für das Theme zu verwenden Dieselben Optionen für Schrift und
Symbolfarbe sind auch für das
Kontrollkästchen verfügbar wie für die Schaltfläche. Beachten Sie, dass die
Modulationsfarben der Symbole nur für die Symboleigenschaft gelten, nicht für die aktivierten oder
deaktivierten Kontrollkästchen Im konstanten Bereich, ausgerichtet auf das größte Stilfeld, mit dem wir bisher vertraut sind, ebenso wie die Konturgröße
und die maximale Breite des Symbols. Wenn Sie den vertikalen
Versatz aktivieren, wird die vertikale Position der Checkbox-Symbole um
einige Pixel nach oben oder unten verschoben. horizontale Trennung werden Pixel
Abstand zwischen dem Symbol des
Kontrollkästchen und seinem Text
hinzugefügt . Wenn das Kontrollkästchen sowohl
ein Kontrollkästchen als auch ein Symbol enthält, wird
die horizontale Trennung auf beide angewendet. Ich werde das Symbol
aus meiner Checkbox entfernen. Das sieht viel besser aus.
Zurück im Drehbuch, wenn der Spieler
auf die Einstellungsschaltfläche klickt, da mein Spiel
Regeln hat,
dass nicht mehrere Personen
in derselben Rolle sind, erstelle
ich eine Liste
aller Personen erfolgreich eingestellt wurden, und
eine Zeichenfolge für die Rolle. Nachdem ich
die Personen, die nach Arbeit
suchen, durchgegangen bin, gehe ich
durch alle Personen, die
eingestellt wurden, entferne sie
aus der Gruppe der
Arbeitssuchenden und aus der Gruppe der
Arbeitssuchenden aktualisiere
dann den Crewbaum In dieser For-Schleife überprüfe
ich, ob das Kästchen für die
Rolle der Person angeklickt wurde,
und wenn ja, stelle ich die Rolle so ein, dass es
der Text aus diesem Um zu wissen, ob diese
Person eingestellt werden kann, unterscheidet sich
die Logik, ob die Rolle
mehrere Personen zulässt oder nicht. Ich weiß
das anhand der Tatsache, ob es sich bei dem Verzeichniseintrag mit den drei Einträgen im Index
dieser Rolle um ein Array handelt. Rolle Wenn das
Crew-Wörterbuch des Spielers diese Rolle nicht
enthält, kann ich den Wert dieser Rolle auf diese Person festlegen und
so ein Wörterbuch mit Namen und
Gehaltssatz als Ganzzahl
erstellen . Wenn es sich jedoch um ein Array handelt, muss
ich
die Anzahl der
Personen, die dieser Rolle in der bestehenden Crew
des Spielers zugewiesen sind,
mit der maximal zulässigen Anzahl vergleichen Personen, die dieser Rolle in der bestehenden Crew
des Spielers zugewiesen bestehenden Crew
des Spielers . Und wenn sie noch Platz haben, fügen Sie diese neue
Person dem Array hinzu Wenn der Spieler entweder
keinen Platz für mehr von dieser Rolle hat oder die einzigartige
Rolle bereits besetzt ist, mache ich mit der
nächsten Person weiter, die nach Arbeit
sucht Wenn diese Person
erfolgreich eingestellt wurde,
löse ich alle Knoten, die ihr
zugeordnet sind, aus der Szenerie und füge
sie der Gruppe der
Personen hinzu, die eingestellt wurden Das reicht aus, damit der Spieler
diese Besatzungsmitglieder anheuern Versuche,
Besatzungsstellen einzustellen, die
bereits besetzt oder
ausgelastet sind , werden ignoriert Aber ich denke, es ist
wichtig,
die maximale Besatzungskapazität des aktuellen Schiffes
des Spielers durchzusetzen . Also schreibe ich eine
Funktion, die die aktuelle Besatzung
des Spielers zählt , eine Ganzzahl
zurückgibt, jeden Eintrag
im
Besatzungswörterbuch des Spielers durchläuft , wenn der Eintrag ein Array ist, die Größe des Arrays
addiert, andernfalls eins addiert und das Ergebnis
zurückgibt Wenn ich auf
die Einstellungsschaltfläche klicke, füge
ich eine Variable
für die maximale Besatzung Und bei jeder Iteration durch die Leute, die nach Arbeit
suchen, überprüfe
ich, ob der
Spieler
seine Crewkapazität erreicht hat , und breche aus der
Schleife aus, falls er es getan hat Ich muss
diese Informationen
vom aktuellen Schiff des Spielers abrufen vom aktuellen Schiff des Spielers diesen
Tabs also eindeutige Namen gebe, hole
ich mir
mit
dem Addon Ready einen Verweis auf den Schiffsmanager. Und fordere die Besatzungsgrenzen des
Spielers an, indem du das Maximum als
erstes Element einer Reihe festlegst. Das Schiffsmanager-Skript benötigt
dann eine Funktion
, die
ein Array mit zwei ganzen Zahlen
der aktuellen
Besatzungsgrenzen des Spielers zurückgibt. Es gibt
einfach ein Array
aus zwei Zahlen zurück, die
mit der minimalen Besatzung und der
maximalen Besatzung des aktuellen
Schiffes gefüllt die
mit der minimalen Besatzung und sind. Jetzt kann der Spieler nicht mehr Besatzungsmitglieder
einstellen, als sein
aktuelles Schiff aufnehmen kann. Der Spieler kann seine Crew jetzt von
diesem Crew-Tab aus
verwalten und verfügt über
Mechaniken für die Einstellung, Anpassung der Gehaltssätze und die
Entlassung von Besatzungsmitgliedern. Im nächsten Abschnitt werden wir es
dem Spieler ermöglichen , zu einem anderen Hafen zu
segeln. Wir sehen uns
im nächsten Abschnitt.
37. Radiotaste: Hallo Freunde.
Im vorherigen Abschnitt haben wir dem Spieler erlaubt, seine Crew
zu verwalten. In diesem Abschnitt
stellen wir ihnen
eine Karte mit verschiedenen Häfen zur Verfügung, zwischen
denen sie segeln können. Wie beim Crew-Tab wechsle ich zunächst
zum Karten-Tab, füge ein Skript hinzu,
nenne es Kartenmanager und speichere es im Ordner für
Manager-Skripte. Exportieren Sie dann ein Symbol als
Textur zwei D und legen Sie es als diese Registerkarte fest, indem Sie das Symbol „Tabs festlegen“ auf dem übergeordneten Element
dieses Knotens,
dem Tab-Container, aufrufen Tabs festlegen“ auf dem übergeordneten Element
dieses Knotens, , das Symbol als Argument übergeben und
das exportierte Symbol mit einem Kartensymbol füllen zurück zur Zwei-D-Ansicht wechsle, füge
ich dieser Registerkarte zunächst einen
vertikalen Box-Container
hinzu , einen Knoten
enthält, mit der Textur
einer Karibikkarte
gefüllt ist. Dieser wird so
eingestellt, dass er proportional
zu seiner Breite passt, sein Seitenverhältnis
beibehält
und erweitert wird, um
den Raum vertikal auszufüllen, und horizontal zur
Mitte schrumpfen. Auf dieser Karte füge ich
einen Kontrollknoten hinzu, der als Ordner
verwendet werden kann, um all meine Ports
aufzunehmen und ihn im
gesamten Wrack der Karte zu verankern. Anschließend stelle ich jeden
Hafen mit Kontrollkästchen dar,
angefangen bei Havanna, Kuba, dann Kingston Jamaica,
Porto Prince Haiti und Santo Domingo Diese Checkboxen sind
natürlich auf den Umschaltmodus eingestellt, sodass der Spieler sie aktivieren oder
deaktivieren kann,
aber ich möchte nur, dass sie jeweils ein Häkchen haben können ,
was bedeutet, dass es sich
um Optionsfelder was bedeutet Wir können Optionsfelder erstellen,
indem wir auf das Drop-down-Menü mit der Bezeichnung Button-Gruppe klicken und eine neue Button-Gruppe
erstellen Wir müssen mit
dieser Schaltflächengruppe nichts weiter
tun , als sie als Projektressource zu
speichern. Weisen Sie dann allen Tasten zu, dass sie auch
dieselbe Schaltflächengruppe verwenden. Für Schaltflächen in einer
Schaltflächengruppe werden
die Optionsschaltflächensymbole anstelle
der Checkbox-Symbole verwendet , und es kann immer nur eine Schaltfläche
in einer Schaltflächengruppe aktiviert werden Ich werde den Button Havanna Cuba deaktivieren, da er die Startposition des
Spielers sein wird Somit
haben sie drei Möglichkeiten, aus denen sie für ihr
erstes Ziel
wählen können. Ich möchte das
Aussehen dieser Schaltflächen anpassen , ohne andere
Kontrollkästchen in meinem Projekt zu beeinflussen Also füge ich meinem Thema eine neue Variante
des Thementyps hinzu, nenne sie Port und setze ihren
Basistyp auf Checkbox Wenn ein Port deaktiviert ist,
unabhängig davon, ob er aktiviert ist oder nicht, setze
ich sein Symbol auf einen Anker, da das anzeigt, wo sich der Player
gerade befindet. Ein deaktiviertes Optionsfeld
ist ein Verkaufssymbol, und ein aktiviertes
Optionsfeld ist ein rotes X,
was darauf hinweist, dass es sich um das vom
Spieler gewählte Ziel handelt Ich werde auch
die Schriftgröße
dieser Buttons reduzieren , damit sie nicht so viel
Platz auf der Karte
einnehmen Wenn ich alle meine
Anschlussschaltflächen in der Szenenstruktur auswähle, ändere ich sie alle so, dass sie die Typvariante
des Port-Themes verwenden . Setze dann ihre
Größeneigenschaften so zurück, dass sie so klein wie möglich sind und gleichzeitig ihren Text
enthalten. Damit sich mein
Schaltflächentext nicht überschneidet, lasse
ich Kingston
und Portal Prince ihr Layout von rechts nach
links
umkehren, sodass der Text
links neben dem Optionsfeldsymbol erscheint Um sicherzustellen, dass die Schaltflächen an den richtigen Positionen
bleiben, auch wenn die
Größe der Karte aus irgendeinem Grund geändert wird, setze
ich die Schaltflächen
mithilfe
benutzerdefinierter Anker in den Ankermodus und positioniere ihre Ankerpunkte in der
Mitte ihrer Ich wiederhole das dann
für jeden meiner Anschlüsse. Wenn Sie eines
der Optionsfelder auswählen seine Signale ansehen, wäre
es kein gutes
Design, jedes
dieser umschaltbaren Signale mit
einer anderen Funktion
im Skript zu verbinden dieser umschaltbaren Signale mit
einer anderen Funktion
im Skript zu einer anderen Funktion
im Skript Das würde das Hinzufügen weiterer
Anschlüsse sehr umständlich machen. Beachten Sie jedoch, dass das vom Signal übergebene
Argument ein boolescher Wert
mit
dem Namen toggled on ist Im Map-Manager-Skript können
wir mit
einer einzigen Funktion darauf reagieren, dass jede Schaltfläche umgeschaltet
wird Deklarieren wir zunächst
eine Variable, die
den aktuellen
Port des Spielers als Ganzzahl enthält, was natürlich
standardmäßig auf Null gesetzt wird, und eine weitere für
sein Ziel Ich gebe ihr einen
Standardwert von minus Eins, was bedeutet,
dass der Spieler
kein Ziel ausgewählt hat . Wir können dann eine Funktion schreiben,
um das Ziel festzulegen, zuerst den
eingeschalteten Parameter akzeptieren, damit er mit dem Argument übereinstimmt
, das
vom eingeschalteten Signal übergeben wurde Dann fügen wir einen weiteren Parameter hinzu, die Port-ID der Taste
, die gedrückt wurde Wenn die Schaltfläche
aktiviert ist, das Ziel
die Port-ID Wenn die Taste
ausgeschaltet ist und die Port-ID das Ziel
ist, wurde das Ziel vom
Spieler entfernt und sollte auf einen negativen Wert
zurückgesetzt werden Um das
Signal der umgeschalteten Tasten mit dieser Funktion zu verbinden, müssen
wir
den erweiterten Bereich
des
Signalverbindungsdialogs erweitern des
Signalverbindungsdialogs Hier können wir dem Signal zusätzliche
Argumente hinzufügen. Die Art des Arguments, das wir hinzufügen
möchten, ist eine Ganzzahl, und für Havanna
lasse ich den Wert bei Null. Wir können dann zur
Liste der Knoten in der Szene zurückkehren, den Kartenknoten
auswählen
und eine Funktion auswählen, die
als Reaktion auf dieses Signal aufgerufen werden soll. Die aufgerufene Funktion
muss Parameter haben , deren Typen denen
des Signals entsprechen. Da dieses Signal als
boolescher Wert aktiviert
wurde und wir eine zusätzliche Ganzzahl
binden, muss das
gesetzte Ziel einen booleschen Parameter haben, gefolgt
von
einem Integer-Parameter muss das
gesetzte Ziel einen booleschen Parameter haben , gefolgt
von
einem Integer-Parameter Wir können diesen Vorgang dann
für jedes Optionsfeld wiederholen den Wert des gebundenen Integer-Arguments
auf einen anderen Wert
ändern gebundenen Integer-Arguments
auf Der Einfachheit halber verwende ich untergeordnete
Indexnummer
jeder Schaltfläche in der Szenenstruktur. Zurück in der 2-D-Ansicht füge
ich außerdem am unteren Rand der Karte einen
Randcontainer hinzu, der an
der unteren Breite verankert ist, und füge in diesem
Randcontainer eine Bezeichnung ein, die die Entfernung zwischen dem aktuellen Hafen
des Spielers und
seinem Ziel
angibt aktuellen Hafen
des Spielers , gemessen
in Tagen der Fahrt,
sowie eine Schaltfläche, mit der er seine
Reise antreten kann, und bis zum Ende
des Randcontainers schrumpfen Ich notiere mir dann die Position und Größe des Randcontainers und füge einen
farblich zerstörten Knoten als Geschwisterknoten mit
denselben Ankern, derselben
Größe und Position hinzu, der halbtransparent schwarz gefärbt
ist . Das Kartenbild ist stark frequentiert,
und wenn Sie diesen
Farbton hinzufügen, werden
die Bezeichnung und die Schaltfläche nur die Bezeichnung und die Ich werde die Bezeichnung standardmäßig unsichtbar und die Schaltfläche
deaktivieren Zurück im Skript werde
ich mithilfe von Addon Ready Verweise auf
den Schiffsmanager und diese
beiden Knoten abrufen . Dann definiere ich auch ein
konstantes Array, um
die Entfernungen zwischen
meinen Häfen
in Seemeilen zu speichern die Entfernungen zwischen meinen Häfen
in Seemeilen Erstellung einer Matrix von ganzen Zahlen ergeben die reflexiven
Positionen dann, wenn der aktuelle Hafen und das
Ziel identisch sind, die Entfernung
also Null Und ich werde die Matrix einfach
mit einigen realistischen Werten für
die Segeldistanz
in Seemeilen
zwischen den einzelnen Städten
füllen mit einigen realistischen Werten für die Segeldistanz
in Seemeilen
zwischen den zwischen Die symmetrischen Werte
sollten identisch sein,
vorausgesetzt, Sie können
in beiden Richtungen
auf demselben Weg segeln in beiden Richtungen
auf demselben Weg Ziel dann nach
dem Einstellen Wenn das Ziel dann nach
dem Einstellen des Ziels
entweder negativ ist oder denselben Wert
wie der aktuelle Hafen hat,
dann verberge ich die Entfernungsbeschriftung
und deaktiviere die Einschiffungsschaltfläche. Andernfalls setze ich den Text der Entfernungsbeschriftung auf
die richtige Anzahl
von Segeltagen aktiviere
dann die Einschiffungsschaltfläche. Um auf die Speicherdaten des
Players zuzugreifen, benötige
ich einen Verweis
auf den zweiten Dateiknoten Um die Anzahl
der Segeltage zu berechnen, verwende
ich die Versiegelungsfunktion, die einen Float auf die
nächste Ganzzahl aufrundet und
die Segeldistanz
in Seemeilen
durch die
aktuelle Schiffsgeschwindigkeit des Spielers dividiert die Segeldistanz
in Seemeilen durch die
aktuelle Schiffsgeschwindigkeit des Spielers Damit das funktioniert, muss
ich die Funktion „Geschwindigkeit
abrufen“ zum
Schiffsmanager-Skript hinzufügen Funktion „Geschwindigkeit
abrufen“ zum
Schiffsmanager-Skript also schwimmend zurückkehre, gebe ich
die Schiffe zurück , die nach der aktuellen Schiffs-ID des
Spielers indexiert Und ich habe keinen
Geschwindigkeitswert für meine Schiffsressource angegeben, also öffne ich das
Schiffsressourcen-Skript und exportiere eine weitere Variable
für die Schiffsgeschwindigkeit Geben Sie ihm dann einen Standardwert von 100 Seemeilen pro Tag Ich kann dann jedem Schiff eine
andere Geschwindigkeit zuweisen, wenn ich möchte, und der Spieler
kann diese Reisen in
weniger Segeltagen zurücklegen Ich möchte auch, dass der
Spieler sein Ziel
ausschalten kann ,
indem er erneut darauf klickt, was standardmäßig nicht erlaubt ist Wenn wir
in den Projektressourcen
auf die Schaltflächengruppe doppelklicken , können
wir die Eigenschaft
Drücken zulassen aktivieren, um
diesem Verhalten Rechnung zu tragen . Lass es uns ausprobieren. Der Spieler kann auf jedes
dieser
Optionsfelder auf der Karte klicken dieser
Optionsfelder auf der Karte es als
Ziel
auswählen und es als
Ziel
auswählen. Die Anzahl der
Tage wird aktualisiert und die Starttaste wird aktiviert Wenn wir die Taste drücken, die bereits aktiviert
war, können
wir sie auch ausschalten Und jetzt gibt es kein Ziel,
also ist die Anzahl der Tage ausgeblendet
und die Einschiffungstaste wird deaktiviert. Wir haben jetzt eine Karte
mit mehreren Häfen zwischen
denen der Spieler
als Ziel wählen kann Und in der nächsten Lektion kann der Spieler den Anker
des Schiffes kontrollieren. Wir sehen uns in der nächsten Lektion.
38. Kontroll-Schaltfläche: Hallo, Freunde. In
der vorherigen Lektion haben wir dem Spieler erlaubt,
ein Ziel auf einer Karte auszuwählen. In dieser Lektion lassen wir sie den Schiffsanker
kontrollieren. Unter meiner Karte befindet sich in dem
vertikalen Kastencontainer ein horizontaler
Kastencontainer und dort befindet sich
ein
Häkchen , mit dem der Schiffsanker
gesteuert werden kann. Wie das Kontrollkästchen
erbt auch
das Kontrollkästchen die meisten seiner Eigenschaften
von der Schaltfläche,
einschließlich seines Designs Sie das Häkchen auswählen, schauen wir uns die
Eigenschaften im Inspektor an Ich entferne zunächst die Eigenschaften des
Stildesigns von der Schaltfläche
übernommen wurden, indem
ich das flache Kontrollkästchen aktiviere. Wir können dem Häkchen Text
und auch ein Symbol hinzufügen. Ich werde den Text verwenden, um dem Spieler mitzuteilen, dass er
zur Steuerung des Schiffsankers verwendet wird . Wie bei anderen Schaltflächen können wir
einstellen, wie der Text
und das Symbol relativ zur Position des
Häkchens
dargestellt werden relativ zur Position des
Häkchens
dargestellt und wie viel Platz zur Verfügung steht. Als Nächstes wählen wir den
Stammknoten aus, damit wir
den Theme-Editor sehen können , und fügen dem Theme die
Check-Button hinzu. Die Check-Taste erbt
viele der Eigenschaften, die wir von der Schaltfläche
kennen,
wie Schrift- und Symbolfarben Im Bereich Konstante können
wir alles an
der größten Stilbox ausrichten , indem sie auf einen
anderen Wert als Null
setzen Fügen Sie dem Kontrollkästchen
einen gewissen vertikalen Versatz horizontale Trennung
zwischen dem Symbol, Kontrollkästchen und dem Text hinzu. Legen Sie eine Obergrenze für die maximale
Breite des Symbols fest. Und eine
Umrissgröße für den Text, all das haben wir schon einmal
mit anderen Kontrollknoten gemacht. Wie immer
belasse ich die Schriftart und
Schriftgröße als Standardwerte für das Theme Im Bereich „Symbole“ können
wir ändern, wie das
Häkchen aussieht, wenn es
aktiviert, deaktiviert oder deaktiviert ist . Außerdem können wir ein Symbol bereitstellen, das für alle
Check-Buttons im gesamten Projekt verwendet
wird , sofern es nicht durch
die jeweilige Eigenschaft
des jeweiligen
Häkchensymbols überschrieben des jeweiligen
Häkchensymbols Und schließlich haben
wir
im Stilbereich dieselben Stile, die
von der Schaltfläche übernommen wurden. Ich werde sie entfernen
, indem ich
sie alle durch ein leeres Stilfeld ersetze sie alle durch ein leeres Stilfeld Wenn ich den Check-Button-Node auswähle, habe ich meine Taste standardmäßig
gedrückt. Ich benenne meinen
Ankerknoten und den Ports-Ordner um, bevor ich sie in meinem Skript
verwende. Wir müssen darauf reagieren, dass
der Spieler auf
das Häkchen klickt , indem wir
sein Signal mit einem Skript verbinden. Anstatt des gedrückten Signals wir normalerweise für die Schaltfläche
verwenden würden, müssen
wir wissen,
ob der Check-Button - oder ausgeschaltet
wird, also verbinden wir stattdessen das
umschaltete Signal,
das den eingeschalteten Zustand
des Check-Buttons
als Argument weitergibt des Check-Buttons
als das mit meinem
MAP-Manager-Skript
verbinde, kann ich einfach auf
das Signal reagieren, je nachdem , ob die Check-Taste
ein- oder ausgeschaltet wird oder nicht . Wenn ich zum Skript zum
Speichern von Daten wechsle, füge
ich die Variable is
anchored als exportierten booleschen Wert hinzu und setze sie
standardmäßig Lassen Sie uns auch das Signal zum
Zurücksetzen der Datei mit dem
Skript verbinden , damit wir diesen Tab mit
den entsprechenden Informationen
aus den Speicherdaten des Players
initialisieren können diesen Tab mit
den entsprechenden Informationen
aus den Speicherdaten des Players
initialisieren den entsprechenden Informationen
aus den Speicherdaten des Players Ich benötige Verweise
auf meinen Ankerknoten und das Array der untergeordneten Knoten
in meinem Ports-Ordner Alles, was ich für
den Anker tun muss, ist,
seine Eigenschaft, auf die Schaltfläche gedrückt
zu haben, so einzustellen , dass sie den neuen Speicherdaten entspricht. Außerdem muss ich durch alle
meine Ports
iterieren und ihre
deaktivierte Eigenschaft so einstellen, dass sie dem aktuellen Port
des Players
entspricht oder nicht aktuellen Port
des Players und festlegen, dass keiner von
ihnen gedrückt werden soll Das Häkchen reagiert darauf, wenn der
Mauszeiger bewegt wird, und wenn Sie
darauf klicken, wird der Anker gewichtet Wenn Sie erneut darauf klicken, wird der
Anker gelöscht. Wir haben jetzt ein Häkchen, das den Anker des Schiffes
steuert. In der nächsten Lektion werden wir
es dem Spieler ermöglichen, die Segel zu
kontrollieren Wir sehen uns in der nächsten Lektion.
39. Vertikaler Schieberegler: Hallo Freunde. In
der vorherigen Lektion haben wir ein Häkchen hinzugefügt, das den Anker des Schiffes
steuert. In dieser Lektion verwenden wir
einen Schieberegler, um die Verkäufe
des Schiffes zu steuern. Ich beginne damit, dem horizontalen
Box-Container unter meiner Karte
einen vertikalen Schieberegler hinzuzufügen . Im Gegensatz zum Kontrollkästchen der vertikale Schieberegler
keine Text- oder Symboleigenschaften Deshalb füge ich auch einen Labelknoten hinzu, ich
das Wort
sales einfüge, damit er dem Stil
meines Anker-Steuerelements entspricht Wählen wir den Knoten für den
vertikalen Schieberegler aus und sehen wir
uns seine
Eigenschaften im Inspektor an Das bearbeitbare Kontrollkästchen
bestimmt, ob der Spieler
den Wert dieses Schiebereglers ändern kann
oder nicht, und scrollbar bestimmt,
ob er das mit dem Mausrad
tun kann ,
während er die Maus über den Schieberegler bewegt Beim Zählen der Häkchen werden
dem Schieberegler
horizontale Linien hinzugefügt, um Segmente wie bei einem Thermometer anzuzeigen Ich habe drei
Häkchen auf meinem Schieberegler, und das
Kästchen mit den Häkchen an den Rändern ändert, ob das erste und das letzte Häkchen für die Höchst
- und Minimalwerte
gezogen werden . Die Bereichseigenschaften sind für diesen Knoten ebenfalls
wichtig. Sie
ermöglichen es uns, die Mindest- und
Höchstwerte des Schiebereglers festzulegen und festzulegen,
um wie viel der
Wert des Schiebereglers bei jedem Schritt geändert werden wie viel der
Wert des Schiebereglers kann. Da mein Schieberegler
zur Steuerung der Schiffsverkäufe verwendet wird, hat
er nur
drei mögliche Werte:
Null, Halb oder Eins bei Vollverkauf. Diese Bereichseigenschaften werden
auch von anderen Knoten verwendet, z. B. von der Bildlaufleiste, die die Seiteneigenschaft
verwendet, aber die Schieberegler verwenden
sie nicht, sodass wir sie ignorieren können Der Wert ist der aktuelle
Wert des Schiebereglers, wir können
ihn
also ändern, was er standardmäßig ist Er
springt dann
automatisch zu den Schrittwerten zwischen
unseren Minimal- und Maximalwerten exponentiellen Bearbeitung wird
der Wert so verzerrt , dass er exponentiell
statt linear ist, aber nur, wenn der
Minimalwert größer als Null ist Beim Abgerundeten wird
der Wert immer auf die nächste Ganzzahl der Wert immer auf die nächste Ganzzahl Wenn Sie mehr oder
weniger zulassen, kann der Wert die
Minimal- und Maximalwerte überschreiten. Der Schieberegler
zeigt jedoch nicht an, dass dies der Fall ist. Lektion werden wir mehr über diese nächsten Lektion werden wir mehr über diese
Eigenschaften erfahren. Wählen wir den
Stammknoten aus, damit wir
den Theme-Editor sehen können , und fügen den vertikalen Slider
zu unserem Theme hinzu. Alle Theme-Eigenschaften
für den vertikalen Slider sind auch für
horizontale Slider verfügbar Da der Slider
weder Text noch Symbole enthält, hat
er auch keine Farben,
Schrift oder Schriftgröße Also fangen wir mit dem
konstanten Abschnitt an. Wenn der Centergrabber
etwas anderes als Null ist, dann
wird der Grabber nur
anhand seines Mittelpunkts und
nicht anhand der gesamten
Bildabmessungen
innerhalb des vertikalen Slider-Bereichs positioniert vertikalen Slider-Bereichs nur
anhand seines Mittelpunkts und
nicht anhand der gesamten
Bildabmessungen
innerhalb des Und der Grabber-Offset kann zu gewissen horizontalen Verschiebung
des Grabbers nach Bei einem horizontalen Schieberegler entspricht dieselbe Eigenschaft stattdessen
einem vertikalen Versatz Im Bereich mit den Symbolen können
wir verschiedene Bilder
für den Grabber im normalen,
deaktivierten und hervorgehobenen Zustand
sowie für das Bild bereitstellen für den Grabber im normalen, , das zum
Zeichnen von Häkchenmarkierungen
entlang des Sliders verwendet wird Zeichnen von Häkchenmarkierungen
entlang des Sliders Ich verwende ein Seil als Greifer und einen
Querbalken für
meine Im Bereich „Stil“ können
wir ändern, wie
der Slider gezeichnet wird, sowie den ausgefüllten Bereich unter dem Grabber normal und
wann er hervorgehoben wird Bei einem horizontalen Slider wäre
dies der Bereich links
vom Grabber Mein Schieberegler soll
eine dünne braune Linie sein ,
die einen Mast darstellt, und die Füllung wird
eine Box-Style-Textur sein , die ich
mit einem Bild von einem Segel befülle mit einem Bild von einem Segel und sie sowohl
nach links als auch nach rechts ausdehne, sodass sie wie ein
echtes Schiffssegel aussieht Ich kopiere das dann,
mache es einzigartig
und ändere die Textur für
den Fall, dass es hervorgehoben wird Um diesem Angebot mehr Platz zu geben, überschreibe
ich meine
Theme-Einstellung für den horizontalen
Box-Container, sodass
zwischen den untergeordneten Knoten ein Abstand von
21 Pixeln besteht. den Slider-Knoten auswählen, müssen
wir darauf reagieren, dass
der Spieler
den Slider benutzt , indem wir
eines seiner Signale mit einem Script verbinden. Wenn Sie darauf reagieren möchten, dass der
Wert erst geändert wird nachdem der Spieler die Maustaste losgelassen hat und
das Ziehen
beendet hat,
dann
wäre es angemessen, das Signal zum Beenden des Ziehvorgangs anzuschließen das Signal Aber ich
möchte auf die
Änderung des Werts reagieren , auch wenn der Spieler
die Maustaste
noch gedrückt hält Also verbinde ich
stattdessen das Signal zur
Wertänderung und verbinde es mit
meinem Map-Manager-Skript. Ich speichere den Wert
des Verkaufsschiebereglers in den Speicherdaten des
Players. einen Verweis
auf den Verkaufsknoten schnappe, kann
ich auch seinen Wert festlegen,
wenn die Speicherdaten zurückgesetzt werden Ich muss
diese Variable auch zum
Speicherdatenskript hinzufügen . Lass es uns ausprobieren. Der vertikale Schieberegler
reagiert darauf, dass der Mauszeiger bewegt und wir können seinen Wert
mit dem Mausrad ändern Wir können auch auf
den Grabber klicken und ihn ziehen , um seinen Wert zu ändern Wir haben jetzt einen vertikalen Schieberegler der die Segel des Schiffes
steuert In der nächsten Lektion lassen wir den Spieler sich auf den Weg zu
seinem Ziel machen Wir sehen uns in der nächsten Lektion.
40. 6 4 Fortschrittsleiste: Hallo Freunde. In
der vorherigen Lektion haben wir einen vertikalen Schieberegler hinzugefügt, mit dem
Sie die Segel des Schiffes steuern In dieser Lektion
verwenden wir einen Fortschrittsbalken, um
anzuzeigen, wie weit das
Schiff auf seiner Reise fortgeschritten ist Ich füge dem horizontalen
Feld-Container unter
meiner Karte einen Fortschrittsbalkenknoten horizontalen
Feld-Container unter hinzu und lasse ihn
horizontal erweitern, bis er den Raum ausfüllt Dann positioniere ich ihn zwischen den Steuerelementen für
Anker und Segel. Schauen wir uns seine
Eigenschaften im Inspektor an. Wir können die Richtung der Füllung und
den Wert ändern,
um zu sehen, wie sich das auswirkt. Wir können auch die
Prozentanzeige ein- oder ausschalten, und der Umschalter „Unbestimmt zeigt uns, dass etwas
voranschreitet,
ohne dass angegeben
wird, wie weit es fortgeschritten ist voranschreitet,
ohne dass angegeben . Das können wir sehen
, wenn wir auch aktivieren Alle gleichen
Bereichseigenschaften sind hier und funktionieren Wenn wir jedoch zulassen, dass der
Wert kleiner
als das Minimum oder
größer als das Maximum ist, wird
der Wert als Prozentsatz angegeben
, aber nicht als Füllmenge
des Fortschrittsbalkens. Wählen wir den
Stammknoten aus, damit wir
den Theme-Editor sehen und den
Fortschrittsbalken zu unserem Thema hinzufügen können. Wie bei jedem Knoten, der Text enthält, können
wir die Schriftart und die
Konturfarben ändern und
die Gliederungsgröße
im konstanten Bereich festlegen . Wie immer
belasse ich die Standardwerte für
Schriftart und Schriftgröße beim Thema,
und in der Fortschrittsleiste
gibt es keine Symbole, die geändert werden könnten Im Bereich Stil können
wir
sowohl den Hintergrund als auch die
Füllung des Fortschrittsbalkens ändern , den ich
mit flachen Stilfeldern füllen werde Ich verwende dieselbe blaue
Hintergrundfarbe wie mein Panel, runde die Ecken ab und füge einige Inhaltsränder hinzu,
um es etwas größer zu machen Kopieren Sie das dann für die Füllung, machen Sie es einzigartig und ändern Sie
die Farbe in Grün. Um unsere Reise anzutreten, müssen
wir das gedrückte
Signal der
Einschiffungstaste mit dem Skript verbinden gedrückte
Signal der
Einschiffungstaste mit dem Am Anfang des Skripts benötige
ich einen Verweis
auf meinen Fortschrittsbalken Ich werde auch
eine boolesche Variable
deklarieren, die angibt ob der
Spieler gerade segelt oder nicht,
wie viel Zeit
als Float vergangen ist und wie viele
Tage auf See
als Ganzzahl Um mit dem Segeln zu beginnen, setze ich
die boolesche Variable auf true. Die Zeit ist vergangen und die
Tage auf See sind auf Null gesunken. Ich werde auch die restlichen Tabs in meinem
Tab-Container
durchgehen und sie deaktivieren, da diese nur in einem Hafen
zugänglich sein sollten ,
nicht während der Ich schreibe dann eine weitere
Funktion, um an einem Port anzukommen, wobei eine
Port-ID als Ganzzahl
akzeptiere Nachdem die Einstellung is
sailing auf False gesetzt ist, aktiviere
ich den Port, von
dem aus der Spieler gesegelt ist, ändere den aktuellen Port
zum Ziel und deaktiviere den
neuen aktuellen Port Dann setze ich das Ziel
auf einen negativen Wert,
was bedeutet, dass es kein Ziel gibt Ich kann dann
die anderen Tabs wieder aktivieren , da sich der
Player jetzt in einem Port befindet Stellen Sie dann den Maximalwert
des Fortschrittsbalkens auf die Entfernung zwischen dem aktuellen Port und
dem Ziel ein und deaktivieren Sie die Embark-Taste Um vom aktuellen
Hafen zum Ziel zu segeln, verwende
ich die Prozessfunktion, um den
Fortschrittsbalken im Laufe der Zeit
schrittweise zu füllen Wenn der Spieler
nicht segelt oder
vor Anker liegt oder die Segel auf Null
stehen, dann wird kein Fortschritt
gemacht und ich kehre einfach zurück Andernfalls erhöhe ich die von Delta verstrichene
Zeit, und wenn die verstrichene Zeit
größer ist als die
Anzahl der Seetage,
dann erhöhe ich die Anzahl der Seetage und zahle der Crew ihren Tagesverdienst und Als Nächstes füge ich zum Wert des
Fortschrittsbalkens aktuelle
Schiffsgeschwindigkeit
des Spielers multipliziert mit seinem Verkaufswert multipliziert mit Dies führt dazu, dass das
Schiff alle 1 Sekunde seine Geschwindigkeit in Seemeilen zurücklegt,
wobei 1 Sekunde wobei Wenn der Wert des Fortschrittsbalkens seinen Maximalwert
erreicht, haben sie ihr Ziel erreicht Ich muss
diese Auszahlungsfunktion
in mein Crew Manager-Skript schreiben in mein Crew Manager-Skript Mit dem Addon Ready einen Verweis auf den Crewmanager abrufen dann zum
Crew-Manager-Skript wechseln Zuerst deklariere
ich eine Variable für die Gesamtauszahlung
als Ganzzahl und gehe für die Gesamtauszahlung
als Ganzzahl und gehe dann die Crew
des Spielers durch Wenn es sich bei der Rolle der Crew nicht um ein Array
handelt, addiere
ich die Bezahlung für diese
Rolle zur Gesamtvergütung Wenn es sich um ein Array handelt, gehe
ich
jede Person in dieser Rolle noch einmal durch und
addiere jede Person in dieser Rolle noch einmal durch und ihren gesamten
Lohn zur Gesamtsumme Ich benötige einen Verweis auf
den Goldressourcenknoten, damit dieses Skript
den Spieler auffordern kann ,
diesen Gesamtbetrag auszugeben Und schließlich gib die Menge an
Gold aus, die notwendig ist, um
alle Besatzungsmitglieder zu bezahlen. Wenn der Spieler
nicht genug Geld hat um die gesamte Crew auszuzahlen, wäre
dies ein guter Zeitpunkt um das Spiel
mit dem Ende des Spiels zu beenden. Ich habe meinem
Variablennamen hier ein S hinzugefügt. Das muss ich reparieren. Wenn ich auf das Kästchen für einen Hafen
klicke, überprüfe
ich zuerst, ob der
Spieler gerade segelt Wenn ja, drücke ich die Taste die zum
Zielhafen
gehört, und kehre zurück. Dadurch wird verhindert, dass
der Spieler sein Ziel
während der Fahrt
ändert. Wenn sie nicht segeln und ihr Ziel
festlegen, setze ich den Wert des
Fortschrittsbalkens auf Null. Lass es uns ausprobieren. Der
Spieler kann ein Ziel auswählen und auf
die Schaltfläche „Einschiffen“ klicken ,
um mit dem Segeln zu beginnen, aber er kommt seinem Ziel nicht
näher wenn er vor Anker liegt oder wenn
seine Segel nicht entrollt sind Die Geschwindigkeit des Schiffes kann so
eingestellt werden , dass das
Segel halb Sobald sie
ihr Ziel erreicht haben, kann wieder mit
den Tabs und Checkboxen interagiert
werden Sobald der Spieler in einem Hafen angekommen ist,
kann er Besatzungsmitglieder rekrutieren und zu einem anderen Hafen segeln Die Bezahlung der Besatzung wird
für jeden Tag auf See abgezogen Wir haben jetzt einen
Fortschrittsbalken, der anzeigt, wie weit das Schiff von seinem Ziel entfernt
ist Und das deckt fast alle Kontrollknoten
von Godo ab. Die wenigen Mechaniken, die noch übrig sind, um dieses Spiel zu beenden,
würden nur
mehr der gleichen Knoten verwenden , die wir
bereits an anderer Stelle
im Projekt verwendet haben bereits an anderer Stelle
im Projekt verwendet Jetzt sollten Sie bereit sein
, Ihr Projekt abzuschließen. Wenn du dieses Projekt
verfolgt hast, versuche, Markt
dieses Spiels abzuschließen
und ein Spiel über den
Bildschirm hinzuzufügen. Viel Glück.