www.r-krell.de |
Webangebot für Schule und Unterricht, Software, Fotovoltaik und mehr |
Willkommen/Übersicht > Informatik > Informatik mit Java, Teil b) > Java-Autorennen
Autorennen für zwei Personen
Nach dem Webstart erscheint links oben ein Extra-Fenster mit den beiden Autos:
Taste [S] drücken, um Straße / Fenster sichtbar zu machen bzw. neu zu zeichnen.
Wer seine Taste [R] oder [B] schneller bzw. öfter drückt, gewinnt!
Wenn die Java-JRE installiert ist, können Sie das Programm jetzt sofort ausführen:
Hier klicken zum Webstart des Autorennens |
Danach Öffnen von Autorennen.jnlp (mit Java(TM) Webstart Launcher (Standard))
wählen/bestätigen
und bei evtl. Sicherheitswarnung vor der Ausführung von Formel1_Start das Risiko akzeptieren und OK drücken.
Wenn Sie außerdem gefragt werden, ob Sie eine Desktop- und eine Startmenüverknüpfung
anlegen wollen,
sollten Sie zustimmen, wenn Sie das Autorennen auch nach Verlassen dieser Webseite nochmal spielen wollen.
Wird nach dem Klick Autorennen.jnlp herunter geladen oder werden Sie gefragt, womit Sie Autorennen.jnlp
öffnen wollen oder ob/wohin Sie die Datei
speichern wollen, haben Sie entweder kein Java installiert oder ihr Browser (z.B. Opera) unterstützt keinen Webstart.
Im letzten Fall empfiehlt sich nachfolgend der Download der .jar-Datei:
Sie können das Autorennen auch als ausführbare Java-Datei Autorennen(r-krell.de).jar (54 kB) herunter laden und später lokal auf Ihrem Rechner starten (Java-Umgebung JRE vorausgesetzt). Die Ausführung als Applet im Browser wird von mir hingegen nicht mehr angeboten: Gründe, Abhilfe und alle Downloads (in neuem Tab)
Nachfolgend der Quelltext des Autorennens „Formel 1", der auf vier Dateien verteilt ist:
Außerdem wird dargestellt, wie früher ein Applet aus einer Webseite aufgerufen werden konnte bzw. wie heute der Webstart ermöglicht wird:
zum Inhaltsverzeichnis (oben) / zum Seitenende
// Auto fürs Formel1-Autorennen:
// R. Krell, 9/2003 -- Java-JDK + stiftUndCo
// http://www.r-krell.de
import stiftUndCo.*;
import java.awt.*; // für Color
public class Formel1_Auto
{
private BuntStift stift = new BuntStift();
private String name;
private int x, y;
public Formel1_Auto (int xPos, int yPos, Color farbe, String bezeichnung)
{ // Konstruktor
x = xPos; // füllt Datenfelder mit den übergebenen Werten ..
y = yPos;
name = bezeichnung;
stift.setzeFarbe (farbe);
zeichneAuto (true); // .. und zeichnet Auto erstmalig
}
private void zeichneAuto (boolean sichtbar)
{
if (sichtbar)
{
stift.normal();
}
else
{
stift.radiere();
}
stift.hoch();
stift.bewegeBis (x, y);
stift.runter();
stift.bewegeBis (x+42, y);
stift.bewegeBis (x+1, y-12);
stift.bewegeBis (x, y); //..Karosserie
stift.hoch();
stift.bewegeBis (x+8, y-2);
stift.zeichneKreis (7); // Hinterrad
stift.bewegeBis (x+33, y);
stift.zeichneKreis (5); // Vorderrad
}
public void fahreUm (int deltaX)
{
zeichneAuto (false); // löscht altes Auto
x = x + deltaX;
zeichneAuto (true); // zeichnet neues Auto
}
public int wo ()
{
return (x+42); // x-Position der Spitze des Autos
}
public String wer ()
{
return (name);
}
}
zum Inhaltsverzeichnis (oben) / zum Seitenende
// Rennstrecke fürs Formel1-Autorennen:
// R. Krell, 9/2003 -- Java-JDK + stiftUndCo
// http://www.r-krell.de
import stiftUndCo.*;
public class Formel1_Strecke
{
Bildschirm gelände;
BuntStift stift;
int x0, x1, y0;
public Formel1_Strecke (int xStart, int xZiel, int yStart)
{ // Konstruktor :
x0 = xStart; // füllt Datenfelder ..
x1 = xZiel;
y0 = yStart;
gelände = new Bildschirm (x1+20, y0+200,
"Autorennen -- [S]=(wieder) sichtbar machen) -- www.r-krell.de");
stift = new BuntStift(); // .. und erzeugt Bildschirn und Stift
}
public void zeichneStrecke()
{
gelände.löscheAlles(); // für nochmaligen Start
stift.bewegeBis (x0, y0); // zeichnet Straße
stift.runter();
stift.bewegeBis (x1, y0);
stift.hoch();
stift.bewegeBis (x0, y0+50);
stift.runter();
stift.bewegeBis (x1, y0+50);
stift.hoch();
stift.bewegeBis (x0, y0+100);
stift.runter();
stift.bewegeBis (x1, y0+100);
stift.hoch();
stift.bewegeBis (x0, y0+120); // beschriftet Start und Ziel
stift.schreibe ("Start");
stift.bewegeBis (x1-20, y0+120);
stift.schreibe ("Ziel");
stift.bewegeBis(175,200); // Spielanleitung
stift.schreibe ("Tasten [R] und/oder [B] drücken!");
}
}
zum Inhaltsverzeichnis (oben) / zum Seitenende
// Renn-Steuerung fürs Formel1-Autorennen:
// R. Krell, 9/2003 -- Java-JDK + stiftUndCo
// http://www.r-krell.de
import stiftUndCo.*;
public class Formel1_Rennen
{
Formel1_Strecke monza = new Formel1_Strecke (10, 500, 50);
Formel1_Auto ferrari, williams;
Tastatur taste;
BuntStift stift;
public void spielen ()
{
do
{
monza.zeichneStrecke();
ferrari = new Formel1_Auto (10, 80, Farbe.ROT, "Der rote Ferrari");
williams = new Formel1_Auto (10,130, Farbe.BLAU, "Der blaue BMW-Williams");
taste = new Tastatur ();
stift = new BuntStift();
rennen();
siegerEhrung ();
} while (nochmal());
}
private void rennen ()
{
while ((ferrari.wo()<500)&&(williams.wo()<500))
// Autos bewegen, solange keins am Ziel
{
if (taste.wurdeGedrueckt())
{
switch (taste.zeichen())
{
case 'r' : ;
case 'R' : ferrari.fahreUm (2); break; // Taste [R]: ferrari
case 'b' : ;
case 'B' : williams.fahreUm (2); break; // Taste [B]: williams
case 's' : ;
case 'S' : monza.zeichneStrecke(); // Taste [S]: alles nochmal ..
ferrari.fahreUm (0); //.. ohne Bewegung zeichnen,
williams.fahreUm (0); //.. weil Fenster verdeckt war
}
}
}
}
private void siegerEhrung ()
{
stift.bewegeBis (50,180); // löscht Spielanleitung
stift.setzeFarbe (Farbe.WEISS);
stift.setzeFuellMuster(Muster.GEFUELLT);
stift.zeichneRechteck(450,30);
stift.setzeFarbe (Farbe.SCHWARZ);
stift.bewegeBis(100,200); // nennt Gewinner
if (ferrari.wo()>=500)
{ // wenn ferrari vorne steht
stift.schreibe (ferrari.wer()+" hat gewonnen");
}
else
{
stift.schreibe (williams.wer()+" hat gewonnen");
}
}
private boolean nochmal ()
{
stift.schreibe (" -- [N]=Neustart, [E]=Ende");
char zchn;
do // do-Schleife: Wartet auf Taste [N] oder [E]
{
while (!taste.wurdeGedrueckt()); // nichts tun: Warten, auf Taste
zchn = taste.zeichen();
if ((zchn == 's')||(zchn == 'S')) // evtl. noch bei Taste [S]
{ // Hinweis auf erwartete Eingabe
stift.bewegeBis(140,200);
stift.schreibe("Rennen beendet -- [N]=Neustart, [E]=Ende");
}
} while ((zchn!='e')&&(zchn!='E')&&(zchn!='n')&&(zchn!='N'));
return ((zchn=='n')||(zchn=='N')); // true: nochmal Neustart gewünscht
}
}
zum Inhaltsverzeichnis (oben) / zum Seitenende
// Startdatei fürs Formel1-Autorennen:
// R. Krell, 9/2003 -- Java-JDK + stiftUndCo
// http://www.r-krell.de
public class Formel1_Start extends java.applet.Applet
{
public void init() // Start als Applet bzw. ..
{
Formel1_Rennen rennSpiel = new Formel1_Rennen();
rennSpiel.spielen();
}
public static void main (String[] s) //.. als Application
{
Formel1_Rennen rennSpiel = new Formel1_Rennen();
rennSpiel.spielen();
}
}
zum Inhaltsverzeichnis (oben) / zum Seitenende
Hier die wesentlichen Elemente einer HTML-Seite, die das Applet aufruft - wie in der Quelltext-Ansicht des HTML-Editors phase 5 angezeigt (Bezugsquelle siehe meine Java-Seite a)). Leider unterstützen seit ca. 2016 viele Browser keinen Applet-Aufruf mehr.
Inzwischen (seit etwa 2016) unterstützen die meisten Browser keine Applets mehr. Jetzt ist die Webstart-Ausführung angesagt (oder das Herunterladen und der lokale Start), wie nachfolgend beschrieben:
zum Inhaltsverzeichnis (oben) / zum Seitenende
Um das Autorennen per Webstart auszuführen (das Rennen wird nicht mehr im, sondern nur noch vom Browser gestartet), reicht es, dass in der Startdatei Formel1_Start.java die main-Methode für eine Application steht. Alle kompilierten .class-Dateien werden dann - hier zusammen mit den Dateien für stiftUndCo - am besten aus dem Javaeditor heraus in eine .jar-Datei gepackt (der Javaeditor erzeugt auf Knopfdruck F5 bzw. per Menübefehl Start > Jar-Datei > Erzeugen eine .jar-Datei mit allen Klassen aus dem aktuellen Verzeichnis und mit einem passenden Manifest-Text). Auf Umlaute und Leerzeichen sollte im Dateinamen verzichtet werden! Grundsätzlich ist aber eine .jar-Datei nur ein umbenanntes .zip-Archiv, sodass sich der Inhalt der .jar-Datei nach Umbenennen in .zip auch leicht kontrollieren oder ergänzen lässt, bevor man die Archiv-Endung wieder in .jar zurück benennt. Diese .jar-Datei kann zum Download angeboten und auf jedem System mit Java-Runtime-Umgebung JRE ohne Weiteres (meist einfach per Doppelklick) lokal gestartet werden.
Für den Webstart ist neben dem Programm in der .jar-Datei aber noch eine zusätzliche Datei nötig, die sich als xml-Datei auch mit einem einfachen Texteditor erzeugen lässt, aber nachher statt .txt die Endung .jnlp kriegen muss (xml = eXtended Markup Language = die grundsätzliche Vereinbarung, Informationen zwischen so genannten Tags [<Tag>..</Tag>] hierarchisch anzuordnen; jnlp = Java Network Launching Protokoll = die spezielle Vorgabe, welche Informationen eine zum Webstart vorgesehene .jar-Datei begleiten sollen):
Neben dem Ursprungsort und der URL der jnlp-Datei, dem Titel des Programms, dem Autor (auch kostenlose Anbieter müssen im Verkäufer-Tag stehen!) und zwei Beschreibungen sind drei weitere Zeilen bemerkenswert:
Am Ende des Informations-Abschnitts wird mit
<offline-allowed/>
zugelassen, dass das im Browser gestartete Autorennen auch nach Verlassen meiner Webseite im Java-Cache des abrufenden Surfers gespeichert bleibt
und später vom diesem auch ohne Internet-Verbindung wieder gespielt werden kann. Zusätze könnten noch regeln, wann/wie nach Updates
im Netz gesucht werden soll. Auf dem Rechner des Spielers wird beim ersten Webstart für den Offline-Modus meist ein Eintrag "Autorennen" im
Startmenü angelegt (der oft sogar noch bleibt, wenn der Spieler seinen Java-Cache ausdrücklich löscht. Dann sollte man auch den
Menüeintrag entfernen. Manchmal wird beim ersten Webstart mit einer Integrationswarnung gefragt, ob Verknüpfungen auf dem Desktop und im
Startmenü angelegt werden sollen, und der Benutzer kann das auch ablehnen). Fehlt die Offline-Erlaubnis, muss zur Ausführung des
Autorennens immer wieder die Webseite aufgesucht werden.
Durch den Eintrag
<default/>
im Sicherheits-Abschnitt werden keine Festlegungen getroffen, sodass die Angaben im Manifest der .jar-Datei bzw. die Java-Sicherheitseinstellungen
des Benutzers verwendet werden. Alternativ könnte auch <sandbox/> für eine sichere Ausführung mit stark eingeschränkten
Rechten oder <all-permissions/> für die Ausführung mit Zugriff auf das Dateisystem des Spieler-Computers stehen. Im letzten Fall
sollte eine gleiche Erlaubnis im Manifest der .jar-Datei stehen und die .jar-Datei signiert sein.
Zum Schluss wird in der Anwendungsbeschreibung der .jnlp-Datei der Name der Java-Start-Datei genannt (die die main-Methode enthält): wie im oben abgedruckten Quelltext ist das Formel1_Start.
In der Webseite wird jetzt alles sehr einfach: Es gibt keinen speziellen Applet-Code mehr, sondern einfach einen ganz normalen Hyperlink zur .jnlp-Datei (s.u. in den Zeilen 11 bis 13):
Beim Klick auf den Link "Hier klicken zum Werbstart des Autorennens" wird aber nicht die jnlp-Datei geöffnet bzw. angezeigt, sondern das dort beschriebene Autorennen gestartet - wenn der Surfer eine Java-Umgebung auf seinem Rechner hat (und der Browser den Webstart unterstützt). Sonst wird Autorennen.jnlp herunter geladen oder der Benutzer wird gefragt, womit er Autorennen.jnlp öffnen will oder ob er es herunter laden will. Beides nützt nichts - ohne Java und ohne die .jar-Datei kann man das Autorennen nicht ausführen!
zurück zur Seite „Informatik mit Java, Teil b)"