Dartscheibe?

Versus

Mitglied
Heyho @ all,

wir lernen derzeit, gerade angefangen, Java in der Schule.

Leider hatten wir Lehrermangel, sodass uns ein Lehrer zugeteilt wurde, der selber keine Ahnung von dem Ganzen hat.

Ich persönlich programmiere gern, und mach deshalb mehr als die Anderen, bin auch schon einiges weiter als meine Mitschüler.

Nun steht in meinem Buch, welches mit SuM-Bibliotheken arbeitet, dass ich eine Dartscheibe programmieren soll.

So weit, so gut.

Nun soll der Pfeil, dessen Bewegung aus dem Löschen und Neu-Zeichnen besteht, erst runterfallen, und auf Mausklick richtung Dartscheibe rasen.

Das ,Auf-Die-Dartscheibe-Fliegen' allein klappt soweit, das Fallen alleine auch.
Nur beides zusammen nicht.

D.h. der Pfeil fällt zwar runter, reagiert aber nicht auf den Mausklick - warum ?
Irgendwelche Verbesserungsvorschläge ?
Das Problem ist, dass das Buch echt zu wenig erklärt, und somit Dinge abverlangt, die ein wirklicher Programmieranfänger niemals lösen könnte. ;)

Also dann mal hier mein Code:

Java:
import sum.kern.*;
/**
 * @author 
 * @version 
 */
public class dart2
{
    // Objekte
    Bildschirm derBildschirm;
    Stift meinStift;
    Maus dieMaus;

    // Konstruktor
    public dart2()
    {
        derBildschirm = new Bildschirm(600,400);
        meinStift = new Stift();
        dieMaus = new Maus();
    }

    // Dienste
    public void fuehreAus()
    {
        meinStift.bewegeBis(500,200);
        meinStift.zeichneKreis(10);
        meinStift.zeichneKreis(20);
        meinStift.zeichneKreis(30);
        meinStift.zeichneKreis(40);
        meinStift.hoch();
        meinStift.dreheUm(190);
        meinStift.bewegeUm(450);
        meinStift.dreheUm(170);
        meinStift.runter();
        meinStift.bewegeUm(35);
        meinStift.zeichneKreis(3);
        do
        {
            meinStift.radiere();
            meinStift.zeichneKreis(3);
            meinStift.bewegeUm(-35);
            meinStift.dreheBis(270);
            meinStift.bewegeUm(0.1);
            meinStift.dreheBis(0);
            meinStift.normal();
            meinStift.bewegeUm(35);
            meinStift.zeichneKreis(3);
        }
        while (meinStift.vPosition() < 399);
     if (dieMaus.istGedrueckt())
     {
        do
        {
        meinStift.radiere();
        meinStift.zeichneKreis(3);
        meinStift.bewegeUm(-35);
        meinStift.bewegeUm(1);
        meinStift.normal();
        meinStift.bewegeUm(35);
        meinStift.zeichneKreis(3);
       }
       while (meinStift.hPosition() < 500 && meinStift.vPosition() > 200);
      }
    }
}

Vom Prinzip ist dies so aufgebaut, dass erst die Dartscheibe und der Pfeil erzeugt werden.
Dann wird in der ersten Do-While Schleife das Fallen des Pfeiles erzeugt.
In der If-Abfrage und somit in der 2. Schleife muss nurnoch die Richtung des Pfeils, in die er fliegt, angepasst werden.
Allerdings reagiert er kein Stück auf meinen Mausklick.
Warum nicht ?

Bin für jede Hilfe dankbar. ;)

Versus
 
G

Gast2

Gast
Ich nehme an dass du die Methode führeAus() aus dem EDT laufen lässt.
Der EDT ist dann blockiert und kann nicht auf weitere aktionen (z.b. mausevents) reagieren.
=> Die Bewegung des Pfeils in nen eigenen Thread auslagern
 

Versus

Mitglied
Kann mir das jemand anhand eines Beispiels erklären?

Ich mein Wikipedia verallgemeinert das echt ziemlich, und in EDT selbst kommt auch ,,Thread'' vor, weswegen ich dies ebenfalls nicht verstehe.

Ein Thread (auch: Aktivitätsträger oder leichtgewichtiger Prozess) bezeichnet in der Informatik einen Ausführungsstrang oder eine Ausführungsreihenfolge in der Abarbeitung eines Programms.

Das einzigste, was ich jetzt irgendwie mit Thread verbinden würde, wäre eben das fuehreAus() selbst. :/
 

Blakh

Bekanntes Mitglied
Naja das ist ein Ausführungsstrang für dein Programm, wie ein Forum-Thread eine Nachrichtenabfolge ist .... Dein Programm läuft vom Startpunkt bis zum Endpunkt. Wenn du eine While-Schleife in dem EDT hast, dann hängt dein Programm darin und eventuell geworfene Events werden erst dann ausgeführt, wenn die Methode mit der while-Schleife fertig ist.

Deshalb musst du deine While-Schleife in einem anderen Thread auslagern, der "parallel" ausgeführt wird, damit Events mit dem EDT abgearbeitet werden können.
 
Zuletzt bearbeitet:

Blakh

Bekanntes Mitglied
Argh sorry .... war doof erklärt ... natürlich die ganze Methode und nicht nur die while-Schleife. Das MouseClick-Event wird abgearbeitet, sobald die Methode fertig ist.

Es passiert bei dir folgendes: Die While-Schleife wird ausgeführt (Dart fällt nach unten? k.a. nicht nachgeschaut :) ), danach fragst du ob die Maus getätigt wurde. Nein -> Das MouseClickEvent konnte nocht nicht im Thread bearbeitet werden, denn die Methode wird durchlaufen. -> Methode fertig -> EDT kann wieder Events handlen -> MouseClickEvent
 
Zuletzt bearbeitet:

Versus

Mitglied
Sorry, aber ich verstehs echt nicht. :/

Der macht doch erst die Dartscheibe, dann den Pfeil.
Dann arbeitet er die 1.While-Schleife ab, bei der der Pfeil fällt.
Dann kommt die If-Abfrage, die er ja nicht annimmt. :/

Was genau muss er noch vorher abarbeiten?
 

Blakh

Bekanntes Mitglied
Um mal bildlich zu erklären: Ein Thread ist ein Mensch, der Sachen abarbeiten kann. Dabei handelt es sich um einen Mann, d.h. er kann nur eine Sache zur selben Zeit tun. Du sagst ihm also: Arbeite die Methode fuehreAus() ab. Während er das macht, kommt ein anderer und sagt: " Eh .. die Maus wurde geklickt!". Da antwortet der Kerl: " Mom, ich bin grad an der Methode. Das mit der mauss mach ich, wenn ich fertig bin!".
 

Blakh

Bekanntes Mitglied
Was willst du denn haben? Willst du, dass der Dart herunterfällt, dann auf einen Mausklick wartet und dann sich in Richtung Scheibe bewegt oder möchtest du, dass der Dart fällt und währenddessen die Maus geklickt werden kann?

Man müsste mal deine Maus-Klasse sehen. Im ersten Fall reicht ein Thread, für den zweiten brauchst du einen Extra-Thread.
 
Zuletzt bearbeitet:

Versus

Mitglied
Ah, habe es jetzt hinbekommen. :)

Ich weiß, was das Problem war.

Er ist die If-Abfrage zwar durchgegangen, aber er hat sofort gesehen ,,Oha, die Maus ist nicht gedrückt''.
Ich musste es also erzwingen, dass er sich das so oft fragt, bis die Maus wirklich gedrückt wird. :)

Sorry, falls das jemand von euch bereits erwähnt hatte. ;)

Der fast vollendete Code sieht jetzt so aus:

Java:
import sum.kern.*;
/**
 * @author 
 * @version 
 */
public class dart2
{
    // Objekte
    Bildschirm derBildschirm;
    Stift meinStift;
    Maus dieMaus;

    // Konstruktor
    public dart2()
    {
        derBildschirm = new Bildschirm(600,400);
        meinStift = new Stift();
        dieMaus = new Maus();
    }

    // Dienste
    public void fuehreAus()
    {
        meinStift.bewegeBis(500,200);
        meinStift.zeichneKreis(10);
        meinStift.zeichneKreis(20);
        meinStift.zeichneKreis(30);
        meinStift.zeichneKreis(40);
        meinStift.hoch();
        meinStift.dreheUm(190);
        meinStift.bewegeUm(450);
        meinStift.dreheUm(170);
        meinStift.runter();
        meinStift.bewegeUm(35);
        meinStift.zeichneKreis(3);
        do
        {
            meinStift.radiere();
            meinStift.zeichneKreis(3);
            meinStift.bewegeUm(-35);
            meinStift.dreheBis(270);
            meinStift.bewegeUm(0.1);
            meinStift.dreheBis(0);
            meinStift.normal();
            meinStift.bewegeUm(35);
            meinStift.zeichneKreis(3);
        }
        while (meinStift.vPosition() < 399);
        do {
     if (dieMaus.istGedrueckt())
     {
        do
        {
        meinStift.radiere();
        meinStift.zeichneKreis(3);
        meinStift.bewegeUm(-35);
        meinStift.bewegeUm(1);
        meinStift.normal();
        meinStift.bewegeUm(35);
        meinStift.zeichneKreis(3);
       }
       while (meinStift.hPosition() < 500 && meinStift.vPosition() > 200);
      }
    }
    while (!dieMaus.doppelKlick());
    }
}
 
I

irgendwqwert

Gast
Leider hatten wir Lehrermangel, sodass uns ein Lehrer zugeteilt wurde, der selber keine Ahnung von dem Ganzen hat.

ich hatte auch mal informatik in der schule, und kann versichern, das man diese aufgabe auch ohne lehrer-anleitung bearbeiten kann.
aber man muss etwas von paralleler programmierung, threads, awt, edt, dann mathematischen und physikgrundlagen, ballistischer wurf, kreisberechnung usw., verstehen - also viel zum nachlesen. mit grundlagen imperativer und oo programmierung wird man nicht hinkommen
 

Ähnliche Java Themen

Neue Themen


Oben