# BlueJ Ufo-Projekt



## Daniel J. (10. Dez 2015)

Hallo Ich soll in der Schule ein Ufo-Spiel programmieren, doch ich komme nicht weiter mit der Bewegungänderung. Zurzeit bewget sich das Ufo nur gerade aus.Doch jetzt soll sich das Ufo auf Tastaturbefehl nach links(a) und rechts(d) bewegen.Hinterher kommen noch andere Klassen hinzu, also nicht wundern,wieso da noch Punkteanzeige etc. steht. Kann mir einer sagen warum sich das Ufo nicht nach rechts oder links bewegt.Hier der Code:

Spielfeld:

```
import sum.kern.*;
/**
* @author Daniel Janson
* @version 1.0 beta
*/
public class Spielfeld {
   // Objekte
   Bildschirm derBildschirm;
   Buntstift meinBuntstift;
   Ufo meinUfo;
   Tastatur dieTastatur;
   Tastatur dieTastatur2;

   // Konstruktor
   public Spielfeld() {
     derBildschirm = new Bildschirm(640,480);
     meinBuntstift = new Buntstift();
     dieTastatur = new Tastatur();
     dieTastatur2 = new Tastatur();
     meinUfo = new Ufo(derBildschirm);
   }

   // Dienste
   public void fuehreAus() {
     // Aktionsteil
     meinUfo.zeichneUfo();
     while(true) {
       meinUfo.radiereUfo();
       meinUfo.bewegeUm(0.001);
       meinUfo.zeichneUfo();
     }
   }

   public void bewege() {
     if(dieTastatur.wurdeGedrueckt()) {
       if(dieTastatur.zeichen()=='a'|| dieTastatur.zeichen() == 'a') {
         meinUfo.dreheLinks();
       } else if (dieTastatur.zeichen()=='d' || dieTastatur.zeichen() == 'd') {
         {
           meinUfo.dreheRechts();
         }
       }
     }
   }
}
```


Ufo:

```
import sum.kern.*;
/**
* @author Daniel Janson
* @version 1.0 Beta
*/
public class Ufo {
   // Objekte
   Bildschirm derBildschirm;
   Buntstift meinBuntstift;
   Tastatur meineTastatur;
   double radius;

   // Konstruktor
   public Ufo(Bildschirm derBildschirm) {
     this.derBildschirm = derBildschirm;
     meinBuntstift = new Buntstift();
     meinBuntstift.bewegeBis(100,derBildschirm.hoehe()/2);
   }

   // Dienste
   public void zeichneViereck() {
     meinBuntstift.bewegeUm(20);
     meinBuntstift.dreheUm(90);
     meinBuntstift.bewegeUm(20);
     meinBuntstift.dreheUm(180);
     meinBuntstift.bewegeUm(20);
     meinBuntstift.dreheUm(270);
     meinBuntstift.bewegeUm(20);
   }

   public void zeichneUfo() {
     meinBuntstift.runter();
     meinBuntstift.setzeFarbe(234);
     meinBuntstift.setzeFuellmuster(5);
     meinBuntstift.zeichneKreis(25);
   }

   /**
   * Radiert das Ufo.
   */
   public void radiereUfo() {
     meinBuntstift.radiere();
     this.zeichneUfo();
     meinBuntstift.normal();
   }

   /**
   * Bewegt das Ufo um angegebene Einheiten.
   * @param move Bezeichnet die Einheiten, um die der Buntstift bewegt wird.
   */
   public void bewegeUm(double move) {
     meinBuntstift.bewegeUm(move);
   }

   /**
   * Bewegt den Buntstift bis zu einer Position.
   * @param xPos Bezeichnet die horizontale Koordinate.
   * @param yPos Bezeichnet die vertikale Koordinate.
   */
   public void bewegeBis(double xPos, double yPos) {
     meinBuntstift.bewegeBis(xPos,yPos);
   }

   public void dreheLinks() {
     meinBuntstift.dreheUm(90);
     meinBuntstift.bewegeUm(0.001);
   }

   public void dreheRechts() {
     meinBuntstift.dreheUm(-90);
     meinBuntstift.bewegeUm(0.001);
   }
}
```


----------



## strußi (10. Dez 2015)

Stichwort keyListener


----------



## Joose (11. Dez 2015)

Bitte in Zukunft Code in Code-Tags posten, danke!
[code=java] /* dein code */ [/code]


----------



## Daniel J. (19. Dez 2015)

@strußi ich soll das Projekt ohne den keyListener machen


----------



## Flown (19. Dez 2015)

Du rufst deine bewege-Methode nie auf. Die müsste statt des mittleren Befehls in der while-Schleife stehen. Und die Zeile die jetzt dort steht, sollte eigentlich in die bewege-Methode integriert werden, wenn keine Taste gedrückt wurde (also ein else-Zweig).


----------



## Daniel J. (21. Dez 2015)

@ist mir am Wochenende selber aufgefallen, torzdem danke für den Tipp. ich hab jetzt noch ein public void gemacht mit der schleife while(true) in der dann "meinUfo.bewege();" steht.Jetzt lässt sich das Ufo(derKreis) bisschen steuern aber nicht ganz.Wenn ich die Taste "a" drücke bewegt der sich nur  ganz wenig nach links,sodass man das nicht merkt. Hab schon daran gedacht, dass wenn der sich nach Links bewegen soll, die andere Schleife abgebrochen werden muss,damit er sich halt nur nach links bewegt un nicht noch dabe geradeaus . Hier der Code, ich entschuldige mich schon mal vorab, wenn das mit dem Code Tag nicht klappen sollte.


```
import sum.kern.*;
import sum.werkzeuge.*;
/**
* @author Daniel Janson
* @version 1.0 beta
*/
public class Spielfeld
{
  // Objekte
  Bildschirm derBildschirm;
  Buntstift meinBuntstift;
  Ufo meinUfo;
  Tastatur dieTastatur;
  Tastatur dieTastatur2;
  Uhr meineUhr;
  double zeit;
  double winkel1;
  double winkel2;
  double bewegen;

  // Konstruktor

  public Spielfeld()
  {
  derBildschirm = new Bildschirm(640,480);
  meineUhr = new Uhr();
  zeit = 1;
  dieTastatur = new Tastatur();
  dieTastatur2 = new Tastatur();
  meinUfo = new Ufo(derBildschirm);
  winkel1=90;
  winkel2=-90;
  bewegen=0.001;
  meinBuntstift = new  Buntstift();
  }

  // Dienste
  public void fuehreAus()
  {
  // Aktionsteil
  meinUfo.zeichneUfo();
  while(true)
  {
  meinUfo.radiereUfo();
  meinUfo.bewegeUm(0.001);
  meinUfo.zeichneUfo();
  }
  }

  public void bewegung()
  {
  while(true)
  {
  meinUfo.bewege();
  }
  }
}
```



```
import sum.kern.*;
/**
* @author Daniel Janson
* @version 1.0 Beta
*/
public class Ufo {
  // Objekte
  Bildschirm derBildschirm;
  Buntstift meinBuntstift;
  Tastatur dieTastatur;
  double radius;
  double winkel1;
  double winkel2;
  double bewegen;

  // Konstruktor
  /**
  * Hier werden die Objekte definiert
  */
  public Ufo(Bildschirm derBildschirm) {
  this.derBildschirm = derBildschirm;
  meinBuntstift = new Buntstift();
  meinBuntstift.bewegeBis(100,derBildschirm.hoehe()/2);
  dieTastatur = new Tastatur();
  winkel1 = 90;
  winkel2 = -90;
  bewegen = 0.001;
  }

  // Dienste  
  /**
  * Hier entsteht das Ufo als Kreis
  * @param 5 Bezeichnet die Farbe die der Kreis hat, hier Gruen
  * @param 5 Bezeichnet das Fuelmuster die der Kreis hat, hier Gefuellt
  */
  public void zeichneUfo() {
  meinBuntstift.runter();
  meinBuntstift.setzeFarbe(5);
  meinBuntstift.setzeFuellmuster(5);
  meinBuntstift.zeichneKreis(30);  
  }

  /**
  * Radiert das Ufo.
  */
  public void radiereUfo() {
  meinBuntstift.radiere();
  this.zeichneUfo();
  meinBuntstift.normal();
  }

  /**
  * Bewegt das Ufo um angegebene Einheiten.
  * @param move Bezeichnet die Einheiten, um die der Buntstift bewegt wird.
  */
  public void bewegeUm(double move) {
  meinBuntstift.bewegeUm(move);
  }

  /**
  * Bewegt den Buntstift bis zu einer Position.
  * @param xPos Bezeichnet die horizontale Koordinate.
  * @param yPos Bezeichnet die vertikale Koordinate.
  */
  public void bewegeBis(double xPos, double yPos) {
  meinBuntstift.bewegeBis(xPos,yPos);
  }
  
  /**
  * Dreht den Buntsift um angegebene Einheiten
  * @param winkel1 bezeichnet den Winkel, um wieviel sich der Buntstift dreht
  */
  public void dreheLinks() {
  meinBuntstift.dreheUm(winkel1);
  }
  
  /**
  * Dreht den Buntsift um angegebene Einheiten
  * @param winkel2 bezeichnet den Winkel, um wieviel sich der Buntstift dreht
  */
  public void dreheRechts() {
  meinBuntstift.dreheUm(winkel2);
  }

  /**
  * Hiermit lässt sich hinterher das Ufo steuern
  * @param winkel1 bezeichnet den Winkel, um wieviel sich der Buntstift dreht
  * @param bewegen bezeichnet um wieviel Einheiten sich der Bunstift bewegt
  * @param winkel2 bezeichnet den Winkel, um wieviel sich der Buntstift dreht
  * @param
  */
  public void bewege()
  {
  if(dieTastatur.wurdeGedrueckt())
  {
  if(dieTastatur.zeichen()=='a')
  {
  meinBuntstift.dreheUm(winkel1);
  meinBuntstift.radiere();
  meinBuntstift.bewegeUm(bewegen);
  this.zeichneUfo();
  meinBuntstift.normal();
  }else if (dieTastatur.zeichen()=='d' || dieTastatur.zeichen() == 'd')
  {
  {
  meinBuntstift.dreheUm(winkel2);
  meinBuntstift.radiere();
  meinBuntstift.bewegeUm(bewegen);
  this.zeichneUfo();
  meinBuntstift.normal();  
  }
  }
  }
  }
}
```


----------



## Daniel J. (12. Jan 2016)

Das geht an Leute aus meinem Kurs, kopiert nicht meinen Code!!!! Herr Stierl wird es wissen wenn ihr meinen Code verwendet.


----------



## Joose (12. Jan 2016)

Achtung: Eine "while(true)" Schleife ist immer eine schlechte Wahl -> verwende konkrete Abbruchbedingungen!

Was dir fehlt ist eine zentrale Spielschleifen (Gameloop). Hier ein Beitrag dazu: http://www.java-gaming.org/index.php?topic=24220.0
(Ja ich weiß die zeigen es auch mit einer "while(true)" Schleife , wichtig ist dabei aber ein Zeitmechanismus, da Computer den Code schneller abarbeitet als er die Grafiken neuzeichnen kann )


----------



## orb1t (13. Jan 2016)

Also das mit der _while(true)_ Schleife ist für den Grundentwurf vollkommen okay und
kann hier ohne weiteres so verwendet werden. Schon allein, weil wir bei BlueJ die VM
per Tastenkombination oder klick beenden können.

Diese "_zentrale Spielschleifen (Gameloop)_" würde ich eher Kerninteraktionsschleifen
nennen und die ist in dem "public void fuehreAus()" durchaus gegeben. Jedenfalls
wenn man, wie wir, mit BlueJ "arbeitet" und die Methoden über die BlueJ-GUI per Mausklick
ausführen kann.

Der keyListener ist in der Klasse "Tastatur" der Sum-Bibliothek enthalten und wird hier auch
verwendet(dieTastatur.zeichen() etc.)

Also ich hab mir mal die Freiheit genommen den Code etwas zu kürzen und die if-Anweisung
durch switch-case zu ersetzen, einfach nur wegen der Übersicht und da man hiermit ganz
einfach noch weitere Tasten mit Funktionen hinzufügen kann.

*Spielfeld.java*:

```
import sum.kern.*;
/**
* @author Daniel Janson (edited by orb1t)
* @version 1.1 beta
*/
public class Spielfeld
{
    // Objekte
    Bildschirm derBildschirm;
    Ufo meinUfo;
    Tastatur dieTastatur;

    // Konstruktor
    public Spielfeld()
    {
        derBildschirm = new Bildschirm(640,480);
        dieTastatur = new Tastatur();
        meinUfo = new Ufo(derBildschirm);
    }

    // Dienste
    public void fuehreAus()
    {
        // Aktionsteil
        meinUfo.zeichneUfo();
        while(true)
        {
            meinUfo.radiereUfo();
            meinUfo.bewegeUm(0.1);
            meinUfo.zeichneUfo();
            if(dieTastatur.wurdeGedrueckt())
            {
                switch(dieTastatur.zeichen())
                {
                    case 'a':
                    meinUfo.dreheLinks();
                    break;
                    case 'd':
                    meinUfo.dreheRechts();
                    break;
                    case '1':
                    //Code ...
                    break;
                    case '2':
                    //Code ...
                    break;
                    default:
                    //Code ...
                    break;
                }
                dieTastatur.weiter();
            }
        }
    }
}
```

*Ufo.java*:

```
import sum.kern.*;
/**
* @author Daniel Janson (edited by orb1t)
* @version 1.1 beta
*/
public class Ufo {
    // Objekte
    Bildschirm derBildschirm;
    Buntstift meinBuntstift;
    Tastatur dieTastatur;
    double radius;
    double winkel;
    double bewegen;

    // Konstruktor
    /**
     * Hier werden die Objekte definiert
     */
    public Ufo(Bildschirm derBildschirm) {
        this.derBildschirm = derBildschirm;
        meinBuntstift = new Buntstift();
        meinBuntstift.bewegeBis(100,derBildschirm.hoehe()/2);
        dieTastatur = new Tastatur();
        winkel = 5;
    }

    // Dienste 
    /**
     * Hier entsteht das Ufo als Kreis
     * @param 5 Bezeichnet die Farbe die der Kreis hat, hier Gruen
     * @param 5 Bezeichnet das Fuelmuster die der Kreis hat, hier Gefuellt
     */
    public void zeichneUfo() {
        meinBuntstift.runter();
        meinBuntstift.setzeFarbe(5);
        meinBuntstift.setzeFuellmuster(5);
        meinBuntstift.zeichneKreis(10); 
    }

    /**
     * Radiert das Ufo.
     */
    public void radiereUfo() {
        meinBuntstift.radiere();
        this.zeichneUfo();
        meinBuntstift.normal();
    }

    /**
     * Bewegt das Ufo um angegebene Einheiten.
     * @param move Bezeichnet die Einheiten, um die der Buntstift bewegt wird.
     */
    public void bewegeUm(double move) {
        meinBuntstift.bewegeUm(move);
    }

    /**
     * Bewegt den Buntstift bis zu einer Position.
     * @param xPos Bezeichnet die horizontale Koordinate.
     * @param yPos Bezeichnet die vertikale Koordinate.
     */
    public void bewegeBis(double xPos, double yPos) {
        meinBuntstift.bewegeBis(xPos,yPos);
    }

    /**
     * Dreht den Buntsift um angegebene Einheiten
     */
    public void dreheLinks() {
        meinBuntstift.dreheUm(winkel);
    }

    /**
     * Dreht den Buntsift um angegebene Einheiten
     */
    public void dreheRechts() {
        meinBuntstift.dreheUm(-winkel);
    }

}
```

P.S.: Wenn das alles bei dir wie gewünscht funktioniert, dann solltest du dich
!dringend! mit der Abbruchbedingung beschäftigen, so dass das Ufo nicht mehr aus
dem Rand fliegt. Abgabe am Montag


----------



## Joose (13. Jan 2016)

orb1t hat gesagt.:


> Also das mit der _while(true)_ Schleife ist für den Grundentwurf vollkommen okay und
> kann hier ohne weiteres so verwendet werden. Schon allein, weil wir bei BlueJ die VM
> per Tastenkombination oder klick beenden können.



Wie oben schon gesagt es ist ein schlechte Wahl. Das heißt aber natürlich nicht das man es nicht verwenden kann.
Ich selbst verwende eine "while(true)" auch wenn ich mal flott etwas testen will. Aber in einer "konkreten" Anwendung (egal ob ich diese nun über die IDE läuft oder nicht) sollte man immer eine Abbruchbedingung deklarieren.
Das man die VM bei BlueJ per Tastenkombi beenden kann, ist kein wirkliches Argument. Einen Prozess kann ich auch einfach per TaskManager killen.


----------



## orb1t (13. Jan 2016)

Joose hat gesagt.:


> Wie oben schon gesagt es ist ein schlechte Wahl. Das heißt aber natürlich nicht das man es nicht verwenden kann.
> Ich selbst verwende eine "while(true)" auch wenn ich mal flott etwas testen will. Aber in einer "konkreten" Anwendung (egal ob ich diese nun über die IDE läuft oder nicht) sollte man immer eine Abbruchbedingung deklarieren.
> Das man die VM bei BlueJ per Tastenkombi beenden kann, ist kein wirkliches Argument. Einen Prozess kann ich auch einfach per TaskManager killen.


Dem habe ich nicht widersprochen. 
Außerdem ist die BlueJ Funktion sehr wohl ein weiteres Argument, 
besonders wenn man auf den Schulrechnern keinen Zugriff auf den 
Taskmanger hat, nichts desto trotz habe ich im weiteren Verlauf 
meines Kommentars auch darauf hingewiesen, dass er sich mit einer 
Abbruchbedingung beschäftigen soll, dennoch danke für deinen Beitrag.


----------

