Lernpfad:Hehomon/13: Unterschied zwischen den Versionen
Jneug (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Jneug (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
| (12 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
{{ | {{NNavigation}} | ||
Das Spiel (der sogenannte ''Game-Loop'') funktioniert nun im Grunde schon, aber wir haben noch eine Menge feinarbeit vor uns (in der Spieleentwicklung spricht man vom ''polishing'', also dem ''polieren'' des Spiels. | Das Spiel (der sogenannte ''Game-Loop'') funktioniert nun im Grunde schon (abgesehen davon, dass es bisher keinen Sieger gibt), aber wir haben noch eine Menge feinarbeit vor uns (in der Spieleentwicklung spricht man vom ''polishing'', also dem ''polieren'' des Spiels. | ||
Wir können zwar Fähigkeiten einsetzen, allerdings sehen wir noch nicht die Auswirkungen. Das ändern wir nun. | Wir können zwar Fähigkeiten einsetzen, allerdings sehen wir noch nicht die Auswirkungen. Das ändern wir nun. | ||
== Lebensbalken == | |||
Die Anzeige der Lebenspunkte soll als farbiger Balken unter dem Angreifen und Verteidiger erscheinen. | Die Anzeige der Lebenspunkte soll als farbiger Balken unter dem Angreifen und Verteidiger erscheinen. | ||
| Zeile 11: | Zeile 11: | ||
[[Bild:EA_Lebensbalken.jpg|center|600px]] | [[Bild:EA_Lebensbalken.jpg|center|600px]] | ||
Die Balken bestehen in der einfachsten Variante aus zwei Rechtecken. Einem schwarzen Hintergrund (bzw. Rahmen) und einem farbigen Rechteck, dessen Breite den Anteil der vorhandenen Lebenspunkte anzeigt. | |||
Wir wollen also einen weiteren ''Knoten'' an unseren ''Spielbaum'' hängen, an den wir wiederum die beiden Rechtecke als ''Blätter'' anhängen. Zusammen mit den Bildern der Hehomons (die ja auch ''Blätter'' im ''Spielbaum'' sind), sieht der Baum danach so aus: | Wir wollen also einen weiteren ''Knoten'' an unseren ''Spielbaum'' hängen, an den wir wiederum die beiden Rechtecke als ''Blätter'' anhängen. Zusammen mit den Bildern der Hehomons (die ja auch ''Blätter'' im ''Spielbaum'' sind), sieht der Baum danach so aus: | ||
[[Datei: | [[Datei:EA_Tree_4.png|center|600px]] | ||
Erstellt eine Klasse <code>Lebensbalken</code> sieht wie folgt aus: | |||
<syntaxhighlight lang="java"> | |||
import ea.*; | |||
public class Lebensbalken extends Knoten { | |||
private Hehomon hehomon; | |||
private Rechteck balkenHg, balkenLp; | |||
public Lebensbalken( Hehomon pHehomon, int pX, int pY ) { | |||
hehomon = pHehomon; | |||
balkenHg = new Rechteck(pX,pY,206,11); | |||
balkenHg.farbeSetzen("Schwarz"); | |||
balkenLp = new Rechteck(pX+3,pY+3,200,5); | |||
balkenLp.farbeSetzen(new Farbe(255, 255, 255)); | |||
aktualisiereDaten(); | |||
add(balkenHg); | |||
add(balkenLp); | |||
} | |||
public void aktualisiereDaten() { | |||
double lpAnteil = ((double)hehomon.getLp()/hehomon.getLpMax()); | |||
balkenLp.breiteSetzen( (int)((double)(balkenHg.getBreite()-6) * lpAnteil) ); | |||
balkenLp.farbeSetzen( | |||
new Farbe( | |||
255 - ((int)(255.0 * lpAnteil)), | |||
(int)(255.0 * lpAnteil), | |||
0 | |||
) | |||
); | |||
} | |||
} | |||
</syntaxhighlight> | |||
{{Aufgabe:Start}} | |||
# Übernehmt die Klasse <code>Lebensbalken</code> in euer Projekt. | |||
# Analysiert den Quelltext der Klasse und versucht ihre Funktionsweise zu verstehen. Insbesondere folgende Punkte: | |||
#* Wie wird die Klasse <code>Rechteck</code> benutzt? (Schaut in der [https://docs.engine-alpha.org/v3.2.0/ Dokumentation der {{Engine-Alpha}}] nach.) | |||
#* Wozu ist die Methode <code>aktualisiereDaten</code> da? | |||
#* Es gibt zwei Methoden, Farben festzulegen. Welche sind dies und wie werden sie benutzt, um die Farbe des Lebensbalken zu verändern? | |||
#* Wie wird die Länge des Balkens jeweils bestimmt? | |||
# Erzeugt zwei Objekte der Klasse <code>Lebensbalken</code> in der <code>Arena</code> (je einer für jede Hehomon) und fügt sie dem Arena-Knoten hinzu (<code>add()</code>). | |||
{{Aufgabe:End}} | |||
{{Lösung:Start}} | |||
<syntaxhighlight lang="java"> | |||
import ea.*; | |||
public class Arena extends Knoten { | |||
private Hehomon angreifer; | |||
private Hehomon verteidiger; | |||
private Lebensbalken lebenAngreifer; | |||
private Lebensbalken lebenVerteidiger; | |||
public Arena( Hehomon pAngreifer, Hehomon pVerteidiger ) { | |||
Bild hintergrund = new Bild(0, 0, "images/hintergrund.jpg"); | |||
add(hintergrund); | |||
angreifer = pAngreifer; | |||
Bild bildAngreifer = new Bild(0, 50, "images/"+angreifer.getBild()); | |||
add(bildAngreifer); | |||
lebenAngreifer = new Lebensbalken(angreifer, 100, 450); | |||
add(lebenAngreifer); | |||
verteidiger = pVerteidiger; | |||
Bild bildVerteidiger = new Bild(400, 50, "images/"+verteidiger.getBild()); | |||
add(bildVerteidiger); | |||
lebenVerteidiger = new Lebensbalken(verteidiger, 525, 450); | |||
add(lebenVerteidiger); | |||
} | |||
} | |||
</syntaxhighlight> | |||
{{Lösung:End}} | |||
== Aktualisierung der Daten == | |||
Um die Größe des Lebensbalkens jeweils anzupassen muss die Methode <code>aktualisiereDaten</code> immer dann aufgerufen werden, wenn sich die Lebenspunkte eines hehomons geändert haben. Um es einfacher zu machen, rufen wir die Methode jedes Mal auf, wenn eine Fähigkeit eingesetzt wird. | |||
{{Aufgabe:Start}} | |||
# Ergänzt eine Methode <code>public void aktualisiereDaten()</code> in der Klasse <code>Arena</code>, die <code>aktualisiereDaten()</code> der beiden Lebensbalken aufruft. | |||
# Ruft die neue Methode der <code>Arena</code> jedes Mal auf, nachdem der Angreifer oder der Verteidiger eine seiner Fähigkeiten eingesetzt hat. | |||
{{Aufgabe:End}} | |||
{{Lösung:Start}} | |||
In der Klasse <code>Arena</code>: | |||
<syntaxhighlight lang="java" highlight="5"> | |||
public void aktualisiereDaten() { | |||
lebenAngreifer.aktualisiereDaten(); | |||
lebenVerteidiger.aktualisiereDaten(); | |||
} | |||
</syntaxhighlight> | |||
In der Klasse <code>Spiel</code>: | |||
<syntaxhighlight lang="java" highlight="5"> | |||
@Override | |||
public void tasteReagieren(int tastencode) { | |||
if( tastencode == Taste.A ) { | |||
angreifer.angriff1(verteidiger); | |||
view.aktualisiereDaten(); | |||
warten(500); | |||
verteidigerAmZug(); | |||
} else if ( tastencode == Taste.S ) { | |||
// usw. | |||
} | |||
} | |||
// Genauso in der Methode verteidigerAmZug() | |||
</syntaxhighlight> | |||
{{Lösung:End}} | |||
Aktuelle Version vom 25. März 2020, 22:25 Uhr
Das Spiel (der sogenannte Game-Loop) funktioniert nun im Grunde schon (abgesehen davon, dass es bisher keinen Sieger gibt), aber wir haben noch eine Menge feinarbeit vor uns (in der Spieleentwicklung spricht man vom polishing, also dem polieren des Spiels.
Wir können zwar Fähigkeiten einsetzen, allerdings sehen wir noch nicht die Auswirkungen. Das ändern wir nun.
Lebensbalken
Die Anzeige der Lebenspunkte soll als farbiger Balken unter dem Angreifen und Verteidiger erscheinen.
Die Balken bestehen in der einfachsten Variante aus zwei Rechtecken. Einem schwarzen Hintergrund (bzw. Rahmen) und einem farbigen Rechteck, dessen Breite den Anteil der vorhandenen Lebenspunkte anzeigt.
Wir wollen also einen weiteren Knoten an unseren Spielbaum hängen, an den wir wiederum die beiden Rechtecke als Blätter anhängen. Zusammen mit den Bildern der Hehomons (die ja auch Blätter im Spielbaum sind), sieht der Baum danach so aus:
Erstellt eine Klasse Lebensbalken sieht wie folgt aus:
import ea.*;
public class Lebensbalken extends Knoten {
private Hehomon hehomon;
private Rechteck balkenHg, balkenLp;
public Lebensbalken( Hehomon pHehomon, int pX, int pY ) {
hehomon = pHehomon;
balkenHg = new Rechteck(pX,pY,206,11);
balkenHg.farbeSetzen("Schwarz");
balkenLp = new Rechteck(pX+3,pY+3,200,5);
balkenLp.farbeSetzen(new Farbe(255, 255, 255));
aktualisiereDaten();
add(balkenHg);
add(balkenLp);
}
public void aktualisiereDaten() {
double lpAnteil = ((double)hehomon.getLp()/hehomon.getLpMax());
balkenLp.breiteSetzen( (int)((double)(balkenHg.getBreite()-6) * lpAnteil) );
balkenLp.farbeSetzen(
new Farbe(
255 - ((int)(255.0 * lpAnteil)),
(int)(255.0 * lpAnteil),
0
)
);
}
}
- Übernehmt die Klasse
Lebensbalkenin euer Projekt. - Analysiert den Quelltext der Klasse und versucht ihre Funktionsweise zu verstehen. Insbesondere folgende Punkte:
- Wie wird die Klasse
Rechteckbenutzt? (Schaut in der Dokumentation der Engine-Alpha nach.) - Wozu ist die Methode
aktualisiereDatenda? - Es gibt zwei Methoden, Farben festzulegen. Welche sind dies und wie werden sie benutzt, um die Farbe des Lebensbalken zu verändern?
- Wie wird die Länge des Balkens jeweils bestimmt?
- Wie wird die Klasse
- Erzeugt zwei Objekte der Klasse
Lebensbalkenin derArena(je einer für jede Hehomon) und fügt sie dem Arena-Knoten hinzu (add()).
import ea.*;
public class Arena extends Knoten {
private Hehomon angreifer;
private Hehomon verteidiger;
private Lebensbalken lebenAngreifer;
private Lebensbalken lebenVerteidiger;
public Arena( Hehomon pAngreifer, Hehomon pVerteidiger ) {
Bild hintergrund = new Bild(0, 0, "images/hintergrund.jpg");
add(hintergrund);
angreifer = pAngreifer;
Bild bildAngreifer = new Bild(0, 50, "images/"+angreifer.getBild());
add(bildAngreifer);
lebenAngreifer = new Lebensbalken(angreifer, 100, 450);
add(lebenAngreifer);
verteidiger = pVerteidiger;
Bild bildVerteidiger = new Bild(400, 50, "images/"+verteidiger.getBild());
add(bildVerteidiger);
lebenVerteidiger = new Lebensbalken(verteidiger, 525, 450);
add(lebenVerteidiger);
}
}
Aktualisierung der Daten
Um die Größe des Lebensbalkens jeweils anzupassen muss die Methode aktualisiereDaten immer dann aufgerufen werden, wenn sich die Lebenspunkte eines hehomons geändert haben. Um es einfacher zu machen, rufen wir die Methode jedes Mal auf, wenn eine Fähigkeit eingesetzt wird.
- Ergänzt eine Methode
public void aktualisiereDaten()in der KlasseArena, dieaktualisiereDaten()der beiden Lebensbalken aufruft. - Ruft die neue Methode der
Arenajedes Mal auf, nachdem der Angreifer oder der Verteidiger eine seiner Fähigkeiten eingesetzt hat.
In der Klasse Arena:
public void aktualisiereDaten() {
lebenAngreifer.aktualisiereDaten();
lebenVerteidiger.aktualisiereDaten();
}
In der Klasse Spiel:
@Override
public void tasteReagieren(int tastencode) {
if( tastencode == Taste.A ) {
angreifer.angriff1(verteidiger);
view.aktualisiereDaten();
warten(500);
verteidigerAmZug();
} else if ( tastencode == Taste.S ) {
// usw.
}
}
// Genauso in der Methode verteidigerAmZug()