Kids programmieren 3D-Spiele mit JavaScript

Kids programmieren 3D-Spiele mit JavaScript

Chris Strom

Inhalt

Danksagung

Einleitung

Wie ich zu programmieren gelernt habe

Was du für dieses Buch brauchst

Was ist JavaScript?

Wie du dieses Buch lesen solltest

Hinweise zur deutschen Fassung dieses Buches

Legen wir los!

1. Projekt: Einfache Formen Herstellen

Programmieren mit dem ICE Code Editor

Formen mit JavaScript herstellen

Kugeln herstellen

Größe: SphereGeometry(100)

Nicht klobig: SphereGeometry(100, 20, 15)

Mit der Würfelform Kisten herstellen

Größe: CubeGeometry(300, 100, 20)

Zylinder für alle möglichen Formen

Größe: CylinderGeometry(20, 20, 100)

Pyramiden: CylinderGeometry(1, 100, 100, 4)

Mit Ebenen flache Oberflächen bauen

PlaneGeometry(100, 100)

Mit einem Ring einen Donut zeichnen (leider nicht essbar)

TorusGeometry(100, 25)

TorusGeometry(100, 25, 8, 25)

TorusGeometry(100, 25, 8, 25, 3.14)

Die Formen animieren

Der Code bisher

Wie es weitergeht

2. Mit der Konsole herumspielen und feststellen, was kaputt ist

Leg los

Starte ein neues Projekt

Die JavaScript-Konsole öffnen und schließen

Fehlersuche im ICE: Das Rote X

Fehlersuche im ICE: Das Gelbe Dreieck

Fehlersuche in der Konsole

Mögliche Fehlermeldung – Undefined Is Not a Function

Mögliche Fehlermeldung – Three Is Not Defined

Mögliche Fehlermeldung – Undefined: No Method

Was tun, wenn der ICE kaputt ist?

Wie es weitergeht

3. Projekt: Einen Avatar herstellen

Leg los

Ein Ganzes aus Teilen herstellen

Das Ganze auseinandernehmen

Füße zum Gehen hinzufügen

Herausforderung: Stell einen ganz eigenen Avatar her

Räder schlagen

Der Code bisher

Wie es weitergeht

4. Projekt: Avatare bewegen

Leg los

Mit Tastaturereignissen interaktive Systeme bauen

Tastaturereignisse in Avatar-Bewegungen verwandeln

Herausforderung: Animation starten/stoppen

Mit Funktionen einen Wald bauen

Das Ganze auseinandernehmen

Die Kamera mit dem Avatar bewegen

Der Code bisher

Wie es weitergeht

5. Funktionen: Immer und immer wieder benutzen

Leg los

Einfache Funktionen verstehen

Wenn etwas schiefgeht

Unerwartete Fehler

Herausforderung

Bizarre Tricks mit Funktionen

Rekursion

Der Code bisher

Wie es weitergeht

6. Projekt: Hände und Füße bewegen

Leg los

Eine Hand bewegen

Hände und Füße zusammen schwingen lassen

Gehen beim Bewegen

Der Code bisher

Wie es weitergeht

7. Die Grundlagen von JavaScript näher untersucht

Leg los

Eine Sache in JavaScript beschreiben

Wieso var?

Kommentare

Dinge ändern

Zahlen

Geometrie

Strings

Boolesche Werte

Code mit while und if wiederholen und überspringen

While

Code nur ausführen, wenn etwas wahr ist

Dinge auflisten

Was JavaScript anders macht

Wie es weitergeht

8. Projekt: Unseren Avatar umdrehen

Leg los

In die richtige Richtung schauen

Das Ganze auseinandernehmen

Warum rotation.y?

Vergiss avatar.rotation nicht!

Die Drehung animieren

Der Code bisher

Wie es weitergeht

9. Was ist das alles für ein Code?

Leg los

Eine kurze Einführung in HTML

Die Szene einrichten

Die Szene mit Kameras erfassen

Mit einem Renderer projizieren, was die Kamera sieht

Unterschiedliche Kameras und Renderer untersuchen

Der WebGLRenderer vorgestellt

Ein schneller Blick auf eine Kamera mit einem seltsamen Namen

Wie es weitergeht

10. Projekt: Kollisionen

Leg los

Strahlen und Überschneidungen

Der Code bisher

Wie es weitergeht

11. Projekt: Obstjagd

Leg los

Eine Punktetafel bei null starten

Die Bäume ein bisschen wackeln lassen

Für Punkte springen

Unsere Spiele noch besser machen

Animation und Ton hinzufügen

Was können wir noch hinzufügen?

Der Code bisher

Wie es weitergeht

12. Mit Licht und Material arbeiten

Leg los

Die Farbe ändern

MeshBasicMaterial

Realismus: Glanz

Strahlend

Spiegelnd

Schatten

Animieren wir!

Der Code bisher

Wie es weitergeht

13. Projekt: Baue dein eigenes Sonnensystem

Leg los

Sonne, Erde und Mars

Earth-Cam!

Der Code bisher

Wie es weitergeht

14. Projekt: Die Mondphasen

Leg los

Den Mars in den Mond verwandeln

Der coolste Trick: Das Bezugssystem

Herausforderung: Stell ein Bezugs-system für den Erdorbit her

Die Simulation anhalten

Die Phasen verstehen

Der Code bisher

Wie es weitergeht

15. Projekt: Das Lila Obst-monster-Spiel

Leg los

Machen wir Physik!

Das Konzept für das Spiel

Boden für das Spiel hinzufügen

Einen einfachen Avatar bauen

Die Punktezählung hinzufügen

Die Szene animieren

Spielelemente herstellen

Steuerelemente für den Avatar herstellen

Einfache Grafiken hinzufügen

Herausforderung: Das Spiel zurücksetzen

Der Code bisher

Wie es weitergeht

16. Projekt: Balancierbrett

Leg los

Schwerkraft und andere Vorbereitungen

Das Konzept für das Spiel

Lichter hinzufügen

Den Spielball hinzufügen

Das Spielbrett hinzufügen

Animation ermöglichen

Spielsteuerungen hinzufügen

Das Ziel hinzufügen

Einen Hintergrund hinzufügen

Die Spiellogik

Das war‘s!

Der Code bisher

Wie es weitergeht

17. Projekt: JavaScript-Objekte kennenlernen

Leg los

Einfache Objekte

Objekte kopieren

Neue Objekte konstruieren

Der Code bisher

Wie es weitergeht

18. Projekt: Ein Höhlenpuzzle

Leg los

Die Grenzen des Spiels einstellen

Beginne mit einem einfachen Avatar

Ein zufälliges, unerreichbares Ziel bauen

Verschiebbare Rampen bauen

Das Spiel gewinnen

Der Code bisher

Wie es weitergeht

19. Projekt: Ein Spiel mit mehreren Levels

Leg los

Level herstellen

Letzte Hand an das Spiel anlegen

Der Code bisher

Wie es weitergeht

20. Projekt: Rafting auf dem Fluss

Leg los

Code organisieren

Sonnenlicht hinzufügen

Punkte zählen

Formen verzerren, um einmalige Dinge herzustellen

An den Ecken ziehen

Das Auge austricksen

Ein Floß für das Rennen bauen

Das Spiel zurücksetzen

Die Ziellinie einrichten

Punkte nach Entfernung sammeln

Extrapunkte

Der Code bisher

Wie es weitergeht

21. Code in das Web bekommen

Der mächtige mächtige Browser

Kostenlose Websites

Deinen Code auf eine andere Site legen

Wie es weitergeht

A. Der Projektcode

Code: Einfache Formen herstellen

Code: Mit der Konsole herumspielen und feststellen, was kaputt ist

Code: Einen Avatar herstellen

Code: Avatare bewegen

Code: Funktionen: Immer und immer wieder benutzen

Code: Hände und Füße bewegen

Code: Die Grundlagen von JavaScript näher untersucht

Code: Unseren Avatar umdrehen

Code: Was ist das alles für ein Code?

Code: Kollisionen

Code: Obstjagd

Code: Mit Licht und Material arbeiten

Code: Bau dein eigenes Sonnensystem

Code: Die Mondphasen

Code: Das Lila-Obstmonster-Spiel

Code: Balancierbrett

Code: JavaScript-Objekte kennenlernen

Code: Ein Höhlenpuzzle

Code: Ein Spiel mit mehreren Levels

Code: Rafting auf dem Fluss

B. In diesem Buch benutzte JavaScript-Bibliotheken

Three.js

Physijs

Tween.js

Scoreboard.js

Scoreboard-Nachrichten

Hilfe

Punktezählung

Timer

Countdown

Sounds.js

Stichwortverzeichnis

Danksagung

Ohne meine wunderbare Frau Robin bin ich nichts. Sie erträgt nicht nur, dass ich tagelang verschwinde, um zu schreiben. Sie hilft mir auch auf unzählige andere Arten. Sie hat die allerersten Fassungen dieses Buches gelesen und korrigiert. Sie hilft bei der Durchführung der Kid Hackathons, die zur Entwicklung dieses Buches beitrugen (okay, sie führt sie durch). Und ja – sie ist eine fantastische Ehefrau und Mutter.

Ein riesiges Dankeschön geht auch an meinen Sohn Luke, der das wichtigste Versuchskaninchen für die ersten Versionen dieses Buches war. Sein sachliches Feedback hat dazu beigetragen, dass es viel besser wurde. Danke auch an meine Tochter Elora, die mit ihren Einsichten nicht hinter dem Berg gehalten hat.

Und natürlich geht ein großer Dank auch an meine technischen Gutachter. Es ist nicht leicht, ein Buch aus Sicht eines Kindes zu bewerten, doch meine Gutachter waren dieser Aufgabe mehr als gewachsen. Danke, Alec M., Hana B., Dave S., Thad K., Maik Schmidt, Silvia Domenech und Mark Musante.

Ein besonderer Dank geht an Sophie H., die das Spiel inspiriert hat, aus dem schließlich Projekt: Obstjagd wurde.

Dieses Buch wäre ohne die großartige Arbeit von Ricardo Cabello Miguel, von allen liebevoll »Mr.doob« genannt, nicht entstanden. Ricardo ist der wichtigste Programmierer von Three.js, der 3D-JavaScript-Bibliothek, die wir in diesem Buch benutzen. Er schrieb außerdem die ursprüngliche Implementierung des ICE Code Editors, die wir hier verwenden. Ohne seine unglaublichen Fähigkeiten wäre dieses Buch nicht zu dem geworden, was es ist. Danke auch an Chandler Prall für seine Arbeit an der Physijs-Physik-Engine, die wir hier ausgiebig benutzen. Chandler hat auch die vielen, vielen Fragen beantwortet, die ich beim Lernen hatte.

Einleitung

Herzlich willkommen in der Welt der Programmierung!

Ich will nicht lügen – es ist manchmal eine frustrierende Welt (ich muss wenigstens einmal in der Woche weinen). Aber der ganze Frust lohnt sich. Du kannst diese Welt nach deinem Belieben gestalten. Du kannst deine Welt mit anderen teilen. Du kannst Dinge bauen, die wirklich etwas bewegen.

Dieses Buch, das du so eifrig zu lesen begonnen hast, ist eine großartige Möglichkeit, um mit dem Programmieren zu beginnen. Es ist vollgestopft mit klaren und verständlichen Erklärungen. Und das Beste ist, dass wir einige wirklich coole Spiele herstellen werden. Das wird richtig klasse!

Wie ich zu programmieren gelernt habe

Als Kind habe ich die Programme für Computerspiele aus Büchern kopiert. Das ist schon lange her. Ich kaufte Bücher, in denen nichts weiter als die Programme zu lesen waren, und tippte sie in den Computer ein.

Als ich damit begann, hatte ich keine Ahnung, was ich eigentlich tat. Schließlich fing ich an, bestimmte Dinge zu erkennen, die immer wieder vorkamen, und ich verstand sie auch schon ein bisschen.

Ich begann damit, Dinge zu ändern – zuerst nur Kleinigkeiten –, um zu sehen, was passierte. Danach kamen größere Änderungen. Schließlich wurde ich recht gut darin. Und irgendwann konnte ich meine eigenen Programme schreiben. Ich hoffe, dass dieses Buch auch dir dies ermöglicht, allerdings mit einem großen Unterschied: Ich erkläre, was hier passiert, sodass du nicht so viel raten musst.

Was du für dieses Buch brauchst

Nicht alle Webbrowser können die coolen 3D-Spielobjekte erzeugen, die wir in diesem Buch bauen werden. Um das meiste aus diesem Buch herauszuholen, solltest du auf deinem Computer den Webbrowser Google Chrome (https://www.google.com/chrome/) installieren. Andere Webbrowser funktionieren auch, allerdings greifen einige der Übungen in diesem Buch auf Eigenschaften und Funktionen zurück, die es nur in Google Chrome gibt. Ein Browser, der definitiv nicht für diese Übungen zu gebrauchen ist, ist der Microsoft Internet Explorer.

Für die meisten Beispiele in diesem Buch ist ein beliebiger Computer, auf dem Google Chrome installiert ist, ausreichend. Spätere Übungen, die interessante Lichter, Schatten und 3D-Materialien benutzen, erfordern einen Computer, der WebGL unterstützt. Du kannst die diesbezüglichen Fähigkeiten Deines Computers testen, indem du die Get-WebGL-Site (http://get.webgl.org/) besuchst. Mach dir aber keine allzu großen Sorgen um WebGL; du kannst immer noch eine Menge programmieren, auch wenn dein Computer nicht mit aufwendigeren 3D-Grafiken zurechtkommt.

Was ist JavaScript?

Es gibt viele, viele Programmiersprachen. Manche Programmierer führen gern lange Streitgespräche darüber, welche die beste ist, in Wahrheit aber bieten alle Sprachen einzigartige und nützliche Dinge.

Wir benutzen in diesem Buch die Programmiersprache JavaScript. Wir programmieren in JavaScript, weil es die Sprache des Webs ist. Es ist die einzige Programmiersprache, die alle Webbrowser ohne zusätzliche Software verstehen. Wenn du in JavaScript programmieren gelernt hast, kannst du nicht nur solche Spiele herstellen, die du in diesem Buch kennenlernen wirst, sondern kannst auch alle möglichen Websites programmieren.

Wir werden allerdings keine Experten in JavaScript.

Wir werden hier gerade so viel JavaScript behandeln, dass du in der Lage bist, die Spiele in diesem Buch zu programmieren. Das ist schon eine ganze Menge an JavaScript – ausreichend, um damit ohne größere Schwierigkeiten weiterlernen zu können.

Wie du dieses Buch lesen solltest

Du findest in diesem Buch zwei Arten von Kapiteln: Projektkapitel und Lernkapitel. Die Projektkapitel starten mit »Projekt«, wie etwa Kapitel 1. Alle anderen sind Lernkapitel.

Falls du das Programmieren genauso lernen möchtest wie ich, dann lies die Projektkapitel und führe alle Übungen durch. Du stellst coole Spielfiguren her sowie Welten, in denen du spielen kannst. Du erzeugst Weltraumsimulationen. Du bastelst lila Monster. Du produzierst alle möglichen tollen Sachen.

Solltest du dich aber fragen, warum die Spiele so geschrieben wurden, wie sie es sind, dann lies die Lernkapitel. Wir werden nicht alles über die Programmierung behandeln, aber es sollte ausreichend Stoff sein, um zu verstehen, warum wir Dinge so gemacht haben, wie sie sind. Das sind die Kapitel, die ich als Kind gern gehabt hätte.

Hinweise zur deutschen Fassung dieses Buches

Du beschäftigst dich bestimmt schon eine Weile mit Computern und dem Internet und weißt deshalb, dass du dabei an der englischen Sprache nicht vorbeikommst. Das ist beim Programmieren nicht anders. So gut wie alle Programmiersprachen basieren auf der englischen Sprache. Das gilt auch für JavaScript, das du in diesem Buch kennenlernst. Die Programmierplattform, die du benutzen wirst, um die hier gezeigten Beispiele auszuprobieren, verwendet englische Befehle. In den bereitgestellten Vorlagen für den Code, den sogenannten Templates, findest du englischsprachige Kommentare, Variablen und Funktionen, und auch die geladenen JavaScript-Bibliotheken sind auf Englisch.

Zur besseren Orientierung haben wir im vorderen Teil des Buches den englischen Kommentaren ihre deutschen Übersetzungen beigefügt, später haben wir dann darauf verzichtet, schließlich kennst du dich dann schon aus und es ist nicht mehr nötig. Wenn du irgendwann anfängst, eigene Programme zu entwickeln, kannst du dir eigene Namen für deine Variablen und Funktionen ausdenken. Ob diese auf Deutsch oder auf Englisch sind oder auf einem ganz geheimen Code beruhen, den du dir selbst ausgedacht hast, ist ganz dir überlassen (bzw. hängt davon ab, was du mit deinen Mitstreitern vereinbart hast). Am besten legst du dir beim Durcharbeiten dieses Buches ein Wörterbuch bereit, um Wörter, deren Bedeutung dir unklar ist, nachzuschlagen.

Du musst außerdem beachten, dass die Schreibweise von Dezimalzahlen anders ist als im deutschsprachigen Raum üblich: Anstelle eines Kommas zum Abtrennen wird ein Punkt benutzt. Denke daran, das ebenfalls zu tun, da du dir ansonsten Fehler einhandelst, deren Ursache möglicherweise schwer zu finden ist.

Legen wir los!

Jetzt reicht es mit der Einführung – stürzen wir uns in die Programmierung!

Kapitel 1. Projekt: Einfache Formen Herstellen

WENN DU DIESES KAPITEL GELESEN HAST, DANN

Wir haben später in diesem Buch noch genügend Zeit für Erklärungen. Fangen wir jetzt erst mal zu programmieren an!

Programmieren mit dem ICE Code Editor

Wir benutzen in diesem Buch den ICE Code Editor zum Programmieren. Der ICE Code Editor läuft direkt in einem Browser. Wir können unseren Programmcode eintippen und sehen sofort die Ergebnisse.

Öffne zuerst den ICE Code Editor unter http://gamingJS.com/ice mit dem Webbrowser Chrome von Google. Das sollte dann ungefähr so aussehen:

Der ICE Code Editor in Google Chrome

Abbildung 1.1 Der ICE Code Editor in Google Chrome

Das sich drehende Ding mit den vielen Seitenflächen ist ein Beispiel für die Sachen, die wir in diesem Buch machen wollen. In diesem Kapitel legen wir ein neues Projekt namens Formen an.

Um im ICE Code Editor ein neues Projekt anzulegen, klicken wir auf den Menü-Button in der oberen rechten Ecke des Bildschirms (das ist das Kästchen mit den drei waagerechten Strichen) und wählen New aus dem Menü.

Das geöffnete Menü

Abbildung 1.2 Das geöffnete Menü

Tippe den Namen des Projekts, Formen, in das Textfeld ein und klicke dann auf Save. Das Template (ein Template ist eine Vorlage) lässt du einfach auf 3D starter project stehen.

Wir legen ein neues Projekt an.

Abbildung 1.3 Wir legen ein neues Projekt an.

Denk dran, dass die Projekte in diesem Buch nicht funktionieren, wenn du den ICE Code Editor im Internet Explorer benutzt. Einige der Übungen klappen zwar mit Mozilla Firefox, am besten wäre es aber, wenn du für alle unsere Projekte bei einem einzigen Browser (Google Chrome) bleibst.

Mit dem ICE Code Editor programmieren

Wir benutzen in diesem Buch den ICE Code Editor. Du musst nur beim ersten Aufruf von http://gamingJS.com/ice/ Zugang zum WWW haben. Nach dem ersten Besuch ist der ICE in deinem Browser gespeichert, sodass du auch dann damit arbeiten kannst, wenn du nicht mit dem Internet verbunden bist.

Wenn der ICE ein neues 3D-Projekt öffnet, gibt es in der Datei schon eine Menge Code. Wir schauen uns diesen Code später genauer an. Im Moment wollen wir jedoch unser Programmierabenteuer auf Zeile 20 beginnen. Suche nach der Zeile, auf der START CODING ON THE NEXT LINE steht.

Hier legst Du los.

Abbildung 1.4 Hier legst Du los.

Tippe in Zeile 20 Folgendes ein:

var shape = new THREE.SphereGeometry(100);
var cover = new THREE.MeshNormalMaterial();
var ball = new THREE.Mesh(shape, cover);
scene.add(ball);

Sobald du damit fertig bist, solltest du etwas Cooles sehen:

Hier hat sich schon etwas getan.

Abbildung 1.5 Hier hat sich schon etwas getan.

Der Ball, den wir eingetippt – der Ball, den wir programmiert – haben, ist im ICE aufgetaucht. Herzlichen Glückwunsch! Du hast gerade dein erstes JavaScript-Programm geschrieben!

Mach dir erst einmal keine Sorgen um die Struktur des Codes. Du wirst dich in Kapitel 7, damit vertraut machen. Im Moment wollen wir die 3D-Programmierung betrachten, die wir gerade durchgeführt haben.

3D-Dinge bestehen aus zwei Teilen: der Form und etwas, das diese Form bedeckt. Die Kombination aus beidem, der Form und ihrer Umhüllung, trägt in der 3D-Programmierung einen besonderen Namen: Mesh (Gitter oder auch Gewebe).

Mesh ist ein schickes Wort für ein 3D-Ding. Meshes brauchen Formen (manchmal als Geometrie bezeichnet) und etwas, um sie zu umhüllen (sogenanntes Material). Wir schauen uns in diesem Kapitel verschiedene Formen an. Zu unterschiedlichen Umhüllungen für unsere Formen kommen wir erst in Kapitel 12, Mit Licht und Material arbeiten.

Sobald wir ein Mesh haben, fügen wir es der Szene hinzu. Die Szene ist die Stelle in der 3D-Programmierung, an der gezaubert wird. Es ist die Welt, in der alles passiert. In diesem Fall ist es der Ort, an dem unser Ball herumlungert und auf Freunde wartet. Fügen wir der Szene einige weitere Formen hinzu, damit der Ball nicht so allein ist.

Deine Arbeit wird automatisch gesichert

Deine Arbeit wird automatisch gesichert, du musst das also nicht selbst machen. Falls du deinen Code trotzdem selbst speichern möchtest, klickst du im ICE auf den Menü-Button mit den drei Linien und wählst den Save-Befehl. Ganz einfach!

Formen mit JavaScript herstellen

Bisher haben wir nur eine Art von Form gesehen: eine Kugel. Formen können einfach sein: Würfel, Pyramiden, Kegel und Kugeln. Formen können aber auch komplexer sein, wie Gesichter oder Autos. In diesem Buch bleiben wir bei einfachen Formen. Wenn wir so etwas wie Bäume bauen, kombinieren wir einfache Formen, wie Kugeln und Zylinder miteinander.

Kugeln herstellen

Bälle werden in der Geometrie und der 3D-Programmierung als Kugeln (oder mathematisch korrekt als Sphären) bezeichnet. Es gibt zwei Möglichkeiten, die Form einer Kugel in JavaScript zu kontrollieren.

Größe: SphereGeometry(100)

Zunächst einmal können wir eine Kugel kontrollieren, indem wir beschreiben, wie groß sie ist. Wir schufen einen Ball, dessen Radius 100 war, als wir new THREE.SphereGeometry(100) sagten. Was passiert, wenn du den Radius auf 250 änderst?

var shape = new THREE.SphereGeometry(250);
var cover = new THREE.MeshNormalMaterial();
var ball = new THREE.Mesh(shape, cover);
scene.add(ball);

❶ An dieser Stelle müsstest du die Größe der Kugel ändern.

Sie sollte jetzt viel größer werden:

Die Kugel ist gewachsen.

Abbildung 1.6 Die Kugel ist gewachsen.

Was passiert, wenn du die 250 zu 10 änderst? Wie du sicher erraten hast, wird sie viel kleiner. Das ist also eine Möglichkeit, um die Form einer Kugel zu kontrollieren. Welche andere Möglichkeit hast du?

Nicht klobig: SphereGeometry(100, 20, 15)

Wenn du auf den Hide Code-Button im ICE klickst, bemerkst du sicher, dass unsere Kugel eigentlich kein wirklich glatter Ball ist:

Eigentlich keine Kugel, sondern ein kugelförmiges Gebilde aus Flächen

Abbildung 1.7 Eigentlich keine Kugel, sondern ein kugelförmiges Gebilde aus Flächen

Du kannst den Code ganz leicht ein- und ausblenden

Wenn du in der oberen rechten Ecke des ICE-Fensters auf den weißen Hide Code-Button klickst, siehst du nur den Spielbereich und die Objekte im Spiel. So wirst du in späteren Kapiteln auch die Spiele bedienen. Um den Code wieder hervorzuzaubern, klickst du auf den weißen Show Code-Button im ICE Code Editor.

Computer sind nicht in der Lage, tatsächlich einen Ball herzustellen. Stattdessen tun sie nur so, indem sie einen Haufen Quadrate (und manchmal auch Dreiecke) so zusammensetzen, dass das Ganze dann aussieht wie ein Ball. Normalerweise erhalten wir die richtige Anzahl an Segmenten, sodass es ähnlich genug wirkt.

Manchmal aber möchten wir, dass der Ball ein bisschen glatter wirkt. Dazu fügen wir auf der SphereGeometry()-Zeile zusätzliche Werte hinzu:

var shape = new THREE.SphereGeometry(100, 20, 15);
var cover = new THREE.MeshNormalMaterial();
var ball = new THREE.Mesh(shape, cover);
scene.add(ball);

❶ Die erste Zahl ist die Größe, die zweite Zahl ist die Anzahl der Segmente um die Kugel herum, und die dritte Zahl ist die Anzahl der Segmente nach oben und unten.

Dies sollte eine Kugel ergeben, die viel glatter ist:

So sieht es schon viel besser aus.

Abbildung 1.8 So sieht es schon viel besser aus.

Spiel doch noch ein bisschen mit diesen Zahlen herum. Du lernst gerade eine ganze Menge, und durch ein wenig Experimentieren wirst du noch mehr erfahren!

Ändere die Segmentierung nur, wenn Du unbedingt musst

Die Anzahl der Segmente, die wir erhalten, ohne dass wir SphereGeometry anweisen, mehr zu benutzen, ist vielleicht nicht so toll, aber du solltest sie nur ändern, wenn du unbedingt musst. Je mehr Segmente in einer Form sind, desto schwerer muss der Computer arbeiten, um sie zu zeichnen. Wie du später sehen wirst, ist es meist einfacher für den Computer, etwas glatt wirken zu lassen, wenn du eine andere Hülle für die Form wählst.

Wenn du weiter machen möchtest, schiebe den Ball aus dem Weg, indem du seine Position festlegst:

var shape = new THREE.SphereGeometry(100);
var cover = new THREE.MeshNormalMaterial();
var ball = new THREE.Mesh(shape, cover);
scene.add(ball);
 ball.position.set(-250,250,-250);

❶ Die drei Zahlen verschieben den Ball nach links, nach oben und nach hinten. Kümmere dich im Augenblick nicht darum, was diese Zahlen genau machen – wir reden über Positionen, wenn wir in Kapitel 3, Projekt: Einen Avatar herstellen, damit beginnen, Spielecharaktere zu bauen.

Mit der Würfelform Kisten herstellen

Als Nächstes erzeugen wir einen Würfel, also im Prinzip eine Kiste. Es gibt drei Möglichkeiten, die Form eines Würfels zu ändern: Du kannst ihn in der Breite, in der Höhe und in der Tiefe ändern.

Größe: CubeGeometry(300, 100, 20)

Um eine Kiste herzustellen, schreiben wir unter das, was wir für unseren Ball benutzt haben, weiteren JavaScript-Code. Tippe Folgendes ein:

var shape = new THREE.CubeGeometry(100, 100, 100);
var cover = new THREE.MeshNormalMaterial();
var box = new THREE.Mesh(shape, cover);
scene.add(box);

Wenn du alles richtig gemacht hast, solltest du ... richtig, ein Quadrat sehen:

Ganz offensichtlich ein Quadrat

Abbildung 1.9 Ganz offensichtlich ein Quadrat

Hm, das ist langweilig. Warum sehen wir ein Quadrat statt einer Kiste? Die Antwort lautet: ... weil unsere Kamera, also unsere Perspektive, direkt auf eine Seite der Kiste gerichtet ist. Falls wir mehr von der Kiste sehen wollen, müssen wir entweder die Kamera verschieben oder die Kiste drehen. Drehen wir also die Kiste:

var shape = new THREE.CubeGeometry(100, 100, 100);
var cover = new THREE.MeshNormalMaterial();
var box = new THREE.Mesh(shape, cover);
scene.add(box);

box.rotation.set(0.5, 0.5, 0);

❶ Diese drei Zahlen drehen die Kiste entgegen dem Uhrzeigersinn nach unten und nach rechts.

In diesem Fall drehen wir 0.5 nach unten und 0.5 nach rechts:

Die verdeckten Flächen des Würfels werden sichtbar.

Abbildung 1.10 Die verdeckten Flächen des Würfels werden sichtbar.

Probiere es selbst aus!

An das Drehen von Dingen muss man sich erst gewöhnen, deshalb solltest du ein bisschen mit den Werten herumspielen. Probiere kleinere und größere Zahlen aus. Eine volle Drehung erreichst du mit 6.3 (wir reden später über diese Zahl). Versuche einmal, zwei der Zahlen auf 0 und eine andere auf 0.1, dann auf 0.25 und schließlich auf 0.5 zu setzen. Wenn du die Zahlen schnell genug änderst, dann ist das fast so, als würde der Würfel herumwirbeln!

Mit einer Drehung von (0.5, 0.5, 0) müsste der Würfel so weit herumgedreht worden sein, dass man tatsächlich einen Würfel erkennen kann:

So sieht der Würfel im Code Editor aus.

Abbildung 1.11 So sieht der Würfel im Code Editor aus.

Die Seiten der Kiste müssen nicht alle gleich groß sein. Unsere Kiste ist momentan 100 breit (von links nach rechts), 100 hoch (von oben nach unten) und 100 tief (von vorn nach hinten). Ändern wir sie so, dass sie 300 breit, 100 hoch und nur 20 tief ist:

var shape = new THREE.CubeGeometry(300, 100, 20);
var cover = new THREE.MeshNormalMaterial();
var box = new THREE.Mesh(shape, cover);
scene.add(box);
box.rotation.set(0.5, 0.5, 0);

Das sollte jetzt etwa so aussehen:

Aus dem Würfel ist jetzt eine lang-gezogene Kiste geworden.

Abbildung 1.12 Aus dem Würfel ist jetzt eine lang-gezogene Kiste geworden.

Probiere noch einige andere Werte aus, um ein Gefühl dafür zu bekommen.

Ob du es glaubst oder nicht, du weißt jetzt schon eine ganze Menge über JavaScript und die 3D-Programmierung. Natürlich gibt es noch viel mehr zu lernen, aber du kannst jetzt bereits Bälle und Kisten herstellen. Du kannst sie schon verschieben und herumdrehen. Und dazu musstest du nur zehn Zeilen JavaScript-Code schreiben – wirklich toll! Schieben wir unsere Kiste aus dem Weg, damit wir mit noch mehr Formen spielen können:

var shape = new THREE.CubeGeometry(300, 100, 20);
var cover = new THREE.MeshNormalMaterial();
var box = new THREE.Mesh(shape, cover);
scene.add(box);
box.rotation.set(0.5, 0.5, 0);
box.position.set(250, 250, -250);

Zylinder für alle möglichen Formen

Ein Zylinder, manchmal auch Röhre genannt, ist eine überraschend nützliche Form in der 3D-Programmierung. Denk einmal darüber nach: Zylinder können als Baumstämme, Blechdosen oder auch als Räder benutzt werden ... Wusstest du, dass man mit Zylindern Kegel, Tannenbäume und sogar Pyramiden herstellen kann? Und so geht‘s!

Größe: CylinderGeometry(20, 20, 100)

Tippe die folgenden Zeilen unter dem Kistencode ein, um einen Zylinder herzustellen:

var shape = new THREE.CylinderGeometry(20, 20, 100);
var cover = new THREE.MeshNormalMaterial();
var tube = new THREE.Mesh(shape, cover);
scene.add(tube);

Wenn du das ein bisschen drehst (du erinnerst dich aus dem letzten Abschnitt noch daran, oder?), siehst du vermutlich so etwas Ähnliches (siehe Abbildung 1.13).

Mach dir keine Sorgen, solltest du nicht mehr wissen, wie man die Röhre dreht. Tippe einfach nach der Zeile mit scene.add(tube) dies hier ein:

tube.rotation.set(0.5, 0, 0);

Beim Herstellen eines Zylinders beschreiben die ersten beiden Zahlen, wie groß der Zylinder oben und unten ist. Die letzte Zahl gibt die Höhe des Zylinders an. Unser Zylinder ist also oben und unten jeweils 20 groß. Außerdem ist er 100 hoch.

Siehe da, ein Zylinder!

Abbildung 1.13 Siehe da, ein Zylinder!

Was passiert, wenn du die ersten beiden Werte auf 100 und die letzte Zahl auf 20 änderst? Was passiert, wenn du die Spitze auf 1, das Unterteil auf 100 und die Höhe auf 100 stellst?

Probiere es selbst aus

Spiele mit diesen Zahlen ein bisschen herum und erlebe selbst, was du herstellen kannst!

Was hast du herausgefunden?

Ein flacher Zylinder ist eine Scheibe:

Die Welt ist eine Scheibe. ;-)

Abbildung 1.14 Die Welt ist eine Scheibe. ;-)

Und ein Zylinder, der entweder eine Spitze oder ein Unterteil mit der Größe 1 hat, ist ein Kegel:

Ein Zirkuszelt?

Abbildung 1.15 Ein Zirkuszelt?

Es sollte klar sein, dass du mit Zylindern viel erreichen kannst, allerdings haben wir bisher gar nicht alles gesehen. Ein Trick ist noch übrig.

Pyramiden: CylinderGeometry(1, 100, 100, 4)

Hast du gemerkt, dass Zylinder klobig aussehen? Es sollte dich deshalb nicht überraschen, dass man die Grobheit von Zylindern kontrollieren kann. Wenn du zum Beispiel die Anzahl der Segmente bei der Scheibe auf 20 setzt, so wie hier:

var shape = new THREE.CylinderGeometry(100, 100, 10, 20);
var cover = new THREE.MeshNormalMaterial();
var tube = new THREE.Mesh(shape, cover);
scene.add(tube);
tube.rotation.set(0.5, 0, 0);

dann müsstest du so etwas sehen:

Ein ganz flacher Zylinder mit einem stark geglätteten Rand

Abbildung 1.16 Ein ganz flacher Zylinder mit einem stark geglätteten Rand

Genau wie bei den Kugeln solltest du nur dann viele Segmente benutzen, wenn du das wirklich, wirklich brauchst.

Kannst du dir vorstellen, wie man das in eine Pyramide verwandeln könnte? Du hast schon alle Hinweise, die du brauchst.

Probiere es selbst aus!

Spiele mit unterschiedlichen Zahlen herum und schaue dir an, was passiert!

Hast du es herausbekommen? Keine Panik, falls nicht. Was wir machen, ist wirklich ziemlich raffiniert.

Du musst nämlich die Anzahl der Segmente, aus denen du einen Kegel herstellst, verringern. Wenn du die Spitze auf 1, das Unterteil auf 100, die Höhe auf 100 und die Anzahl der Segmente auf 4 setzt, bekommst du das:

Eine Pyramide

Abbildung 1.17 Eine Pyramide

Es kommt dir vielleicht wie Schummelei vor, auf diese Weise eine Pyramide herzustellen, aber das bringt uns zu einem sehr wichtigen Tipp für alle Programmierungen:

Schummle, wann immer das möglich ist

Im wirklichen Leben solltest du nicht schummeln, aber bei der Programmierung – vor allem bei der 3D-Programmierung – solltest du immer nach einfacheren Methoden suchen, um etwas zu tun. Selbst wenn es eine übliche Methode für etwas gibt, könnte es einen besseren Weg geben.

Du warst bis hierher ganz klasse. Schiebe die Röhre genau wie den Würfel und die Kugel aus der Mitte heraus:

tube.position.set(250, -250, -250);

Wir kommen jetzt zu den letzten beiden Formen in diesem Kapitel.

Mit Ebenen flache Oberflächen bauen

Eine Ebene ist eine flache Oberfläche. Ebenen sind besonders für den Boden nützlich, man kann mit ihnen aber auch gut Türen und Ecken in unseren Spielen kennzeichnen.

PlaneGeometry(100, 100)

Da Ebenen einfach nur flache Quadrate sind, sind sie viel einfacher als die anderen Objekte, die wir bisher gesehen haben. Tippe Folgendes ein:

var shape = new THREE.PlaneGeometry(100, 100);
var cover = new THREE.MeshNormalMaterial();
var ground = new THREE.Mesh(shape, cover);
scene.add(ground);
ground.rotation.set(0.5, 0, 0);

Vergiss nicht die Drehung auf der letzten Zeile. Ebenen sind so dünn, dass du sie vielleicht gar nicht siehst, wenn du direkt auf sie blickst.

Die Zahlen beim Herstellen einer Ebene bezeichnen Breite und Tiefe. Eine Ebene, die 300 breit und 100 tief ist, könnte so aussehen:

Eine Ebene

Abbildung 1.18 Eine Ebene

Mehr musst du über Ebenen eigentlich gar nicht wissen. Schieb unsere Ebene aus dem Weg:

var shape = new THREE.PlaneGeometry(300, 100);
var cover = new THREE.MeshNormalMaterial();
var ground = new THREE.Mesh(shape, cover);
scene.add(ground);
ground.position.set(-250, -250, -250);

Kommen wir nun zur allerbesten Form auf der ganzen weiten Welt.

Mit einem Ring einen Donut zeichnen (leider nicht essbar)

Im Kauderwelsch der 3D-Programmierung wird ein Donut auch als Ring (oder Torus) bezeichnet. Für den einfachsten Ring müssen wir zwei Werte zuweisen: einen für den Abstand von der Mitte bis zur Außenkante und einen anderen für die Dicke der Röhre.

TorusGeometry(100, 25)

Tippe Folgendes in den ICE ein:

var shape = new THREE.TorusGeometry(100, 25);
var cover = new THREE.MeshNormalMaterial();
var donut = new THREE.Mesh(shape, cover);
scene.add(donut);

Du solltest einen ziemlich unförmigen Donut sehen, so wie der in Abbildung 1.19.

Inzwischen weißt du vermutlich, wie du den Donut ein bisschen glatter hinbekommen kannst:

Ein unförmiger Donut

Abbildung 1.19 Ein unförmiger Donut

TorusGeometry(100, 25, 8, 25)

Genau wie die Kugel besteht die Donut-Form aus Segmenten. Die Segmente können um die innere Röhre herum größer oder kleiner gemacht werden. Für die Anzahl der Segmente fügen wir eine dritte Zahl ein, wenn wir die TorusGeometry definieren. Die Größe der Segmente an der Außenseite des Donuts bestimmen wir über eine vierte Zahl. Teste zum Beispiel einmal folgende Zahlen und schaue dir an, was passiert.

var shape = new THREE.TorusGeometry(100, 25, 8, 25);
var cover = new THREE.MeshNormalMaterial();
var donut = new THREE.Mesh(shape, cover);
scene.add(donut);

Na, das ist mal ein gut aussehender Donut:

Ist er nicht zum Anbeißen?

Abbildung 1.20 Ist er nicht zum Anbeißen?

TorusGeometry(100, 25, 8, 25, 3.14)

Wir können mit Donuts noch einen Trick ausprobieren. Setze zu der TorusGeometry-Form eine weitere Zahl, und zwar 3.14, hinzu:

var shape = new THREE.TorusGeometry(100, 25, 8, 25, 3.14);
var cover = new THREE.MeshNormalMaterial();
var donut = new THREE.Mesh(shape, cover);
scene.add(donut);

Na so was! Der Donut ist halb aufgegessen.

Die Formen animieren

Bevor wir unsere erste Programmiersitzung beenden, wollen wir etwas Cooles machen. Lassen wir alle unsere Formen wie verrückt herumwirbeln.

Gib im ICE nach all unseren Formen den folgenden Code ein:

var clock = new THREE.Clock();
function animate() {
requestAnimationFrame(animate);
var t = clock.getElapsedTime();
ball.rotation.set(t, 2*t, 0);
box.rotation.set(t, 2*t, 0);
tube.rotation.set(t, 2*t, 0);
ground.rotation.set(t, 2*t, 0);
donut.rotation.set(t, 2*t, 0);
renderer.render(scene, camera);
}
animate();

Kümmere dich erst einmal nicht darum, was dieser ganze Code bedeutet – wir schauen uns diese Zeilen weiter unten im Buch genauer an. Für den Augenblick reicht es, zu wissen, dass wir in bestimmten Zeitintervallen die Drehung der Form ändern. Nach jeder Änderung fordern wir das Render-Programm (Rendern bedeutet in der 3D-Geheimsprache Zeichnen oder Darstellen) auf, die aktuellen Formen auf dem Bildschirm neu zu zeichnen oder zu rendern.

Falls der ICE Code Editor blockiert

Wenn man Animationen und andere aufwendige Programmierungen macht, kann es passieren, dass der ICE Code Editor komplett blockiert. Das ist nicht schlimm. Falls der ICE nicht mehr reagiert, musst du einfach deine letzte Änderung rückgängig machen. Hinweise dazu findest du im Abschnitt „Was tun, wenn der ICE kaputt ist?“.

Der Code bisher

Um dir die Dinge ein bisschen zu vereinfachen, findest du eine vollständige Version dieses Projekts in Abschnitt „Code: Einfache Formen herstellen“. Mit diesem Code kannst du deine Arbeit überprüfen, wenn Du die Übungen absolvierst. Allerdings solltest du den Code nicht einfach in den ICE kopieren. Es ist nicht möglich, das Programmieren zu lernen und zu verstehen, wenn du es nicht selbst machst.

Wie es weitergeht

Wow! Das war ziemlich irre. Wir haben schon eine Menge gelernt, und dabei haben wir gerade erst angefangen!

Wir wissen bereits, wie man Projekte im ICE Code Editor programmiert. Wir wissen, wie man viele unterschiedliche Formen herstellt. Wir können sogar schon Dinge mit JavaScript verschieben und drehen. Und was das Beste ist, wir brauchten nur 15 Zeilen Code, um nach dem Herstellen unserer Formen eine wirklich coole Animation zu schaffen. Das ist ein guter Anfang.

Nachdem wir einen ersten Vorgeschmack von 3D-Programmierung bekommen haben, wollen wir ein bisschen darüber reden, wie man in Webbrowsern programmiert.

Kapitel 2. Mit der Konsole herumspielen und feststellen, was kaputt ist

WENN DU DIESES KAPITEL GELESEN HAST, DANN

Beim Programmieren in einem Webbrowser ist es extrem nützlich, wenn man weiß, wie man die JavaScript-Konsole des Browsers benutzt. Die meisten modernen Browser besitzen eine JavaScript-Konsole, wir benutzen hier aber Google Chrome.

Das Programmieren kann einen überwältigen

Manchmal möchte man seinen Computer einfach aus dem Fenster werfen (lass es besser!). Behalte immer zwei Tatsachen im Hinterkopf, wenn du hier weitermachst:

  • Es wird immer Dinge geben, die du nicht weißt – das ist okay.

  • Deine Programme werden kaputtgehen – das ist okay.

  • Denke immer daran, dass es allen anderen auch so geht, und dann ist alles in Ordnung.

Leg los

Mach dich mit dem ICE Code Editor vertraut

Wir benutzen immer noch den ICE Code Editor aus Kapitel 1. Solltest du mit dem ICE bisher nicht begonnen haben, gehe zurück zu diesem Kapitel und mache dich mit ihm vertraut.

Starte ein neues Projekt

Alles, was du bereits im ICE gemacht hast, sollte automatisch gesichert worden sein, sodass wir gleich mit einem neuen Projekt einsteigen. Klicke auf den Menü-Button und wähle New aus dem Menü:

Leg ein neues Projekt an ...

Abbildung 2.1 Leg ein neues Projekt an ...

Nennen wir das neue Projekt doch einfach Sachen kaputtmachen.

... und gib ihm einen Namen.

Abbildung 2.2 ... und gib ihm einen Namen.

Achte darauf, dass als Template weiterhin 3D starter project eingestellt ist.

Jetzt öffnen wir die JavaScript-Konsole des Browsers.

Die JavaScript-Konsole öffnen und schließen

Die JavaScript-Konsole in einem Browser ist die beste Freundin jedes Webprogrammierers. Sie verrät uns, wo wir Fehler gemacht haben.

Die JavaScript-Konsole öffnen und schließen

(gleichzeitig die -, die - und die -Taste drücken) öffnet und schließt die JavaScript-Konsole.

Falls du einen Apple-Computer benutzt, kannst du die Konsole mit öffnen und schließen.

Mach dir keine Sorgen über die vielen Warnungen und Fehler, die Du vermutlich siehst, wenn du die JavaScript-Konsole zum ersten Mal öffnest. Sie führt ein Protokoll, ein sogenanntes Log, über all die Ereignisse, die auf einer Webseite oder im ICE Code Editor stattfinden. Wenn es dir zu viele Nachrichten werden, kannst du das Log mit dem Button leeren, auf dem ein durchgestrichener Kreis zu sehen ist.

Die Tastenkombination, mit der die JavaScript-Konsole geöffnet wird, schließt sie auch wieder (lass sie aber bitte in diesem Kapitel geöffnet).

Fangen wir damit an, einfache Sachen kaputt zu machen, über die der ICE Code Editor uns berichten kann.

Fehlersuche im ICE: Das Rote X

Ein rotes X neben deinem Code bedeutet, dass der ICE ein Problem erkennt, das verhindert, dass dein Code ausgeführt wird. Lass uns ein bisschen wirklich mieses JavaScript schreiben, um das einmal zu demonstrieren. Gib unter START CODING ON THE NEXT LINE folgende Zeile ein.

bad()javascript

Das ist wirklich übles JavaScript!

Fragst du dich, wieso? Es ist übel, weil nach den Klammern niemals ein Wort folgen sollte. Wenn du solchen Code schreibst, zeigt der ICE neben der Zeile mit dem Problem ein rotes X, um zu signalisieren, dass diese Zeile korrigiert werden muss. Schiebst du den Mauszeiger über das rote X, wird sogar die eigentliche Fehlermeldung angezeigt, wie etwa »missing; before statement« (fehlendes; vor Statement).

Die Konsole verrät uns, dass hier ein Semikolon fehlt.

Abbildung 2.3 Die Konsole verrät uns, dass hier ein Semikolon fehlt.

Der ICE wird dir nicht verraten, dass du Wörter hinter die Klammern geschrieben hat. Er weiß lediglich, dass am Ende der Zeile Klammern stehen sollten, was hier nicht der Fall war. Als er entdeckte, dass die Zeile nicht beendet worden war, löste er einen Fehler aus mit der Warnung: »He! Du hast das Semikolon am Ende der Zeile vergessen!« Wir müssen selbst herausfinden, wo die Zeile enden sollte.

Folgende Dinge kannst du in deinem Code überprüfen, wenn du ein rotes X siehst:

  • Hast du ein Semikolon vergessen?

  • Falls du auf der Zeile mit dem roten X kein Problem erkennen kannst, überprüfe auch die vorhergehende Zeile. Der ICE weiß nicht immer, wo das Problem beginnt, und liegt manchmal eine oder zwei Zeilen daneben.

Fehlersuche im ICE: Das Gelbe Dreieck

Im Gegensatz zu einem roten X hält ein gelbes Dreieck, das links neben deinem Code auftaucht, die Show nicht auf. Dein Code läuft vermutlich auch dann, wenn einige seiner Zeilen mit gelben Dreiecken markiert sind, allerdings läuft er vielleicht nicht korrekt. Am besten ist es, diese Dreiecke wieder loszuwerden.

Dafür schreiben wir noch ein bisschen schlechtes JavaScript (aber nicht zu schlecht). Entferne zuerst die bad()javascript-Zeile aus dem vorherigen Abschnitt und füge dann die folgenden Zeilen hinzu:

food;
eat(food);

In diesem Fall teilt uns der ICE mit dem gelben Dreieck mit, dass die food-Zeile nichts macht.

Eine Warnung

Abbildung 2.4 Eine Warnung

Wir können das Problem beheben, indem wir die food-Zeile in eine Zuweisung ändern:

food = 'Cookie';
eat(food);

Der ICE sollte die neue food-Zeile akzeptieren und keine Fehler mehr anzeigen. Doch auch wenn der ICE keine Probleme mehr feststellen kann, stimmt mit diesem Code etwas nicht.

Fehlersuche in der Konsole

An dieser Stelle hilft uns die JavaScript-Konsole weiter, weil wir mit ihr sehen, was das Programm tatsächlich macht. Sobald du die Konsole geöffnet hast, siehst du die Fehlermeldung, die dir mitteilt, dass eat() nicht definiert ist.

Der Browser weiß nicht, was mit eat gemeint ist.

Abbildung 2.5 Der Browser weiß nicht, was mit eat gemeint ist.

Als der Browser versuchte, den schlechten JavaScript-Code auszuführen, merkte er, dass es ein Problem gab. Wir befahlen dem Browser in unserem Programm, die Funktion eat() auszuführen, sagten ihm aber nie, wie er das machen soll. Fehler, die gefunden werden, wenn man versucht, den Code auszuführen, heißen Laufzeitfehler (oder Runtime Errors).

Wir werden uns in Kapitel 5, Funktionen: Immer und immer wieder benutzen, näher mit Funktionen befassen. Im Augenblick reicht es aus, zu wissen, dass eine Funktion eine Methode ist, um Code zu schreiben, der immer wieder ausgeführt werden kann.

Die Fehler, die vom ICE mit dem roten X und dem gelben Dreieck gekennzeichnet werden, heißen Compile-Zeit-Fehler (Fehler zur Übersetzungszeit). Compile-Zeit-Fehler werden erfasst, wenn der Computer den Code liest und entscheidet, was er damit machen soll. Der Begriff Übersetzen bezieht sich auf den Computer, der entscheidet, was er mit dem Code machen soll.

Die JavaScript-Konsole hilft uns dabei, Laufzeitfehler zu beheben.

Um dieses Problem zu lösen, wollen wir unserem JavaScript-Programm sagen, wie man Essen isst. Dazu fügen wir eine Funktion hinzu, die nach der Zeile mit eat(food) das Essen erklärt.

food = 'Cookie';
eat(food);
function eat(food) {
console.log(food + "! Nam. Nam. Nam.");
}

Es sollte jetzt keine Compile-Zeit-Fehler im ICE und keine Laufzeitfehler in der JavaScript-Konsole geben, und in der Konsole müsste die Nachricht »Cookie! Nam. Nam. Nam.« auftauchen.

Bevor wir dieses Kapitel beschließen, schauen wir uns noch einige verbreitete Fehler bei der 3D-Programmierung an. Füge den folgenden Code nach der abschließenden geschweiften Klammer der eat()-Funktion hinzu:

var shape = new THREE.SpherGeometry(100);
var cover = new Three.MeshNormalMaterial();
var ball = new THREE.Mesh(shape, cover);
scene.ad(ball);

Du wirst bemerken, dass es für diesen Code im ICE keine Compile-Zeit-Fehler gibt. Der Browser liest den JavaScript-Code und sagt: »Jepp, das sieht für mich wie absolut einwandfreies JavaScript aus. Ich führe das jetzt aus!« Allerdings kommt es zu Problemen, wenn der Code tatsächlich ausgeführt wird, und du findest in der JavaScript-Konsole Laufzeitfehler.

Mögliche Fehlermeldung – Undefined Is Not a Function

Schauen wir uns zuerst einmal an, was schiefgegangen ist. Öffne die JavaScript-Konsole, falls sie noch nicht geöffnet ist. Darin solltest du eine sehr wenig hilfreiche Nachricht sehen.

Fehlermeldungen in der Konsole können verwirrend sein.

Abbildung 2.6 Fehlermeldungen in der Konsole können verwirrend sein.

Diese Nachricht versucht, uns mitzuteilen, dass SphereGeometry falsch geschrieben ist. Überprüfe den Code. Es stellt sich heraus, dass wir ein e vergessen und stattdessen SpherGeometry eingetippt hatten. Die Nachricht in der JavaScript-Konsole hat uns dabei eigentlich nicht viel genützt.

Es gibt hier zwei Probleme, die enträtselt werden müssen. Erstens verrät uns undefined is not a function eigentlich nichts und ist auch nicht leicht zu verstehen. Selbst JavaScript-Experten werden davon verwirrt.

Das zweite Problem ist die Zeilennummer in der Fehlermeldung. In diesem Beispiel bedeutet gamingjs.com:25, dass der Browser glaubt, das Problem sei in Zeile 25 unseres Programms aufgetreten (bei dir könnten die Zeilennummern ein wenig anders sein). Allerdings steht das falsch geschriebene Wort nicht in Zeile 25 im ICE. Unser Problem tritt stattdessen in Zeile 28 auf. Und ja, auch das verwirrt JavaScript-Experten.

Zeilennummern in der Konsole sind nicht immer exakt

Der ICE bemüht sich wirklich, das mit den Zeilennummern in der Konsole richtig zu machen, und manchmal gelingt es ihm auch – es könnte sogar jetzt bei dir stimmen –, aber manchmal kann er auch um einige Zeilen danebenliegen. Beginne deine Suche immer an der exakten Zeilennummer. Falls es nicht so aussieht, als sei der Fehler dort zu finden, prüfe die nächsten benachbarten Zeilen.

Kommen wir zurück zur Fehlermeldung undefined is not a function, die sich in Wirklichkeit auf Zeile 28 im ICE bezieht. Dieser Fehler bedeutet, dass der Browser nach einer Funktion suchte, als er versuchte, unseren Code auszuführen, aber etwas fand, das er nicht kannte. THREE.SpherGeometry war nicht definiert, weil die tatsächliche Funktion THREE.SphereGeometry hieß.

Zum Glück lässt sich dieses Problem leicht beheben, weil wir nur ein e hinzufügen müssen.

Mögliche Fehlermeldung – Three Is Not Defined

Doch selbst nachdem wir SphereGeometry richtig geschrieben haben, erscheint auf dem Bildschirm kein Ball. Irgendetwas stimmt mit unserem Code immer noch nicht.

Wenn du in die JavaScript-Konsole schaust, solltest du so etwas sehen.

Wir kommen der Lösung des Problems schon näher.

Abbildung 2.7 Wir kommen der Lösung des Problems schon näher.

Hier sagt uns die JavaScript-Konsole, dass uns offenbar entfallen ist, dass THREE immer in Großbuchstaben geschrieben werden sollte. So etwas wie Three gibt es nicht; wir haben es jedoch geschrieben, und die JavaScript-Konsole teilt uns das hier mit.

Dieser Fehler ist beim Arbeiten mit der 3D-Bibliothek ziemlich verbreitet. Versuche deshalb am besten, dir das für das nächste Mal zu merken, wenn du den Fehler siehst.

Wir können diesen Fehler beheben, indem wir Three im Code durch THREE ersetzen.

Mögliche Fehlermeldung – Undefined: No Method

Doch auch nachdem wir diese beiden Fehler entfernt haben, ist kein Ball zu sehen. Stattdessen finden wir in der Konsole eine weitere seltsame Fehlermeldung.

Es ist immer noch nicht richtig!

Abbildung 2.8 Es ist immer noch nicht richtig!

Kümmere dich nicht um den Object [object Object]-Teil der Meldung, der uns im Moment nichts Nützliches zu sagen hat.

In diesem Fall sagten wir dem Browser, dass es eine Methode namens ad() gäbe. Allerdings war er nicht in der Lage, irgendwelche Informationen dazu in der Datei zu finden. Die Lösung ähnelt der aus den vorherigen Beispielen. Die Methode, die wir haben sollten, heißt add(), nicht ad(). Mit anderen Worten, wir haben uns schon wieder verschrieben.

Nachdem du diese Zeile korrigiert hast, siehst du endlich einen Ball und die Meldung »Nam. Nam. Nam.« in der JavaScript-Konsole.

Hmm, das schmeckt!

Abbildung 2.9 Hmm, das schmeckt!

Was tun, wenn der ICE kaputt ist?

Es ist überraschend einfach, einen Webbrowser zum Absturz zu bringen. Wenn du eine Kugel mit einer Million Segmenten herstellst, stürzt er ab. Wenn du eine rekursive Funktion ohne Stopppunkt schreibst (darüber reden wir in Kapitel 5), stürzt der Browser ab.

Wenn der Browser kaputt ist, geht der ICE Code Editor auch nicht mehr, oder?

Nun ja, aber das lässt sich leicht beheben: Füge ?e oder ?edit-only der URL hinzu, sodass du unter http://gamingjs.com/ice/?e loslegst. Das ist der Edit-only-Modus für den ICE (Nur-bearbeiten-Modus).

Korrigiere die letzte Sache, die du eingetippt hast, um den ICE abstürzen zu lassen, und entferne dann das Edit-only-Fragezeichen aus der URL. Du bist jetzt zurück bei http://gamingjs.com/ice/. Auch die Vorschau sollte nun wieder zu sehen sein.

Auf manchen Computern musst du vielleicht den Browser-Tab oder das Browserfenster schließen, bevor du das probieren kannst. Du kannst dann ein neues Fenster oder einen neuen Tab öffnen, in den du die ICE-URL für den Edit-only-Modus eingibst. Speziell auf Google Chromebooks läuft der Edit-only-Modus besser, wenn man so vorgeht.

Wie es weitergeht

Wir wissen jetzt, wie wir Formen herstellen können und wo wir nachschauen müssen, wenn etwas schiefgeht. Als Nächstes wollen wir mit unserem ersten Spiel beginnen, indem wir uns einen ganz eigenen Avatar bauen.