Java Problem beim Auslesen der Mauszeigerposition

T

Tobias4Rock

Gast
Hi @ all!

Ich will/muss für die Schule ein Java-Applet schreiben, bei dem eine Kugel immer rechtwinklig an den Seiten reflektiert wird. Das funktioniert auch wunderbar. Jetzt wollte ich das ganze allerdings noch etwas fortführen und daraus so ein Spiel machen, bei dem man unten einen Balken (ein Rechteck) bewegen kann um damit die Kugel vor dem "herausfallen aus dem Spielfeld" zu bewahren, ich hoffe ihr versteht was ich meine.
Relevant ist also nur die x-Koordinate des Mauszeigers. Dies habe ich versucht mit
public void mouseMoved(MouseEvent e)
zu realiesieren und habe dafür etliche verschiedene Ansätze gewählt:
einfach so, in der Haupt-Applet-Klasse
mit Canvas
mit einer extra Klasse, die von Component erbt
mit Threads
und noch ein paarn.

Das Problem ist aber, dass ich noch nicht einmal ein Jahr lang in der Schule Java lerne und auch sonst wenig Programmiererfahrungen habe, jedenfalls komme ich einfach nicht weiter und hatte die Hoffnung, dass vlt hier jemand mir weiterhelfen könnte. :(
Hier mal ein Quellcode, der funktioniert so erstmal perfekt, allerdings eben ohne das zu bewegende Rechteck. Die meisten Lösungsansätze habe ich allerdings wieder rausgelöscht bzw. woanders stehen, da diese ja sowieso nicht zum Erfolg geführt haben:

Code:
import java.awt.*;

import java.awt.event.*;

import java.applet.*;



public class Scheibea extends Applet

{

  //attribute

  public int x_position_zeiger = 20;

  private boolean isStandalone = false;

  Color hintergrundfarbe = Color.cyan;

  

  //  int test = 0;

  public void mouseMoved(MouseEvent e)

  {

    while(/*test < 100*/ true)

    {

      x_position_zeiger = e.getX();

      // test++;

      try {Thread.sleep(10);}

      catch(InterruptedException f) {return;}

    }

  }



  //Parameterwert holen

  public String getParameter(String key, String def)

  {

    return isStandalone ? System.getProperty(key, def) :

      (getParameter(key) != null ? getParameter(key) : def);

  }



  //Das Applet konstruieren

  public Scheibea()

  {

    setBackground(hintergrundfarbe);

  }



  void zeitschleife()

  {

    try {Thread.sleep(20);}

    catch(InterruptedException e) {return;}

  }



  public void paint(Graphics Stift)

  {

    //variabeln

    Rechteck rechteck;

    rechteck = new Rechteck();

    int y = 0;

    int x = 0;

    int breite = 90;

    int hoehe = 90;

    int delta_x = 1;

    int delta_y = 1;

    int zaehler = 0;

    int farbwechsel = 10;

    boolean farbwechsel_an = false;

    double breite_applet = this.getWidth();

    double hoehe_applet = this.getHeight();

    Color farbe1 = Color.red;

    Color farbe2 = Color.yellow;

    Color kugelfarbe = Color.black;



    while(true)

    {

        // wenn rechts

        if(x == breite_applet - breite)

        {

         delta_x = delta_x * (-1);

        }

        // wenn oben

        if(y == 0)

        {

           delta_y = delta_y * (-1);

        }

        // wenn links

        if(x == 0)

        {

           delta_x = delta_x * (-1);

        }

        // wenn unten

        if(y == hoehe_applet - hoehe)

        {

           delta_y = delta_y * (-1);

        }





      while (y <= hoehe_applet - hoehe  && x <= breite_applet - breite && x >= 0 && y>=0)

      {

        Stift.setColor(kugelfarbe);

        //um ausgefranzte raender zu vermeiden,

        //wird der Rand nochmals seperat gezeichnet

        Stift.drawOval(x, y,breite, hoehe);

        Stift.fillOval(x, y,breite, hoehe);

 

 

        /* Versuch zur Auslesung der waagerechten mauszeigerposition,

        methoden lassen sich nicht verschachteln

        

        public void mouseMoved(MouseEvent e)

        {

          x_position_zeiger = e.getX();

        }

        Stift.fillRect(x_position_zeiger, 50,50, 50);   */





        zeitschleife();

        if (farbwechsel_an == true)

        {

          if(zaehler <= farbwechsel)

          {

            Stift.setColor(farbe1);

          }

          if(zaehler >= farbwechsel)

          {

            Stift.setColor(farbe2);

          }

        }



        if (!farbwechsel_an == true)

        Stift.setColor(hintergrundfarbe);

        Stift.drawOval(x, y,breite, hoehe);

        Stift.fillOval(x, y, breite, hoehe);

        zaehler++;

        if(zaehler >= 2 * farbwechsel)

        {

          zaehler = 0;

        }

            y = y + delta_y;

            x = x + delta_x;

      }

            y = y - delta_y;

            x = x - delta_x;

    }

  }





  //Das Applet initialisieren

  public void init()

  {

    try

    {

      jbInit();

    }

    catch(Exception e)

    {

      e.printStackTrace();

    }

  }

  





  //Initialisierung der Komponenten

  private void jbInit() throws Exception

  {

  }



  //Applet-Information holen

  public String getAppletInfo()

  {

    return "Applet-Information";

  }



  //Parameter-Infos holen

  public String[][] getParameterInfo()

  {

    return null;

  }

}







class Rechteck extends Component implements MouseMotionListener

{

  public Rechteck()

  {

    // addMouseMotionListener(this);

  }

  public void mouseMoved(MouseEvent e)

  {

    int x_position_zeiger = e.getX();

    Graphics Stift;

    Stift=getGraphics();

    Stift.setColor(Color.green);

    Stift.fillRect(x_position_zeiger, 100, 10, 10);

  }

  public void mouseDragged(MouseEvent e)

  {



  }

  public void paint(Graphics Stift)

  {



  }

}

Ich hoffe mir kann wer weiterhelfen, wär wirklich total lieb, speziell da wir am Freitag 3 Programme abgeben sollen und ich das ganz gerne dazu tun würde...

Also dann,
Vielen Dank schonmal im Voraus,
Tobias :)
 
Schaff auf jeden Fall mal die While-True-Schleifen ab in Paint() und MouseMoved...

Meiner Meinung nach fehlen dir einfach zu viele Dinge, als dass eine Hilfe hier ein einem Forum wirklich Sinnn macht. Du sagst "wir" müssen 3 Programme abgeben, wende dich doch lieber an Mitstreiter, die das selbe Problem lösen müssen...

Zudem ist das hier auch kein Hausaufgaben-Forum. Wenn du eine spezielle Frage hast, ok, aber hier gibt's kein "Macht mal"...
 
Hi,

danke erstmal für deine Antwort!
Tut mir leid, ich habe mich in der Hinsicht wohl etwas falsch ausgedrückt.
Wir sollen 3 Programme abgeben, ja das stimmt, es würd allerdings vollkommen ausreichen, soweit wie ich bin, der Rest ist rein für mich, als Übung und Spaß am Programmieren. Ich bin also nacher noch genauso daran interessiert wie jetzt...
Die anderen aus meinem Kurs sind noch nicht soweit und mein Informatiklehrer konnte mir irgendwie auch nicht weiterhelfen.
Mit der while-true Schleife in MouseMoved, das war ja sowieso nur son Versuch, das komtm acuh wieder raus, da es so ja anscheinend nicht klappt. Mit der in der paint() Methode wüsste ich jetzt gar nicht was daran so schlimm ist, aber mag ja sein, dass das daran liegt, dass ich mich einfach noch nicht genug auskenne, da magst du wohl recht haben, das kann ich leider auch nicht abstreiten.

Also wenn doch noch wer ne Idee hat oder so, eine vollständige Lösung oder so erwarte ich aber nicht, natürlich nicht, nur son art Tipp denn im Moment komme ich einfach nicht selber drauf.

LG,
Tobias
 
Generell würde ich es so machen, dass bei einem MouseMoved nur irgendwo eine Variable gesetzt wird mit der eigentlichen Mausposition und ansonsten dort nichts passiert (man sollte auch generell in solchen Stellen keine langen Berechnungen ausführen, da dadurch das Programm sehr "unrund" laufen kann).
Das eigentliche Spiel läuft in einem Thread ab ("Game Loop"), der erst alle notwendigen Berechnungen ausführt (und dabei die gespeicherte Mausposition nutzt!) und dann das Bild neu zeichnet (repaint). Anschließend schläft er ein paar Millisekunden, so dass man auf 25 Bilder pro Sekunde (oder mehr) kommt und dann gehts wieder von vorne los. Dabei ist natürlich darauf zu achten, dass das Ganze richtig threadsafe ist (synchronized usw.) was für einen Anfänger sicher nicht trivial ist.

Es gibt einige Tutorials zum Thema Spieleprogrammierung in Java (und ich glaub auch ein Buch), z.B. http://www.java-applet.de/BallBewegung.html beschreibt auch die Technik, welche ich am Anfang meines Posts erwähnt habe und es geht dort sogar um ein recht ähnliches Thema. Es gibt natürlich noch viele weitere, einiges sind dabei natürlich auf Englisch.
Schau dir am Besten mal ein paar Tutorials durch und wenn du konkrete Fragen hast, werden wir dir gerne versuchen zu helfen!
 
Zuletzt bearbeitet:
Gut, dankeschön BerniG,
ich glaube das hat mir durchaus schonmal weitergeholfen, ich werd mich bei Gelegenheit dann noch genauer da einarbeiten, danke für den Link auch!
Es geht dann wohl doch nicht ganz so einfach, wie ich mir das gedacht hatte, schade aber nicht so schlimm.
Also gut,
LG,
Tobias
 
Zurück
Oben