publicclassShawna{publicstaticvoidmain(String[] args){// TODO Auto-generated method stubNostril leftNostril =newNostril(20,50);
leftNostril.draw();
hier erzeuge ich das Objekt leftNostril und übergebe die werte xPos 20 und yPos 50
Java:
publicclassNostril{//Attributepublicint xPos;// xPos und yPos auf publicpublicint yPos;privatestaticEllipse nostril;publicvoiddraw(){
nostril.draw();// Methode um nostril zu zeichnen}publicNostril(int x,int y){
xPos = x;
yPos = y;
nostril =newEllipse(10,10, xPos, yPos,Colour.BLACK);// Konstruktor für nostril}}
Java:
publicclassHead{//Attributepublicint xPos;publicint yPos;privatestaticColour colour;privatestaticEllipse face;//methodspublicvoiddraw(){
face.draw();}publicHead(int x,int y,Colour initialColour){
xPos = x;
yPos = y;
colour = initialColour;
face =newEllipse(80,120, xPos+Sheep.xPos, yPos+Sheep.yPos, colour);}
nostril =newNostril(xPos +20,yPos +84);// hier wird nostril in abhängigkeit von Head verschoben// Syntax error on token "nostril", VariableDeclaratorId expected after this token}
publicHead(int x,int y,Colour initialColour){
xPos = x;
yPos = y;
colour = initialColour;
face =newEllipse(80,120, xPos+Sheep.xPos, yPos+Sheep.yPos, colour);
nostril =newNostril(xPos +20,yPos +84);//nostril cannot be resolved to a variable}}
dann kommt folgendes. Ich glaub iwie das Problem ist viel weniger umständlich zu lösen. Es müsste doch eig genau wie bei Head sein(xPos+Sheep.xPos) nur dass man jetzt eben diesen kombiierten Wert nimmt für nostril? Also iwas wie xHead+xPos nur dass das iwie nicht funktioniert
aber nur wenn ich den festen wert für xPos.Sheep verwende was ja eben wermieden werden soll wenn ich die Aufgabenstellung richtig verstehe, oder nicht?
Du hast ein Schaf, das befindet sich an einer beliebigen Stelle, die im Konstruktor übergeben wird. Das Schaf kennt also seine Position. Das Schaf kann also die Position des Kopfs berechnen (xPos + relative x-Position des Kopfes, yPos + relative y-Position des Kopfes). Das Schaf erzeugt nun einen Kopf an eben dieser Stelle.
Der Kopf befindet sich also an der Stelle xPos, yPos (das sind jetzt die Koordinaten des Kopfes). Der Kopf kennt also seine Position. Der Kopf kann also die Position des Auges berechnen (xPos + relative x-Position des Auges, yPos + relative y-Position des Auges). Der Kopf erzeugt nun ein Auge an eben dieser Stelle.
Der Kopf kann auch die Position der Pupille berechnen (xPos + relative x-Position der Pupille, yPos + relative y-Position der Pupille). Der Kopf erzeugt nun die Pupille an eben dieser Stelle.
Die Pupille befindet sich also an der Stelle xPos, yPos (das sind jetzt die Koordinaten der Pupille). Die Pupille kann nun an dieser Stelle eine Ellipse der benötigten Größe erzeugen.
Das Schaf kann also die Position des Kopfs berechnen (xPos + relative x-Position des Kopfes, yPos + relative y-Position des Kopfes). Das Schaf erzeugt nun einen Kopf an eben dieser Stelle.
Ok, das klappt auch nicht weil ich das ganze iwann noch animieren soll. Ich geh mal Schritt für schritt durch und du kannst mir sagen wo ich den Fehler hab:
zuerst lege ich den Konstruktor wie folgt in der Klasse Nostril fest:
damit kann ich in der main methode jetzt ein Objekt Nostril erzeugen ,dass die Koordinaten die man eingibt nimmt, sie mit Head.xPos und Head.yPos addiert und dann erzeugt.
Das Problem hierbei ist, dass die Werte durch folgende zeile nicht aus dem fertigen face genommen werden, sondern einfach die Werte genommen werden, die man bei der erzeugung von Head eingegeben hat. Dadurch landen die Nasenlöcher links neben dem Zeichenbild, da man für Head als x wert -60 eingibt und ihn dann mit 20 bzw 50 addiert und es so immer negative werte werden.
Ok, das klappt auch nicht weil ich das ganze iwann noch animieren soll. Ich geh mal Schritt für schritt durch und du kannst mir sagen wo ich den Fehler hab:
zuerst lege ich den Konstruktor wie folgt in der Klasse Nostril fest:
damit kann ich in der main methode jetzt ein Objekt Nostril erzeugen ,dass die Koordinaten die man eingibt nimmt, sie mit Head.xPos und Head.yPos addiert und dann erzeugt.
Das Problem hierbei ist, dass die Werte durch folgende zeile nicht aus dem fertigen face genommen werden, sondern einfach die Werte genommen werden, die man bei der erzeugung von Head eingegeben hat. Dadurch landen die Nasenlöcher links neben dem Zeichenbild, da man für Head als x wert -60 eingibt und ihn dann mit 20 bzw 50 addiert und es so immer negative werte werden.
Die Klasse Nostril darf intern nur die Koordinaten verwenden, die ihr über den Konstruktor mitgegeben werden. "Head" ist innerhalb der Klasse nicht bekannt.
Das heißt die Klasse Head enthält zwei Variablen vom Typ Nostril und die Klasse Head bestimmt über den Aufruf des Konstruktors von Nostril, wo diese gezeichnet werden. Das kann in Head relativ zur der Position von Head berechnet werden.
Ganz grob:
Java:
classHead{int xPos, yPos;// die Position von HeadNostril leftNostril;Nostril rightNostril;publicHead(int x,int y){//..
leftNostril =newNostril(x + relX, y + relY);// relX und relY kannst du auch direkt als Wert angeben// usw.}}
Keine Ahnung was du meinst. "face" ist auch einfach nur eine weiteres Attribut von Head und hat mit den Nasenlöchern wenig zu tun außer, dass es zuerst gezeichnet werden muss, damit es die Nasenlöcher nicht verdeckt.
Edit:
Steht doch genau im UML Diagramm. Head hat zwei Ohren, zwei Augen und zwei Nasenlöcher. Das sind alles nur Attribute, wie oben am Beispiel der Nasenlöcher gezeigt. Ausgehend von der Position von Head musst du diese Attribute im Konstruktor von Head mit ihren Koordinaten relativ zur Basiskoordinate von Head erzeugen.
wen ich das jetzt so anlege und dann in der Main Methode wie folgt zeichne zeichnet er aber weiterhin nur das Gesicht oder zeichnet die Nasenlöcher immer noch links neben das Bild
Java:
Head head =newHead(-60,-40,Colour.RED);
head.draw();
wen ich das jetzt so anlege und dann in der Main Methode wie folgt zeichne zeichnet er aber weiterhin nur das Gesicht oder zeichnet die Nasenlöcher immer noch links neben das Bild
Java:
Head head =newHead(-60,-40,Colour.RED);
head.draw();
Genau wie innerhalb von Nostril kein Zugriff auf Head besteht, besteht natürlich auch innerhalb von Head kein Zugriff auf Sheep, d.h. Head wird an die Position gezeichnet, die er in seinem Konstruktor übergeben bekommt.
Wenn xPos und yPos die Position des Zentrums von Head (also das Zentrum von face) ist, dann müsste die Nasenlöcher ja rechts und links unterhalb davon liegen. Also beim linken Nasenloch muss irgendwas wie leftNostril = new Nostril (xPos - ..., yPos + ); stehen.
Generell kennt jede einzelne Klasse nur die Position ihres Zentrums.
Du erstellst also ein Sheep mit einer Position.
Innerhalb von Sheep wird damit:
Ein Kopf erstellt, der links und oberhalb dieser Position liegt.
Ein Bein erstellt, das links und unterhalb dieser Position liegt.
Noch ein Bein erstellt, ...
Innerhalb von Head wird:
Eine Ellipse als face erstellt.
Ein Nasenloch erstellt, das links unterhalb liegt.
Ein Nasenloch erstellt, das rechts unterhalb liegt.
Ein Ohr erstellt, das links oberhalb liegt.
...
Das heißt den ganzen Block in main kann ich mir auch sparen?
Java:
publicclassMain{publicstaticvoidmain(String[] args){// TODO Auto-generated method stub//erstellt Körper und SchwanzSheep bodyTail =newSheep(170,100,Colour.RED);// erstellt und zeichnet zuerst Beine, die hinter dem Körper liegenLeg rightRearLeg =newLeg(125,80);
rightRearLeg.draw();Leg rightFrontLeg =newLeg(5,80);
rightFrontLeg.draw();//zeichnet Körper und Schwanz
bodyTail.draw();// erstellt und zeichnet Beine, die vor dem Körper liegenLeg leftFrontLeg =newLeg(30,90);
leftFrontLeg.draw();Leg leftRearLeg =newLeg(150,90);
leftRearLeg.draw();// erstellt und zeichnet KopfHead head =newHead(-60,-40,Colour.RED);
head.draw();// erstellt und zeichnet Nasenlöcher
Ok das heißt auch ich packe dann Head und leg in die draw Methode von Sheep und packe Nostril,Eye und Ear in die draw Methode von Head? Oder wenn nur das Sheep erzeugt werden soll sogar alles in die draw Methode von sheep?
Ok das heißt auch ich packe dann Head und leg in die draw Methode von Sheep und packe Nostril,Eye und Ear in die draw Methode von Head? Oder wenn nur das Sheep erzeugt werden soll sogar alles in die draw Methode von sheep?
Schau dir an, welche Attribute (die gezeichnet werden müssen) in der jeweiligen Klasse vorhanden sind und rufe die entsprechenden draw-Methoden in der richtigen Reihenfolge auf.
Bei Sheep sind das der Körper, die Beine, der Kopf und der Schwanz.
Bei Head sind das das Gesicht, die Augen, die Ohren, die Nasenlöcher.
Bei Eye sind es das Auge an sich und die Pupille.
Mein Fehler: Die Koordinate bei der Ellipse entspricht wohl nicht dem Zentrum sondern der Ecke des umgebenden Rechtecks. Das musst du bei der Berechnung der relativen Koordinaten berücksichtigen.
Schau dir mal den Attributnamen in Nostril an! Das sollte nostril heißen. Nostril ist die Bezeichnung der Klasse!
Generell ist es außerdem sinnvoll die Attribute der Klasse private zu machen. Eine Klasse sollte soviel verbergen als möglich und nur sichtbar machen was notwendig ist.
Ansonsten zieh das jetzt so weiter durch. Die Klassen ähneln sich alle.
Ok, ich hab jetzt alles fertig gemacht und das Schaaf steht.(Danke für die Geduld )
In der Aufgabe ist aber die Rede davon, dass das Schaaf mithilfe der eyelid blinzeln soll. Ich nehme mal an das funktiniert über die HelperClass die ein delay beim zeichnen erzeugt. Wie implementiere ich die?
Java:
classHelperClass{staticvoidwait(int milliseconds){try{Thread.sleep(milliseconds);}catch(Exception e){// ignoring exception at the moment}}}
Außerdem stell ich mir die Frage ob meine Attribute richtig sind, da im UML diagramm viele der Attribute die ich zugeweisen habe nicht auftauchen
private Eye leftEye;
private Eye rightEye;
private Ear leftEar;
private Ear rightEar;
etc
Ich nehme mal an das nicht alle Attribute im UML diagramm auftauchen?
Doch die tauchen auf und zwar in Form von Assoziationen (die Linien zwischen den Klassen) und Multiplizitäten (den Zahlen an den Pfeilen, die angeben, wie viele Objekte es geben muss). Dort steht z. B. Head --- has --- 2 --> Eye(s)
Was im Diagramm nicht angegeben ist, sind die Bezeichner, die Du also frei wählen kannst. Unabhängig davon: sofern nicht ausdrücklich etwas anderes behauptet wird, erhebt ein UML-Diagramm nicht den Anspruch auf Vollständigkeit.
Die HelperClass an sich ist ja bereits implementiert.
Sie stellt eine statische Methode wait() bereit, die du verwenden kannst mit HelperClass.wait(1000);. Anstatt "1000" (ms) kannst du natürlich auch was anderes einsetzen. Sie bewirkt einfach, dass das Programm für eine Zeit wartet. Mach was draus. Zum Beispiel ein Zwinkern.