Master Godot UI: Anpassen der Benutzeroberflächen mit Control Nodes | Thomas Yanuziello | Skillshare

Playback-Geschwindigkeit


1.0x


  • 0.5x
  • 0.75x
  • 1x (normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Master Godot UI: Anpassen der Benutzeroberflächen mit Control Nodes

teacher avatar Thomas Yanuziello, Indie Game Developer

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Wähle aus einer Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Wähle aus einer Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Einheiten dieses Kurses

    • 1.

      Promotion

      1:31

    • 2.

      Hallo Welt

      8:03

    • 3.

      Konstanten und Variablen

      9:11

    • 4.

      If-Erklärungen und Bedingungen

      9:46

    • 5.

      While Loops und Operatoren

      9:23

    • 6.

      Arrays und For-Loops

      10:32

    • 7.

      Stacks und Funktionen

      10:53

    • 8.

      Anpassen und Zurückgeben

      9:34

    • 9.

      Szenenbaum und Vererbung

      10:21

    • 10.

      Abstraktion und Verkapselung

      10:41

    • 11.

      Polymorphismus

      8:01

    • 12.

      Wörterbuch

      8:54

    • 13.

      Debugging

      9:08

    • 14.

      SET-UP

      3:52

    • 15.

      Label A

      9:46

    • 16.

      Label B

      6:10

    • 17.

      Textur Rechtschnur

      8:54

    • 18.

      Taste A

      9:24

    • 19.

      Button B

      7:43

    • 20.

      Link-Button

      10:05

    • 21.

      Variation des Thementyps

      4:33

    • 22.

      Anzeigefeld

      7:30

    • 23.

      Farbrechteffekt

      7:23

    • 24.

      Menüleiste

      6:20

    • 25.

      Popup-Menü

      10:00

    • 26.

      Signale

      10:32

    • 27.

      Daten speichern

      8:50

    • 28.

      Zähler

      8:18

    • 29.

      Linienbearbeitung A

      10:50

    • 30.

      Linienbearbeitung B

      7:46

    • 31.

      Optionsschaltfläche

      13:06

    • 32.

      Horizontaler geteilter Behälter

      3:28

    • 33.

      Tabulator-Container

      10:45

    • 34.

      Baum A

      12:45

    • 35.

      Baum B

      9:47

    • 36.

      Bildlauf-Container

      12:30

    • 37.

      Radiotaste

      9:52

    • 38.

      Kontroll-Schaltfläche

      4:01

    • 39.

      Vertikaler Schieberegler

      5:39

    • 40.

      6 4 Fortschrittsleiste

      7:32

  • --
  • Anfänger-Niveau
  • Fortgeschrittenes Niveau
  • Fortgeschrittenes Niveau
  • Jedes Niveau

Von der Community generiert

Das Niveau wird anhand der mehrheitlichen Meinung der Teilnehmer:innen bestimmt, die diesen Kurs bewertet haben. Bis das Feedback von mindestens 5 Teilnehmer:innen eingegangen ist, wird die Empfehlung der Kursleiter:innen angezeigt.

54

Teilnehmer:innen

--

Projekt

Über diesen Kurs

Bist du bereit, dein allererstes Spiel in der Godot-Game-Engine zu erstellen?
Fällt es dir schwer, die Steuerknoten der grafischen Benutzeroberfläche (GUI) von Godot zu verwenden?
Oder möchtest du dich selbst herausfordern, ein ganzes Spiel in einer einzigen Szene nur mit Control Nodes zu erstellen?

In diesem Kurs werden wir alles erkunden, was die Godot GUI Control Nodes zu bieten haben, indem wir ein komplettes Spiel von Grund auf neu erstellen.

Der Anfang des Kurses konzentriert sich auf das Schreiben von Skripten und die Sprache GDScript.
Wenn du bereits mit Godot und GDScript vertraut bist, kannst du diese Kurseinheiten überspringen und direkt zur Lektion Setup überspringen.

Klicke auf den Link meiner Website in meinem Profil, um unserem Discord-Server beizutreten!

Triff deine:n Kursleiter:in

Teacher Profile Image

Thomas Yanuziello

Indie Game Developer

Kursleiter:in
Level: All Levels

Kursbewertung

Erwartungen erfüllt?
    Voll und ganz!
  • 0%
  • Ja
  • 0%
  • Teils teils
  • 0%
  • Eher nicht
  • 0%

Warum lohnt sich eine Mitgliedschaft bei Skillshare?

Nimm an prämierten Skillshare Original-Kursen teil

Jeder Kurs setzt sich aus kurzen Einheiten und praktischen Übungsprojekten zusammen

Mit deiner Mitgliedschaft unterstützt du die Kursleiter:innen auf Skillshare

Lerne von überall aus

Ob auf dem Weg zur Arbeit, zur Uni oder im Flieger - streame oder lade Kurse herunter mit der Skillshare-App und lerne, wo auch immer du möchtest.

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.