Billard

 

Nun kommt der eigentliche Einstieg in die objektorientierte Programmierung. Wir spielen mit Bällen bzw. Ballobjekten.

Die Klasse Ball zeichnet einen Kreis, der sich mit einer vorgegebenen Geschwindigkeit in eine vorgegebene Richtung bewegen kann. Dieser Ball verläßt zwangsläufig irgendwann einmal die Zeichenfläche. Wir können natürlich beliebig viele Ballobjekte erzeugen und sich durch das Appletfenster bewegen lassen, aber alle verlassen irgendwann das Fenster.

Nunmehr erzeugen wir dazu eine Klasse Billardtisch, die nichts anderes tut, als auf das Appletfenster ein Rechteck zu zeichnen und interessierten Objekten zu verraten, wie hoch und wie breit dieses Rechteck ist.

Um das Verhalten eines Billardballs zu simulieren, muss ein Ballobjekt die Größe des Tisches abrufen können und von den Rändern abprallen. Unser einfacher Ball kann das nicht. In der Klasse Billardball müssen wir aber jetzt nicht alles wiederholen, was wir schon in der Klasse Ball realisiert haben. Wir definieren einen Billardball einfach als Unterklasse der Klasse Ball (Ball ist dann Oberklasse zu Billardball). Objekte der Unterklasse besitzen alle Merkmale und Fähigkeiten der Oberklasse und ein paar mehr. Ein Billardball wird also gezeichnet und bewegt wie ein Ball, lernt aber dazu noch die Größe des Tisches kennen und prallt an dessen Rändern ab.

 

Auszüge aus dem Quelltext:

public class BillardBall extends Ball{
    private Billardtable knowsTable;
    
    public BillardBall(int pX, int pY, int pR, int pDirection, Color pColor,
                       Billardtable pTable){
        super(pX,pY,pR,pDirection,pColor);
        knowsTable=pTable;
    }
    
    
    
    
    @Override
    public void move(Graphics pG){
        if (!this.getVisible()){            
            if (upperEdge()||bottom())this.setDirection(360-this.getDirection());
            else if (leftEdge()||rightEdge())this.setDirection(180-this.getDirection());
            if (this.getDirection()<0)this.setDirection(this.getDirection()+360);
            super.move(pG);
        }
        else {   
            pause(10);
            clear(pG);
        }
    }
    
    public boolean upperEdge(){
        return this.getY()<=knowsTable.getY()+this.getRadius()+1;
    }
    public boolean bottom(){
        return this.getY()+this.getRadius()>=knowsTable.getY()+knowsTable.getHeight()+1;
    }
    
    public boolean rightEdge(){
        return this.getX()+this.getRadius()>=knowsTable.getY()+knowsTable.getWidth()+1;
    }
    
    public boolean leftEdge(){
        return this.getX()-this.getRadius()<=knowsTable.getX()+1;
    }
    
    
}