# "Kugel" vom Rand anprallen lassen



## Steamer (21. Jan 2011)

Heyho,
ich habe derzeit ein kleines Problem,das mir ziemlich zu schaffen gibt.
Also,zuerst,ich habe Folgensdes aus einem BlueJ-Schülerbuch,da ich mich langsam einarbeiten möchte.
Genauergesagt dieses  hier .


Die momentane Aufgabe lautet,eine Kugel mit Hilfe eines "extended Stift"s zu erzeugen,die sich eigenständig bewegen,löschen(radieren),drehen und zeichnen kann.

Das dazugehörige Hauptprogramm soll eine Art Billardspiel sein,bei der ein "Tisch" gezeichnet wird und in dem sich die Kugel zunächst hin- und herbewegt.

Der Quellcode meines Hauptprogrammes:



```
import sum.kern.*;
/**
 * @author Marcel F.
 * @version 21.01.11
 */
public class Hauptprogramm
{
    // Objekte
    Bildschirm derBildschirm;
    Stift meinStift;
    Kugel meineKugel;
    Maus dieMaus;

    // Konstruktor
    public Hauptprogramm()
    {
        derBildschirm = new Bildschirm(600,500);
        meinStift = new Stift();
        meineKugel = new Kugel();
        dieMaus = new Maus();
        meinStift.bewegeBis(10,10);
        meinStift.zeichneRechteck(500,400);
        this.fuehreAus();
    }

    // Dienste
    public void fuehreAus()
    {
        // Aktionsteil
        meineKugel.start();
        do
        {
            meineKugel.zeichne();
            meineKugel.radiere();
            meineKugel.bewege();
            if (meineKugel.hPosition()>500 +10 -3 && meineKugel.hPosition ()<0 +10 +3)
            {
                meineKugel.drehe();
            }
        } while (!dieMaus.doppelKlick());

        // Aufraeumen
        meineKugel.gibFrei();
        dieMaus.gibFrei();
        meinStift.gibFrei();
        derBildschirm.gibFrei();
    }
}
```


und der Code meiner Kugel



```
import sum.kern.*;
/**
 * @author  Marcel F.
 * @version 21.01.11
 */
public class Kugel extends Stift
{
    // Bezugsobjekte
    private Stift meinStift;

    
    // Attribute

    // Konstruktor
    public Kugel()
    {
     super();
     meinStift = new Stift();
    }

    // Dienste
    public void start()
    {
        meinStift.bewegeBis(250,200);
    }
    public void gibFrei()
    {
        meinStift.gibFrei();
    }
    
    public void zeichne()
    {
        meinStift.zeichneKreis(6);
    }
    
    public void bewege()
    {
        meinStift.bewegeUm(1);  
    }
    public void radiere()
    {
        meinStift.radiere();
        this.zeichne();
        meinStift.normal();
    }
    public void drehe()
    {
        meinStift.dreheUm(180);
    }
}
```


So,nun sitze ich hier seit geschlagenen 3 Stunden dran und probiere und probiere,aber die Kugel prallt einfach nicht ab,sondern sie geht einfach durch den "Rand" des "Tisches" hindurch.

Nunja,ich habe den Read before posting Thread gelesen,aber mir fallen ehrlich gesagt keinerlei alternative Ideen,die ich hier posten könnte ein.

EDIT:
Spoiler entfernt.


----------



## SlaterB (21. Jan 2011)

baue doch einen drehe()-Aufruf ein, der per if bei passender Gelegenheit aktiviert wird,

hast du schon? und warum schaust du dir nicht genauer an, was daran nicht funktioniert?
was haben wir denn da:
[c]if (meineKugel.vPosition()>500 +10 -3 && meineKugel.vPosition ()<0 +10 +3)[/c]
die Position kann man zu einer Variablen v verkürzen, die restlichen Zahlen mal eben zusammenfassen:
[c]if (v > 507 && v < 13)[/c]
das if wird also ausgeführt wenn v ziemlich groß ist UND gleichzeitig auch noch ziemlich klein,
beides zusammen wird wohl nie passieren, ergo hat dieses if wenig Sinn, vielleicht ein ODER einbauen?

das waren nun schwere Gedanken?


----------



## Steamer (21. Jan 2011)

Stimmt,du hast Recht. O_O
Nunja,da war wohl noch was im Kopf was 2 Kapitel vorher war,war ne Dartscheibe.
Und das man das ganze einfach nur zu "v" verkürzen kann,wusste ich bisher nicht,auch habe ich bisher nichts kennengelernt,was "oder" beschreiben würde,also müsste ich es mit 2 "if"-Anweisungen machen.

Vielen Dank,ich werds mal testen.


----------



## SlaterB (21. Jan 2011)

also v gibts auch nur wenn du das vorher definierst, Variablen kann man ja benennen wie man möchte,
das muss überhaupt nicht sein, allgemein sind kurze Variablennamen ja verdächtig:

```
int v = meineKugel.vPosition()
if (v < 0 || v > 500) {

}
```
|| für oder


----------



## Steamer (21. Jan 2011)

Okay,hab das jetzt erstmal folgendermaßen gemacht:


```
do
        {
            meineKugel.radiere();
            meineKugel.bewege();
            if (meineKugel.hPosition() > 500 +10 -3)
            {
                meineKugel.drehe();
            }
            if (meineKugel.hPosition() < 0 +10 +3)
            {
                meineKugel.drehe();
            }

        } while (!dieMaus.doppelKlick());
```

Jetzt habe ich das Problem,das die Kugel nurnoch ruckelt und sich garnicht mehr bewegt.
Falls du dich nun wunderst,wieso aus "v" ein "h" wurde,hab im Übereifer alles mögliche ausprobiert,aber es klappte dennoch nicht.


----------



## SlaterB (21. Jan 2011)

ich kann nun nicht direkt erkennen was das Problem ist,
als nächstes folgt der Universaleinsatz eines Logs, baue System.out.println() ein, so dass du am Ende sämliches Verhalten nachlesen kannst:


```
neuer Schleifendurchlauf, Nummer 415 [Zählung optional]
aktuelle Richtung ist: .. [optional falls feststellbar]
alte Position h = .., v = ..
Bewegung abgeschlossen, neue Position h = .., v = ..
[evtuelle Ausgaben wenn ifs erfulllt] drehe wegen Bedingung1, neue Richtung ist: .. [optional falls feststellbar]
[evtuelle Ausgaben wenn ifs erfulllt] drehe wegen Bedingung2, neue Richtung ist: .. [optional falls feststellbar]

neuer Schleifendurchlauf, Nummer 416
aktuelle Richtung ist: .. 
alte Position h = .., v = ..
usw.
```
wenn zu viele Ausgaben, dann besser doch eine int-Variable nebenher zählen und z.B. nach 10 oder 30 Schritten aufhören,
aber Anfangsposititon und Richtung + Schrittweite so setzen dass innerhalb dieser Zeit was spannendes passiert

oder Thread.sleep(300) zur Verlangsamung nutzen zusammen mit try/catch


----------



## MiMo123 (25. Jan 2012)

haben das selbe vor 5 jahren in informatik behandelt.. hier ist mal einfach meine Musterlösung:


```
import sum.kern.*;
/**
 * @author 
 * @version 
 */
public class Billard01
{
    // Bezugsobjekte

    // Attribute
    private Buntstift hatStift;
    private double geschwindigkeit;
    private double radius;
    private double richtung;
    private Farbe farbe;
     
    // Konstruktor
    public Billard01(double x, double y, double radius, double winkel, int farbe)
    {
        hatStift = new Buntstift();
        this.geschwindigkeit = 6/radius;
        this.radius = radius;
        this.richtung = winkel;
        hatStift.bewegeBis(x, y);
        hatStift.dreheBis(winkel);
        hatStift.setzeFarbe(farbe);
    }

    // Dienste
    public void bewegen()
    {
        loeschen();

        if ( (hatStift.vPosition() < 2+this.radius) || (hatStift.vPosition() > 398-this.radius) )
        {
            hatStift.dreheBis(360 - hatStift.winkel());
        }
        
        if ( (hatStift.hPosition() < 2+this.radius) || (hatStift.hPosition() > 498-this.radius) )
        {
            hatStift.dreheBis(180 - hatStift.winkel());
        }
         
        hatStift.bewegeUm(geschwindigkeit);
        zeichnen();
    }
    
    public void zeichnen()
    {
       
        hatStift.zeichneKreis(radius);
    }
    
    public void loeschen()
    {
        hatStift.radiere();
        hatStift.zeichneKreis(radius);
        hatStift.normal();
    }
    
    public void aufraeumen()
    {
        hatStift.gibFrei();      
    }
    
   

}

Dabei ist 2+this.radius ein Puffer, da die Kugel sonst ab und zu in der Wand hingen blieb, so wie du es beschrieben hast.. naja, so klappts bei mir perfekt
```


----------

