Es gibt auch hier nicht DIE richtige Lösung. Ein mögliches Lösungsprojekt mit zwei Spielfeldern mit jeweils einer Fangbox und zwei Bällen findet sich hier.
Das zu dieser Lösung gehörende UML-Diagramm:
Die Kugel hat ein zusätzliches Attribut (als kleine graue Gedächtniszelle) : kenntFangbox.
Damit die Kugel sich die Fangbox merken kann, gibt es die Methode lerneFangboxKennen
Um die geistige Flexibilität der Leserin/des Lesers zu stärken, unterscheidet sich die Klasse TSpielfeld ein wenig von den bisherigen Lösungen und auch von der Klasse TFangbox.
In der Kugelklasse muss nun natürlich die bewege-Methode geändert werden.
Dies ist der bisherige Code der bewege- Methode Am neuen Teil ist nur die Bedingung für das Anhalten interessant: Der linke Rand der Kugel ist rechts vom linken Rand der Fangbox. Der rechte Rand der Kugel ist links vom rechten Rand der Fangbox. Der obere Rand der Kugel ist unterhalb des oberen Randes der Fangbox. Der untere Rand der Kugel ist oberhalb des unteren Randes der Fangbox. stehen bleiben |
procedure TKugel.bewege; begin //Kugel an alter Stelle löschen self.loesche; //Kugle an neue Stelle bewegen xPos := xPos + zxGeschwindigkeit; yPos := yPos + zyGeschwindigkeit; //Kugel neu zeichnen self.zeichne; //Reflexion an den Spielfeldrändern if self.xPos - 11 <= kenntSpielfeld.GibXPos then self.SetzexGeschwindigkeit(self.zxGeschwindigkeit*(-1)); if self.xPos + 11 >= kenntSpielfeld.GibXPos + kenntSpielfeld.GibBreite then self.SetzexGeschwindigkeit(self.zxGeschwindigkeit*(-1)); if self.yPos - 11 <= kenntSpielfeld.Gibypos then self.SetzeyGeschwindigkeit(self.zyGeschwindigkeit*(-1)); if self.yPos + 11 >= kenntSpielfeld.Gibypos + kenntSpielfeld.gibHoehe then self.SetzeyGeschwindigkeit(self.zyGeschwindigkeit*(-1)); //Fangbox if (self.xPos - 11 > kenntFangbox.gibLinkenRand) and (self.xPos + 11 < kenntFangbox.gibRechtenRand) and (self.yPos - 11 > kenntFangbox.gibOberenRand) and (self.yPos + 11 < kenntFangbox.gibUnterenRand) then begin self.zXGeschwindigkeit := 0; self.zYGeschwindigkeit := 0; end; end; |
Download des zugehörigen Projektes : Billard mit Fangbox
Es gibt auch hier nicht DIE richtige Lösung. Ein mögliches Lösungsprojekt mit zwei Spielfeldern mit jeweils einer Reflexionsbox und zwei Bällen findet sich hier.
Das zu dieser Lösung gehörende UML-Diagramm entspricht dem der Fangboxen. Daher hier nur einige Erläuterungen zum geänderten Code der bewege-Methode:
Dies ist der bisherige Code der bewege- Methode Am neuen Teil ist nur die Bedingung für die Reflexion interessant: Am linken Rand der Raflexionsbox braucht nur refelektiert werden, wenn die Kugel sich nach rechts bewegt der rechte Rand der Kugel ist rechts vom linken Rand der Box. die Mitte der Kugel ist aber noch links vom linken Rand der Box. Der Kugelmittelpunkt ist höchstens die Hälfte ihres Radius oberhalb des oberen Randes der Box und höchstens die Hälfte ihres Radius unterhalb des unteren Randes der Box. Nur die horizontale Geschwindigkeit wird umgekehrt. für die anderen Ränder analog. |
procedure TKugel.bewege; begin //Kugel an alter Stelle löschen self.loesche; //Kugle an neue Stelle bewegen xPos := xPos + zxGeschwindigkeit; yPos := yPos + zyGeschwindigkeit; //Kugel neu zeichnen self.zeichne; //Reflexion an den Spielfeldrändern if self.xPos - 11 <= kenntSpielfeld.GibXPos then self.SetzexGeschwindigkeit(self.zxGeschwindigkeit*(-1)); if self.xPos + 11 >= kenntSpielfeld.GibXPos + kenntSpielfeld.GibBreite then self.SetzexGeschwindigkeit(self.zxGeschwindigkeit*(-1)); if self.yPos - 11 <= kenntSpielfeld.Gibypos then self.SetzeyGeschwindigkeit(self.zyGeschwindigkeit*(-1)); if self.yPos + 11 >= kenntSpielfeld.Gibypos + kenntSpielfeld.gibHoehe then self.SetzeyGeschwindigkeit(self.zyGeschwindigkeit*(-1)); //Reflexionsbox //Reflexion am linken Rand: if (self.zxGeschwindigkeit > 0) and (self.xPos > kenntReflexionsbox.gibXPos-11) and (self.xPos < kenntReflexionsbox.gibXPos) and (self.yPos < kenntReflexionsbox.gibYPos + kenntReflexionsbox.gibHoehe+5) and (self.yPos > kenntReflexionsbox.gibYPos-5) then self.zXGeschwindigkeit := -self.zXGeschwindigkeit; //rechter Rand if (self.zxGeschwindigkeit < 0) and (self.xPos < kenntReflexionsbox.gibxPos + kenntReflexionsbox.gibBreite+11) and (self.xPos > kenntReflexionsbox.gibxPos + kenntReflexionsbox.gibBreite) and (self.yPos < kenntReflexionsbox.gibyPos + kenntReflexionsbox.gibHoehe+5) and (self.yPos > kenntReflexionsbox.gibyPos-5) then self.zxGeschwindigkeit := -self.ZxGeschwindigkeit; //oberer Rand if (self.zYGeschwindigkeit > 0) and (self.yPos > kenntReflexionsbox.gibyPos-11) and (self.yPos < kenntReflexionsbox.gibyPos) and (self.xPos < kenntReflexionsbox.gibxPos + kenntReflexionsbox.gibBreite+5) and (self.xPos > kenntReflexionsbox.gibxPos-5) then self.ZyGeschwindigkeit := -self.ZyGeschwindigkeit; //unterer Rand if (self.zYGeschwindigkeit < 0) and (self.yPos < kenntReflexionsbox.gibyPos + kenntReflexionsbox.gibHoehe+11) and (self.yPos > kenntReflexionsbox.gibyPos + kenntReflexionsbox.gibHoehe) and (self.xPos < kenntReflexionsbox.gibxPos + kenntReflexionsbox.gibBreite+5) and (self.xPos > kenntReflexionsbox.gibxPos-5) then self.zyGeschwindigkeit := -self.ZyGeschwindigkeit; end; |
Download des zugehörigen Projektes : Billard mit Reflexionsbox
![]() |
|
![]() |
|
![]() |
Zur
nächsten Seite
![]() |
© 2005 GK 11 If und G. Kubitz Hannah-Arendt-Gymnasium, Lengerich Letztes Update: 17.11.04 |