BlueJ Ufo-Projekt

Daniel J.

Mitglied
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:
Java:
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:
Java:
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);
   }
}
 
Zuletzt bearbeitet von einem Moderator:

Flown

Administrator
Mitarbeiter
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.

Mitglied
@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.

Java:
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();
  }
  }
}


Java:
 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();  
  }
  }
  }
  }
}
 
Zuletzt bearbeitet von einem Moderator:

Joose

Top Contributor
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 :p, wichtig ist dabei aber ein Zeitmechanismus, da Computer den Code schneller abarbeitet als er die Grafiken neuzeichnen kann ;))
 

orb1t

Neues Mitglied
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:
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:
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 ;)
 
Zuletzt bearbeitet:

Joose

Top Contributor
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

Neues Mitglied
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.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Frage zu einem Projekt "Einarmiger Bandit" 3 Walzen / 9 Zeichnungen BLUEJ Spiele- und Multimedia-Programmierung 10
M BlueJ Schach Steuerung programmieren Spiele- und Multimedia-Programmierung 28
F BlueJ Ufospiel Probleme Spiele- und Multimedia-Programmierung 1
U java blueJ BMI rechner Spiele- und Multimedia-Programmierung 8
H BlueJ Frage Spiele- und Multimedia-Programmierung 13
W Hilfe bei Pong mit Bluej Spiele- und Multimedia-Programmierung 4
P [Projekt] Star Four - Sci-Fi RPG Spiele- und Multimedia-Programmierung 0
P [Projekt] Radioplayer Spiele- und Multimedia-Programmierung 2
Androbin "Projekt Library" Spiele- und Multimedia-Programmierung 3
M Minecraft weitere Java Entwickler für minecraft projekt gesucht Spiele- und Multimedia-Programmierung 0
A Jogl-Projekt unter 32-Bit kompiliert und unter 64-Bit ausführen, geht das überhaubt ?? Spiele- und Multimedia-Programmierung 9
Kenan89 Kleines Projekt für Java Spiele- und Multimedia-Programmierung 5
F "Doodle Jump" Projekt Spiele- und Multimedia-Programmierung 8
1 [Java3D] komplexes Projekt? Spiele- und Multimedia-Programmierung 10
T Uni Projekt - Spiel Set Spiele- und Multimedia-Programmierung 13
J Java Projekt Black Jack Spiele- und Multimedia-Programmierung 25
Developer_X Amerika-der Erste Kontakt- Projekt- Wer hat Lust mitzumachen? Spiele- und Multimedia-Programmierung 21
D STARTHILFE gesucht !! Java-Projekt für Schule !! Spiele- und Multimedia-Programmierung 73
hdi Das java-forum.org 2D-Game Projekt/Tutorial Spiele- und Multimedia-Programmierung 6
hdi Suche Partner für Hobby-Projekt: 2D-Strategie-Spiel Spiele- und Multimedia-Programmierung 86
P Suche Leute für ein Hobby-Projekt (Browser Game) Spiele- und Multimedia-Programmierung 4
I Projekt x3j: XML für J3D: Interesse? Spiele- und Multimedia-Programmierung 3
D 4 gewinnt Projekt Spiele- und Multimedia-Programmierung 2
S Gesucht: Java Profis für MMOG Projekt Spiele- und Multimedia-Programmierung 2
T Größeres Spiele Projekt - einige Fragen zur Umsetzung Spiele- und Multimedia-Programmierung 3
H Das JAVA-FORUM.ORG/DE-Spiel Projekt Spiele- und Multimedia-Programmierung 228

Ähnliche Java Themen

Neue Themen


Oben