Ausführproblem

Status
Nicht offen für weitere Antworten.

manuu

Mitglied
Hi,
ich hab ein Problem beim ausführen einer Klasse...ich erklärs mal ebend schriftlich.

Ich habe eine Klasse "Bär" und eine Klasse "Hauptprogramm". In der Klasse Bär sind die Funktionen zeichnen() und bewege() deffiniert. Das Hauptprogramm dient zur ausführung der Klasse Bär.

Der Bär soll an eine zufällige Position gezeichnet werden. < das klappt schon
Der Bär soll sich so lange in eine zufällige richtung bewegen bis man mit der Maus doppelklickt. < Funktioniert nicht

Hier mal beide Quellcodes:

Code:
import sum.kern.*;

public class Hauptprogramm
{
    // Objektbeziehungen
    Bildschirm derBildschirm;
    Stift meinStift;
    Maus dieMaus;
    Bär derBär;
    
    /**
     * Initialisierung fuer Objekte der Klasse Hauptprogramm
     */
    public Hauptprogramm()
    {
        // Objektbeziehungen herstellen
        derBildschirm = new Bildschirm(800, 600);
        meinStift = new Stift();
        derBär = new Bär();
        dieMaus = new Maus();
        
        
        derBär.zeichne();
        
        do
        {
            derBär.bewege();
        }while(dieMaus.doppelKlick());
    }

}

Code:
import sum.kern.*;
import sum.werkzeuge.*;

public class Bär
{
	// Objektbeziehungen
	Bildschirm derBildschirm;
	Stift meinStift;
	Rechner derRechner;
	
	/**
	 * Initialisierung fuer Objekte der Klasse Bär
	 */
	public Bär()
	{
		// Objektbeziehungen herstellen
		meinStift = new Stift();
		derRechner = new Rechner();	
	}

	/**
	 * Eigentliche Zeichenmethode
	 */
	public void zeichne()
	{
		meinStift.bewegeBis(derRechner.ganzeZufallszahl(1,800),derRechner.ganzeZufallszahl(1,600));
		meinStift.zeichneKreis(20);
	}
	
	public void bewege()
	{
	    meinStift.radiere();
	    meinStift.bewegeUm(1);
	    this.zeichne();
	}
}

Wo liegt hier der Fehler?? Beim ausführen wird immer nur ein Kreis gezeigt..aber er bewegt sich nicht.


gruß MaNuu
 

manuu

Mitglied
Im Hauptprogramm ist ja die do Schleife...und da drin wird ja das bewegen des Bärs ausgeführt...so lange bis die maus doppelgeklickt wird ( so sollte es eigentlich sein)

Und das bewegen ist ja in der Klasse Bär deffiniert.

erst löschen, dann weiterbewegen und dann wieder zeichnen.

die Methode "derBär.zeichne();" im Hauptprogramm habe ich nur als test gemacht...
 

norman

Top Contributor
manuu hat gesagt.:
Code:
        do
        {
            derBär.bewege();
        }while(dieMaus.doppelKlick());

Wo liegt hier der Fehler?? Beim ausführen wird immer nur ein Kreis gezeigt..aber er bewegt sich nicht.

der Bär bewegt sich nur einmal, weil die schleife dann verlassen wird. was du meinst ist wohl eher while(!dieMaus.doppelKlick());..
 

manuu

Mitglied
das habe ich mir auch schon gedacht und ausprobiert...aber irgendwie seh ich den Kreis trotzdem nicht in Bewegung...der blinkt nur einmal ganz kurz auf oder kommt sogar mal garnicht.
 

Leroy42

Top Contributor
Ich schätze mal, das das nicht leicht werden wird, dir zu helfen.
Code:
  do { 
    derBär.bewege(); 
  } while(dieMaus.doppelKlick());

Z.B.: Was macht dieMaus.doppelKlick() :shock:
Muß der User da andauernd doppelklicken :autsch:

while (dieMaus.tasteGedrückt()) könnte ich ja noch nachvollziehen.

Du benutzt da ein Utility-Paket das, zumindest mir, unbekannt ist.
 

manuu

Mitglied
Hi,
es lag nicht an der do schleife sondern in der Klasse Bär selber, da musste ich noch eine Methode "löschen" implementieren. Jetzt zeichnet er zwar ganz viele Kreise auf den Bildschirm, aber löscht sie nicht nach dem zeichnen.

So sollte das ganze eigentlich aussehen:

Ein Kreis wird an einer zufälligen Posi gezeichnet.
Von da aus bewegt der Kreis sich in eine zufällige Richtung. (sprich: er zeichnet sich, löscht sich, der stift bewegt sich ein bischen weiter, zeichnet den Kreis neu. Und das immer so weiter...)

Das mit dem doppelklick soll nur zum beende des Programms da sein.
 

manuu

Mitglied
hmm...schade eigentlich ;) Das ist son mal werkzeug.

Ich find den blöden Fehler nicht...

Code:
import sum.kern.*;
import sum.werkzeuge.*;

public class Bär
{
	// Objektbeziehungen
	Bildschirm derBildschirm;
	Stift meinStift;
	Rechner derRechner;
	
	/**
	 * Initialisierung fuer Objekte der Klasse Bär
	 */
	public Bär()
	{
		// Objektbeziehungen herstellen
		meinStift = new Stift();
		derRechner = new Rechner();	
	}

	/**
	 * Eigentliche Zeichenmethode
	 */
	public void zeichne()
	{
		meinStift.bewegeBis(derRechner.ganzeZufallszahl(1,800),derRechner.ganzeZufallszahl(1,600));
		meinStift.zeichneKreis(20);
	}
	
	public void löschen()
	{
	    meinStift.radiere();
	    this.zeichne();
	    meinStift.normal();
	}
	
	public void bewege()
	{
	    this.löschen();
	    meinStift.bewegeUm(0.02);
	    this.zeichne();
	}
}

Code:
import sum.kern.*;
import sum.werkzeuge.*;

public class Hauptprogramm
{
    // Objektbeziehungen
    Bildschirm derBildschirm;
    Stift meinStift;
    Maus dieMaus;
    Bär derBär;
    
    /**
     * Initialisierung fuer Objekte der Klasse Hauptprogramm
     */
    public Hauptprogramm()
    {
        // Objektbeziehungen herstellen
        derBildschirm = new Bildschirm(800, 600);
        meinStift = new Stift();
        derBär = new Bär();
        dieMaus = new Maus();
        
        
        do
        {
            derBär.bewege();
        }while(!dieMaus.doppelKlick());
    }

}


Ist vllt irgendwo ein logik oder denkfehler im Code???
 

Eldaron

Aktives Mitglied
Nur ein kurzer Gedanke, nachdem wir ja die Implementierung von Stift.radiere() nich sehen. Könnte es sein, dass das nur den Pixel wegradiert, an dem der Stift sich grad befindet ? und nicht den Kreis, den Du vorher gezeichnet hast?
 

Leroy42

Top Contributor
@Eldoran: Guter Einwand

Aber auch wenn dieser Stift irgendwie die gezeichneten Objekte verwaltet,
oder er im Zustand radiere alles was in zeichne() passiert einfach in der
Hintergrund farbe zeichnet, ist doch durch
die Implementierung von

Code:
public void zeichne() { 
      meinStift.bewegeBis(derRechner.ganzeZufallszahl(1,800),derRechner.ganzeZufallszahl(1,600)); 
      meinStift.zeichneKreis(20); 
}

der Stift jetzt an einer ganz neuen Zufallsposition, wo sich der alte Kreis gar
nicht befindet. Oder?
 

Leroy42

Top Contributor
Mal was anderes: Fehlersuche durch Versuch die Funktionalität eines
unbekannten packages zu erraten :shock:

Erinnert mich an die Zeit, als ich mit einem Schulkollegen versuchte,
anhand des erzeugten Byte-Codes von Fortran-Programmen unseres
Schulcomputers die vorhanden Befehle des Prozessors herauszubekommen.

Und das ohne irgendein Handbuch für diesen Prozessor zu haben :autsch:

Tja, das waren noch Pionierzeiten (damals in den Ardennen)...
 

manuu

Mitglied
Hmm...das stimmt allerdings! Ist mir noch garnicht so aufgefallen. Der Radieremodus geht also so: wenn man den stift auf radieren setzt, muss man das gleiche was man vorher gezeichnet hat nochmal zeichnen, aber da der stift grade im radiere modus ist, löscht er das "gezeichnete" natürlich.

Jetzt habe ich das ganze mal mit einer festen Malposition ausprobiert, er zeichnet und löscht den Kreis wieder...aber halt alles auf der gleichen stelle.


Wie geht das nun, dass er eine Anfangsposition hat und immer da weiter macht wo der aufgehört hat bzw wo er grade ist??
 

Leroy42

Top Contributor
Das ist dann nicht so schwer:

Du mußt dir nach jeder Stiftbewegung nur in zwei Instanzvariablen (x,y) merken, wo er zuletzt
den Kreis gezeichnet hat. Endweder bietet Stift solche getter-Methoden an, oder du rechnest
selbst mit.
 

manuu

Mitglied
Jap...bis jetzt hab ich es so:

Code:
import sum.kern.*;
import sum.werkzeuge.*;

public class Bär
{
    // Objektbeziehungen
    Bildschirm derBildschirm;
    Stift meinStift;
    Rechner derRechner;
    double zh;
    double zv;
    double zGeschw;
    
    /**
     * Initialisierung fuer Objekte der Klasse Bär
     */
    public Bär(double ph, double pv, double pGeschw)
    {
        // Objektbeziehungen herstellen
        meinStift = new Stift();
        derRechner = new Rechner(); 
        zh = ph;
        zv = pv;
        zGeschw = pGeschw;
    }

    /**
     * Eigentliche Zeichenmethode
     */
    public void zeichne()
    {
        //zh = derRechner.ganzeZufallszahl(1,800);
        //zv = derRechner.ganzeZufallszahl(1,600);
        meinStift.bewegeBis(zh,zv);
        meinStift.zeichneKreis(20);
    }
    
    public void löschen()
    {
        meinStift.radiere();
        this.zeichne();
        meinStift.normal();
    }
    
    public void bewege()
    {
        this.löschen();
        meinStift.bewegeUm(-zGeschw);
        zh = zh+zGeschw;
        this.zeichne();
    }
    
    public double getzh()
    {
        return zh;
    }

    public double getvh()
    {
        return zv;
    }
}

Nur jetzt steuer ich über das Hauptprogramm die Variablen an, wie kann ich direkt in der Klasse Bär machen??? Einfach die Parameter hinter Public Bär wegnehmen??
 

Leroy42

Top Contributor
:shock: Was heißt: Über's Hauptprogramm die Variablen ansteuern :shock:

Also deinen jetzigen Code finde ich schon eleganter und objektorientierten;
auch daß du die Stiftumschaltung mit in die löschen-Methode genommen
hast ist guter Stil.

Aber was willst du ansteuern. So wie das Hauptprogram jetzt ist, ist es doch in Ordnung,
es gibt eine Geschwindigkeit (und was sonst noch) vor und ruft später nur noch.
Code:
       do 
        { 
            derBär.bewege(); 
        }while (dieMaus.doppelKlick());

Wie der Bär sich zu bewegen hat und wo er gerade ist, darum soll er sich
gefälligst selbst kümmern ==> Korrektes OOP-Denken.

Allerdings habe ich keinen Schimmer, was stift.bewegeUm() mit einem Parameter (x,y,?)
macht, noch ob sich diese Methode nicht mit der bewegeBis(x,y) ins Gehege kommt.

Und darum können wir dir nicht weiterhelfen, solange wir nicht wissen, was diese Methoden
genau bewirken. :(
 

manuu

Mitglied
Ihr kennt doch sicher dieses gammlige Zeichenprogramm mit der Schildkröte oder? :D So von wegen VW 100, dann geht die schildkröte 100pixel nach vorne.

Und sowas in der Art ist der sumkern auch.

die methode meinStift.bewegeUm(zahl) bewirkt, dass sich der stift um x Pixel vorbewegt und ne linie zeichnet
die methode meinStift.bewegeBis (xKoordinate, yKoordinate) [oder auch andersrum, k.a] bewirkt, dass sich der Stift zu einer bestimmten x,y Position bewegt. (von da wo er grade ist)


Das mit den Parametern habe ich jetzt schon rausbekommen...das geht so wie ichs mir gedacht habe.

Code:
import sum.kern.*;
import sum.werkzeuge.*;

public class Bär
{
    // Objektbeziehungen
    Bildschirm derBildschirm;
    Stift meinStift;
    Rechner derRechner;
    double zh;
    double zv;
    double zGeschw;
    
    /**
     * Initialisierung fuer Objekte der Klasse Bär
     */
    public Bär()
    {
        // Objektbeziehungen herstellen
        meinStift = new Stift();
        derRechner = new Rechner(); 
        
        zh = derRechner.ganzeZufallszahl(1,800);
        zv = derRechner.ganzeZufallszahl(1,600);
        zGeschw = derRechner.zufallszahl()/100;
    }

    /**
     * Eigentliche Zeichenmethode
     */
    public void zeichne()
    {
        meinStift.bewegeBis(zh,zv);
        meinStift.zeichneKreis(20);
    }
    
    public void löschen()
    {
        meinStift.radiere();
        this.zeichne();
        meinStift.normal();
    }
    
    public void bewege()
    {
        this.löschen();
        meinStift.bewegeUm(-zGeschw);
        zh = zh+zGeschw;
        zv = zv+zGeschw;
        this.zeichne();
    }
    
    public double getzh()
    {
        return zh;
    }

    public double getvh()
    {
        return zv;
    }
}


Nur leider weiß ich nicht wie ich die Richtung zufällig bestimmen soll...
 
G

Gast

Gast
Du könntest ne Zufallszahl (Math.random() ..) zwischen 0 und 359 (Grad) erzeugen, und dann mittels Math.sin() und Math.cos() die x und y Verschiebung beeinflussen.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben