Kapitel 1 Lektion 11 – Themen und Grafiken
Stunde #1-21: Themen (Threads)
Bisher haben wir in Java immer eine sehr einfache und generelle Regel befolgt, wenn wir den Run Knopf gedrückt haben, ist unser Programm von oben nach unten durchgelaufen, außer bei einer Schleife.
Bei der Spieleentwicklung benötigt man jedoch mehrere Prozesse, die simultan ablaufen und genau hier kommen uns die verschiedenen Themen (Threads) zu gute.
Das Wort Thread bedeutet, dass wir einen Prozess abhandeln. Wenn wir nun mehrfache Threads haben, werden verschiedene Prozesse simultan ausgeführt.
Wie erstellen wir nun einen Thread?
Die Methode ist ähnlich der Random Methode. Um ein zufälliges Objekt zu erstellen, nutzen wir folgenden Code:
[crayon-62c280ecaa433641359853/]
Und ein Thread wird folgendermaßen erstellt:
[crayon-62c280ecaa43f530682549/]
Somit haben wir einen Thread namens Thread erstellt. Aber anderst als bei Random müssen wir nun noch eines zusätzlich machen. Threads benötigen eine run() Methode, welche wir direkt in die obige Zeile einfügen.
Beispiel 1: Threads
1. Wir fügen geschweifte Klammern hinzu
[crayon-62c280ecaa444269361835/]
2. Innerhalb dieser geschweiften Klammern, werden wir die run() Methode platzieren, erinnert euch, dies ist zwingend notwendig. Dieses Vorgehen ist etwas anders als zuvor, stellt euch hierbei einfach die Hierarchie vom Java Code vor:
[crayon-62c280ecaa448439450554/]
3. Wenn wir nun wollen, dass dieser Thread startet, müssen wir dies auch Java mitteilen. Es gibt einen Code, der bereits in Java eingebaut ist, der das ausführt: .start();
[crayon-62c280ecaa44d482957503/]
4. Wenn unser Thread nun gestartet ist, mit der Hilfe von .start(); sucht Java nach der Thread run Methode und beginnt diese auszuführen. Momentan ist unserer Thread leer, also fügen wir ein wenig hinzu:
[crayon-62c280ecaa451600494158/]
5. Wenn wir nun unserer Thread starten würden, mit thread.start(); würden wir folgendes sehen:
[crayon-62c280ecaa455099749958/]
6. Ein Thread alleine bringt keinem etwas, also schreiben wir einen zweiten. So würde der volle Code aussehen:
[crayon-62c280ecaa459567058794/]
Lasst uns jetzt einen Blick darauf werfen, was genau hier geschieht. Wenn Java beginnt, dieses Programm durch zu laufen, schaut es als Erstes nach der Main Methode. Diese beinhaltet 4 Blöcke.
Der erste Block erstellt einen Thread namens thread und erstellt eine run Methode. Der zweite Block erstellt einen Thread namens threadTwo und erstellt eine run Methode. Der dritte Block startet den Thread thread und der vierte startet den threadTwo.
Ausgabe:
[crayon-62c280ecaa45e414506871/]
Irgendwie sind hier aber keine simultanen Prozesse am Laufen, sondern alles nacheinander?
Warum das so ist, werden wir im Kapitel 2 genauer behandeln.
Stunde #1-22: Grafik (Graphics)
Menschen mögen eine tolle Grafik, mit der sie interagieren können. Funktionalität ist sehr wichtig hierbei. Wir reden bei der Grafik von GUI (graphical user interface) bzw. grafische Benutzeroberfläche.
Wir werden heute nur einen Bruchteil von dem ansprechen, was uns bei diesem Thema erwartet, wir können dann aber immerhin schon etwas graphisches darstellen. Wir reden hier aber erstmal von Bildern. Grafik, wie sie in Spielen verwendet wird, ist etwas komplizierter.
Heute werden wir als Erstes ein Fenster abbilden, welches Bilder darstellen kann. Danach werden wir versuchen, auch wirklich Bilder darzustellen.
Als Erstes erstellen wir eine neue Klasse mit dem Namen GrafikDemo.
[crayon-62c280ecaa463125257095/]
Nun wenden wir unser Wissen aus der letzten Lektion an. Um Bilder anzeigen zu lassen, müssen wir die Klasse erweitern, also nutzen wir hier Inheritance, dazu benötigen wir extends JFrame:
[crayon-62c280ecaa467107294146/]
Nun wird uns Eclipse einen Fehler bringen, diesen können wir auf 2 Arten lösen:
1. STRG + Shift + O
2. Wir gehen mit dem Mauszeiger über das Wort JFrame und importieren so das Nötige:
Nun müssten wir folgenden Stand haben:
[crayon-62c280ecaa46c564148421/]
Eines der ersten Dinge, die wir gelernt haben, war, das Klassen Pläne oder Entwürfe von Objekten sind. Wir haben uns aber nie darüber unterhalten, wie das wirklich funktioniert.
Heute werden wir mit der GrafikDemo Klasse ein Objekt erzeugen, genauso wie wir oben ein Thread erzeugt haben. Um dies zu bewerkstelligen, müssen wir einen Konstrukteur (constructor) verwenden. Ein Konstrukteur ist einfach eine Anleitung zum Erstellen eines Objekts.
[crayon-62c280ecaa470320452105/]
Dieser Code schaut, wenn er ausgeführt wird, nach der Main Methode. In dieser Main Methode ist ein Statement:
[crayon-62c280ecaa475871237768/]
Wenn dieses Statement ausgeführt wird, erstellen wir ein GrafikDemo Objekt mit dem Konstrukteur aus der GrafikDemo Klasse. Der Name des Objekts ist demo. Momentan ist der Konstrukteur aber noch leer:
[crayon-62c280ecaa479633877567/]
Also wird bei der Ausführung nichts ausgeführt. Nun werden wir dem Konstrukteur den nötigen Code hinzufügen. Dies werden wir tun, indem wir aus der Super Klasse JFrame ein Statement importieren.
[crayon-62c280ecaa47d648532936/]
Die erste Zeile erstellt einen Titel für das zu erstellende Fenster. Das zweite gibt die Größe des Fensters in Pixeln an. Die dritte Zeile stellt sicher, dass das Fenster auch angezeigt wird. Die letzte Zeile ermöglicht es, das Programm zu beenden, sollte das Fenster geschlossen werden.
Nun sollten wir folgenden Code haben:
[crayon-62c280ecaa481895778612/]
Jetzt starten wir das Programm mit run und es öffnet sich folgendes Fenster:
Wichtig: Der Startpunkt (0,0) vom Koordinatensystem ist OBEN LINKS im Fenster, es ist nicht unten Links. Das bedeutet der Y Wert wird größer, je weiter runter wir auf dem Bildschirm gehen.
Um ein Bild anzeigen zu lassen, müssen wir nur einfach eine weitere Methode hinzufügen:
[crayon-62c280ecaa486094369007/]
Hier müssen wir Graphics importieren, also bittet tut dies.
Diese Methode wird nun alles zeichnen, was wir ihr sagen, in dem Fenster welches wir erstellt haben. Wir werden nun ein paar einfache Statements lernen.
Das g bedeutet, dass diese Statements am Objekt g ausgeführt werden.
g.clearRect(int x, int y, int width, int height); – erstellt ein Rechteck mit der momentanen Farbe, am Punkt (x,y) mit der Höhe und Breite.
g.setColor(Color c); – benennt die momentane Farbe von g als Farbe c.
g.drawString(String str, int x, int y); – zeichnet jeden Text am Punkt (x,y).
g.drawRect(int x, int y, int width, int height); – zeichnet ein Rechteck am Punkt (x,y) mit der Höhe und Breite.
Lasst uns das mal an unserem Programm zeigen:
[crayon-62c280ecaa48b459083460/]
Wir nehmen den Code Color.White, Color.BLUE und COLOR.Black von der Color Super Klasse aus der Java Bibliothek, also müssen wir diese noch importieren. Wie das geht, wisst ihr ja?
Nun sind wir fertig mit unserem Programm und es sieht wie folgt aus:
[crayon-62c280ecaa490249450757/]
Das Ergebnis sieht wie folgt aus:
Und damit haben wir unsere erste Grafik gezeichnet und beenden hiermit die Grundlagen von Java und werden weiter gehen zu Kapitel 2 Erstellen eines Spiels.
Falls ihr Fragen habt, immer raus damit, ich helfe euch sehr gerne. Hinterlasst bitte einfach einen Kommentar.
Teilt diese Seite mit euren Freunden und besucht uns mal auf Facebook und auf Google+, das würde dieser Seite wirklich weiterhelfen, danke sehr. Auch ein Klick auf die Werbung hilft dabei, diese Seite am Laufen zu halten.
Quelle: Original Anleitung auf englisch von Kilobolt Studios
Lektion 10 – Inheritance und Interface Kapitel 2 Erstellen eines Spiels
Hallo
ich habe ien Problem mit dem JFrame. Ich habe immer ein unterringeltes JFrame und ales dazugehörige, wenn ich mit der Maus draufgehe kommt folgendes:
Access restriction: The type JFrame is not accessible due to restriction on required library C:\Program Files\Java\jre1.8.0_25\lib\rt.jar
Die Datei ist vorhanden. Was kann ich tun. Das Programm läuft zwar trotzdem aber ich habe jedesmal am Anfang die Fehlermeldung.
Vielen Dank schonmal
Hallo
danke für die verständlichen Tutorials. Bisher hat alles sehr gut geklappt, aber bei
thread.start();
bekomme ich eine Fehlermeldung die lautet: The method start() is undefined for the type ThreadIch nutze Eclipse aus dem adt bundle
Grüße
import javax.swing.JFrame;
public class GrafikDemo extends JFrame {
//Der Konstrukteur
public GrafikDemo(){
}
//alle Klassen benötigen eine Main Methode
public static void main(String args[]){
//Wir erstellen ein GrafikDemo Objekt in der Main Methode
//Das sollte uns bekannt sein, von Random und Threads
GrafikDemo demo = new GrafikDemo();
}
}
Der Kommentar „alle Klassen benötigen eine Main Methode“ ist so leider nicht richtig. Vielmehr benötigt jedes Programm eine main-Methode, da der Programmablauf mit dieser beginnt.
Es würde ebenso funktionieren die main-Methode in eine separate Klasse (z.B. public class Programmstart) zu packen und den ganzen Rest in die Klasse GrafikDemo, die dann keine main-Methode mehr enthält.
Gruß
Chris
Warum muss die paint Funktion/Methode nicht aufgerufen werden damit sie zeichnet?
Irgendwie will mir das nicht so ganz einleuchten.
gruß ptr
Hallo
Der Code wird von oben nach unten gelesen, als erstes wird die GrafikDemo()-Methode aufgerufen, ist das Programm damit fertig ruft es automatisch die nächste Methode auf. In diesem Fall ist es die paint(Graphics g)-Methode. Diese wird auch von oben nach unten abgearbeitet, bis das Programm damit fertig ist und die main(String args[])-Methode aufruft.
Es wird also der Code von oben nach unten aufgerufen, ist eine Methode fertig kommt die nächste.
Rufe ich innerhalb einer Methode, eine andere Methode auf, so wird es diese abgehandelt und dann kehrt das Programm wieder zur aufrufenden Methode zurück.
Ich hoffe ich konnte es verständlich erklären?
Grüße
Dies ist so leider nicht richtig! Die Methoden werden nicht der Reihe nach aufgerufen.
Nach dem Programmstart wird immer erst die Methode „main“ ausgeführt. In „main“ wird die Klasse „GrafikDemo“ instanziiert.
Durch das Instanzieren wird der Code im Konstruktor ausgeführt. Die Methode „paint“ gehört zur Klasse „JFrame“. Durch „GrafikDemo extends JFrame“ gehören alle Methoden und Eigenschaften von JFrame nun auch der Klasse „GrafikDemo“. Die Methode „paint“ wird durch ein sogenanntes „Event“ ausgelöst. Also ein Ereignis, das immer dann aufgerufen wird wenn das Fenster neu gezeichnet wird.
Das läßt sich einfach mit folgendem Code zeigen:
int n = 0;
public void paint(Graphics g) {
n++;
g.drawString(„Nummer: “ + n, 200, 400);
}
Wenn du jetzt die Fenstergröße mit der Maus veränderst, wird paint aufgerufen und n wird hoch gezählt.
Gruß
Bernd
Hallo Bernd
Danke für das richtig stellen, du hast natürlich recht und meine Ausführung stimmt so nicht.
Danke sehr
Grüße
Danke für die Erklärung, ich hatte mich eben auch gefragt, warum paint() nicht explizit aufgerufen werden muss!