# Drehen eines Pfeils im Flug



## Steamer (31. Okt 2010)

Guten Tag,
ich habe seit einigen Wochen in der Schule informatik und wir beschäftigen uns mit Java,genauer,mit dem Programm BlueJ.

Dazu benutzen wir das Buch "Informatik mit Java-Eine Einführung mit BlueJ Band I" von Bernard Schriek.
Falls es jemand zuhause hat,ich bin bei Kapitel 5.7,für die anderen,es geht in großen und ganzen darum darum,ein zuvor programmiertes Dartspiel so zu verändern,dass es einen kleinen "2-Spieler-Modus" beinhaltet,der mit der Tastatur bedient wird.
Der Pfeil soll damit,nachdem er "abgeschossen" wurde im Flug mit den Tasten "l" und "r" in die jeweilige Richtung (links,rechts) um fünf Grad gedreeht werden und danach weiterfliegen.
Ich kann meinen Lehrer aufgrund einer Verhinderung in nächster Zeit nicht fragen,deshalb tu ich´s mal hier.

Ein kleiner Ausschnitt:

```
// Flug des Pfeils
do   
        {
            meinStift.radiere();
            meinStift.zeichneKreis(3);
            meinStift.bewegeUm(-50);
            meinStift.hoch();
            meinStift.bewegeUm(0.1);
            meinStift.normal();
            meinStift.runter();
            meinStift.bewegeUm(50);
            meinStift.zeichneKreis(3);
        } while (meinStift.hPosition()<540); 
// Drehung in Flug
        do
        {

            switch (dieTastatur.zeichen())
            {
                case 'r': case 'R': 
                meinStift.radiere();
                meinStift.zeichneKreis(3);
                meinStift.bewegeUm(-50);
                meinStift.normal();
                meinStift.dreheUm(5);
                meinStift.bewegeUm(50);
                meinStift.zeichneKreis(3);
                break;

                case 'l': case 'L': 
                meinStift.radiere();
                meinStift.zeichneKreis(3);
                meinStift.bewegeUm(-50);
                meinStift.normal();
                meinStift.dreheUm(-5);
                meinStift.bewegeUm(50);
                meinStift.zeichneKreis(3);
                break;
                
                default: 
                meinStift.radiere();
                meinStift.zeichneKreis(3);
                meinStift.bewegeUm(-50);
                meinStift.hoch();
                meinStift.bewegeUm(0.1);
                meinStift.normal();
                meinStift.runter();
                meinStift.bewegeUm(50);
                meinStift.zeichneKreis(3);
                break;
            }

        }while (dieTastatur.wurdeGedrueckt());
```

Mein Problem ist,dass sich der Pfeil im Flug nicht dreht,sondern einfach weiterfliegt.
Der Pfeil soll beim Drehen NICHT weiterfliegen.

MfG
Steamer


----------



## XHelp (31. Okt 2010)

Mach dir ein paar Sysouts rein, um zu sehen was wo wann ausgeführt wird.
Generell sieht die Logik etwas komisch aus. Du musst ja den Pfeil drehen, wenn man eine Taste drückt und nicht den Benutzer fragen, ob er jetzt eine Taste drücken will...


----------



## gman (31. Okt 2010)

Hi,

ich nehme an das das Programm beendet ist, wenn die erste Schleife durchlaufen hat. Somit wird die zweite
Schleife gar nicht wie gewünscht ausgeführt, bzw. hat nicht den gewünschten Effekt.

Kommentier mal die erste do-while-Schleife aus und pass die Bedingung der zweiten do-while-Schleife an.
Ich kenne den Rest von deinem Code nicht, daher kann ich dir nicht genau sagen wie.


----------



## Steamer (31. Okt 2010)

```
import sum.kern.*;
/**
 * @author Marcel Frankreiter
 * @version 01.10.2010
 */
public class Dart7
{
    // Objekte
    Bildschirm derBildschirm;
    Stift meinStift;
    Buntstift meinBuntstift;
    Tastatur dieTastatur;
    Maus dieMaus;

    // Konstruktor
    public Dart7()
    {

        derBildschirm = new Bildschirm(600,300);
        meinStift = new Stift();
        meinBuntstift = new Buntstift();
        dieTastatur = new Tastatur();
        dieMaus = new Maus();
        this.fuehreAus();

    }

    // Dienste
    public void fuehreAus()
    {
        // Aktionsteil
        //Dartscheibe zeichen
        meinStift.bewegeBis(540,150);
        meinStift.zeichneKreis(10);
        meinStift.zeichneKreis(20);
        meinStift.zeichneKreis(30);
        meinStift.zeichneKreis(40);
        //Pfeil zeichnen
        meinStift.hoch();
        meinStift.bewegeBis(20,30);
        meinStift.dreheBis(13.6598);
        meinStift.runter();
        meinStift.bewegeUm(50);
        meinStift.zeichneKreis(3);

        //Pfeil fällt
        do
        if (meinStift.vPosition()<350)
        {
            meinStift.radiere();
            meinStift.zeichneKreis(3);
            meinStift.bewegeUm(-50);
            meinStift.dreheBis(270);
            meinStift.bewegeUm(0.4);
            meinStift.dreheBis(13.6598);
            meinStift.normal();
            meinStift.bewegeUm(50);
            meinStift.zeichneKreis(3);
        }
        else
        {
            meinStift.hoch();
            meinStift.bewegeBis(20,30);
            meinStift.runter();

        }while (!dieMaus.istGedrueckt());

        do
        if (dieMaus.istGedrueckt())
        {
            meinStift.radiere();
            meinStift.zeichneKreis(3);
            meinStift.bewegeUm(-50);
            meinStift.dreheUm(-0.05);
            meinStift.normal();
            meinStift.bewegeUm(50);
            meinStift.zeichneKreis(3);
        }
        else
        {
        } while (dieMaus.istGedrueckt());

        //Pfeil fliegt
        do
        {
            meinStift.radiere();
            meinStift.zeichneKreis(3);
            meinStift.bewegeUm(-50);
            meinStift.hoch();
            meinStift.bewegeUm(0.1);
            meinStift.normal();
            meinStift.runter();
            meinStift.bewegeUm(50);
            meinStift.zeichneKreis(3);
        } while (meinStift.hPosition()<540);
        // Pfeil dreht sich während des Fluges bei Benutzung einer jeweiligen Taste
        do
        {

            switch (dieTastatur.zeichen())
            {
                case 'r': case 'R': 
                meinStift.radiere();
                meinStift.zeichneKreis(3);
                meinStift.bewegeUm(-50);
                meinStift.normal();
                meinStift.dreheUm(5);
                meinStift.bewegeUm(50);
                meinStift.zeichneKreis(3);
                break;

                case 'l': case 'L': 
                meinStift.radiere();
                meinStift.zeichneKreis(3);
                meinStift.bewegeUm(-50);
                meinStift.normal();
                meinStift.dreheUm(-5);
                meinStift.bewegeUm(50);
                meinStift.zeichneKreis(3);
                break;
                
                default: 
                meinStift.radiere();
                meinStift.zeichneKreis(3);
                meinStift.bewegeUm(-50);
                meinStift.hoch();
                meinStift.bewegeUm(0.1);
                meinStift.normal();
                meinStift.runter();
                meinStift.bewegeUm(50);
                meinStift.zeichneKreis(3);
                break;
            }

        }while (dieTastatur.wurdeGedrueckt());

        if (meinStift.vPosition() > 110 && meinStift.vPosition() < 190)
        {
            meinStift.hoch();
            meinStift.bewegeBis(265,75);
            meinStift.runter();
            meinStift.schreibeText("Getroffen");
        }
        else
        {
            meinStift.hoch();
            meinStift.bewegeBis(265,75);
            meinStift.runter();
            meinStift.schreibeText("Daneben");
        }

        meinStift.hoch();
        meinStift.bewegeBis(540,150);
        meinStift.zeichneKreis(10);
        meinStift.zeichneKreis(20);
        meinStift.zeichneKreis(30);
        meinStift.zeichneKreis(40);

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

Das ist mein bisheriger kompletter Code.

EDIT:
@XHelp:
Icfh habe mir schon gedacht,dass es an der while-Bedingung liegt,allerdings weiß ich gerade keine bessere Lösung und kann meinen Lehrer,der übrigens auch der Autor des Buches perönlich ist,die nächsten Wochen nicht fragen.

@gman:
Das Programm ist nach der dritten do-Schleife beendet.
Nach beendigung kommt allerdings der SuM-Fehler "Die Tastatur wurde nicht geprüft."
Das wiederum versteh ich nicht ganz,ich benutze Java jetzt ca. 8 Wochen,90 Minuten pro Woche in der Schule und alles was ich bisher gemacht habe,lief mehr oder weniger Problemlos und da,wo ich wirklich nicht weiterkomme und Hilfe brauche,ist mein Lehrer weg,ironie des Lebens irgendwie...


----------



## XHelp (31. Okt 2010)

Wie gesagt, baue Debug-Ausgaben rein, dann wirst du sehen wo etwas schief läuft.
Und 
	
	
	
	





```
fuehreAus
```
 solltest du nicht unbedingt im Konstruktor ausführen.


----------



## Steamer (31. Okt 2010)

Wieso nicht?
Ich habe es bisher immer benutzt,denn manuell dauerts immer etwas länger.
Und ob ich das Programm jetzt automatisch starten lasse,oder manuell ausführe,ist doch eigentlich egal,oder?


----------



## Gast2 (31. Okt 2010)

Der Konstruktor ist (wie der Name schon sagt  ) dafür da dir ein Objekt zu bauen.
Das sollte man auch so schnell wie möglich erledigen und nach möglichkeit keine oder nur wenige Schleifen dort ausführen.


----------



## Erebos (16. Jun 2011)

Ich würde die ganze Sache anders angehen in dem ich mir Pfeile und co. einzelnt erstelle.
Ich bin noch nicht ganz so weit aber ich denke es ist vom Prinziep schon mal um einiges einfacher.

```
import sum.kern.*;
/**
 * @author Erebos
 * @version 5.2
 */
public class Superdart
{
    // Objekte
    Bildschirm derBildschirm;
    Buntstift meinStift;
    // Konstruktor
    public Superdart()
    {
        derBildschirm = new Bildschirm();
        meinStift = new Buntstift();
        Dartspiel();
    }
public void zeichnePfeil()
{
meinStift.normal();    
meinStift.runter();
    meinStift.bewegeUm(50);
    meinStift.zeichneKreis(2.5);
    meinStift.bewegeUm(-50);
    
    
}
public void radierePfeil()
{
    meinStift.radiere();
    meinStift.runter();
    meinStift.bewegeUm(50);
    meinStift.zeichneKreis(2.5);
    meinStift.bewegeUm(-50);
 
}
public void zeichneZielscheibe()
{
meinStift.bewegeBis(500,200);
        meinStift.runter();
        meinStift.zeichneKreis(5);
        meinStift.zeichneKreis(15);
        meinStift.zeichneKreis(30);
        meinStift.zeichneKreis(50);
        meinStift.hoch();
}
    public void Dartspiel()
    {
        // Aktionsteil mit kleiner Werbung
        derBildschirm.nachVorn();
        meinStift.bewegeBis(500, 20);
        meinStift.runter();
        meinStift.schreibeText("Daneben :-( Platz für ihre Werbung");
        meinStift.hoch();
        zeichneZielscheibe();
        meinStift.bewegeBis(300,400);
        meinStift.dreheUm(45);
       //// meinStift.dreheUm(45);
        do
        {
            zeichnePfeil();
            radierePfeil();
            meinStift.bewegeUm(0.01);
            
            
        }while(meinStift.hPosition()<500);
        zeichneZielscheibe();
    
        meinStift.gibFrei();
        derBildschirm.gibFrei();
    
    }
}
```

Der Pfeil trifft nicht ganz, da ich dieses von unten schräg kommen gerade erst ausprobiert habe.


----------



## Gast2 (16. Jun 2011)

```
public void Dartspiel()
```
 <- Methoden schreibt man klein.
Auch bei dir gilt dass lange Berechnungen/Animationen nicht im Kontruktor ausgeführt werden sollten. Rufe deine Methode dartspiel() auf der Instanz auf die du erstellt hast.

PS:
Meinst du der TO sucht nach über nem halben Jahr immernoch ne lösung?


----------



## Erebos (16. Jun 2011)

Also, ob er immer noch eine Lösung sucht ist fraglich, aber mann muss das Theard ja nicht so unvollständig veraltern lassen. Außerdem interessiert mich dir lösung selbst.
Ich habe das mit den Formalitäten noch nicht ganz raus, da ich selbst noch nicht so viel erfahrung habe. Ich habe das direkt in den Konstruktor reingeschrieben, da es mich nervt, wenn ich die sachen immer einzelnt aufrufen muss.

mfg. Erebos


----------



## Steamer (28. Feb 2012)

Danke euch, habe die Lösung mittlerweile gehabt. 
Achja Leute, ichhatte damals gerade mit Java angefangen,also seit nicht so kritisch, mehr hatten wir da noch nicht gelernt


----------

