Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
public class Shawna {
public static void main(String[] args) {
// TODO Auto-generated method stub
Nostril leftNostril = new Nostril(20,50);
leftNostril.draw();
hier erzeuge ich das Objekt leftNostril und übergebe die werte xPos 20 und yPos 50
Java:
public class Nostril {
//Attribute
public int xPos; // xPos und yPos auf public
public int yPos;
private static Ellipse nostril;
public void draw() {
nostril.draw(); // Methode um nostril zu zeichnen
}
public Nostril(int x, int y) {
xPos = x;
yPos = y;
nostril = new Ellipse(10, 10, xPos, yPos, Colour.BLACK); // Konstruktor für nostril
}
}
Java:
public class Head {
//Attribute
public int xPos;
public int yPos;
private static Colour colour;
private static Ellipse face;
//methods
public void draw() {
face.draw();
}
public Head(int x, int y, Colour initialColour) {
xPos = x;
yPos = y;
colour = initialColour;
face = new Ellipse(80, 120, xPos+Sheep.xPos, yPos+Sheep.yPos, colour);
}
nostril = new Nostril(xPos +20,yPos +84); // hier wird nostril in abhängigkeit von Head verschoben
// Syntax error on token "nostril", VariableDeclaratorId expected after this token
}
public Head(int x, int y, Colour initialColour) {
xPos = x;
yPos = y;
colour = initialColour;
face = new Ellipse(80, 120, xPos+Sheep.xPos, yPos+Sheep.yPos, colour);
nostril = new Nostril(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:
Java:
public Nostril(int x, int y) {
xPos = x;
yPos = y;
nostril = new Ellipse(10, 10, xPos + Head.xPos, yPos + Head.yPos, Colour.BLACK);
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.
Java:
public Head(int x, int y, Colour initialColour) {
xPos = x;
yPos = y;
colour = initialColour;
face = new Ellipse(80, 120, xPos + Sheep.xPos, yPos + Sheep.yPos, colour);
auf den wert xPos+Sheep.xPos kann ich nicht zugreifen weil er nur innerhalb der Klasse Head existiert.
Ist das soweit korrekt?
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:
Java:
public Nostril(int x, int y) {
xPos = x;
yPos = y;
nostril = new Ellipse(10, 10, xPos + Head.xPos, yPos + Head.yPos, Colour.BLACK);
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.
Java:
public Head(int x, int y, Colour initialColour) {
xPos = x;
yPos = y;
colour = initialColour;
face = new Ellipse(80, 120, xPos + Sheep.xPos, yPos + Sheep.yPos, colour);
auf den wert xPos+Sheep.xPos kann ich nicht zugreifen weil er nur innerhalb der Klasse Head existiert.
Ist das soweit korrekt?
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:
class Head {
int xPos, yPos; // die Position von Head
Nostril leftNostril;
Nostril rightNostril;
public Head(int x, int y) {
//..
leftNostril = new Nostril(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.
public Head(int x, int y, Colour initialColour) {
xPos = x;
yPos = y;
colour = initialColour;
face = new Ellipse(80, 120, xPos + Sheep.xPos, yPos + Sheep.yPos, colour);
leftNostril = new Nostril (20 + xPos, 84 + yPos);
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 = new Head(-60, -40, Colour.RED);
head.draw();
public Head(int x, int y, Colour initialColour) {
xPos = x;
yPos = y;
colour = initialColour;
face = new Ellipse(80, 120, xPos + Sheep.xPos, yPos + Sheep.yPos, colour);
leftNostril = new Nostril (20 + xPos, 84 + yPos);
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 = new Head(-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:
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
//erstellt Körper und Schwanz
Sheep bodyTail = new Sheep(170, 100, Colour.RED);
// erstellt und zeichnet zuerst Beine, die hinter dem Körper liegen
Leg rightRearLeg = new Leg(125, 80);
rightRearLeg.draw();
Leg rightFrontLeg = new Leg(5, 80);
rightFrontLeg.draw();
//zeichnet Körper und Schwanz
bodyTail.draw();
// erstellt und zeichnet Beine, die vor dem Körper liegen
Leg leftFrontLeg = new Leg(30, 90);
leftFrontLeg.draw();
Leg leftRearLeg = new Leg(150, 90);
leftRearLeg.draw();
// erstellt und zeichnet Kopf
Head head = new Head(-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.
public class Head {
//Attribute
public static int xPos;
public static int yPos;
public Colour colour;
public Ellipse face;
public Nostril nostril;
public Nostril leftNostril;
public Nostril rightNostril;
//methods
public void draw() {
face.draw();
leftNostril.draw();
rightNostril.draw();
}
public Head(int x, int y, Colour initialColour) {
xPos = x;
yPos = y;
colour = initialColour;
face = new Ellipse(80, 120, xPos, yPos, colour);
leftNostril = new Nostril (20 + xPos, 84 + yPos);
rightNostril = new Nostril (50 + xPos, 84 + xPos);
}
}
Java:
public class Nostril {
//Attribute
public int xPos;
public int yPos;
public Ellipse leftNostril;
public Ellipse rightNostril;
public void draw() {
leftNostril.draw();
rightNostril.draw();
}
public Nostril(int x, int y) {
xPos = x;
yPos = y;
leftNostril = new Ellipse(10, 10, xPos, yPos, Colour.BLACK);
rightNostril = new Ellipse(10, 10, xPos, yPos, Colour.BLACK);
}
}
jetzt zeichnet er das linke Nasenloch richtig aber das rechte ist plötzlich zu tief?
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.
public class Head {
//Attribute
public int xPos;
public int yPos;
public Colour colour;
public Ellipse face;
public Nostril leftNostril;
public Nostril rightNostril;
//methods
public void draw() {
face.draw();
leftNostril.draw();
rightNostril.draw();
}
public Head(int x, int y, Colour initialColour) {
xPos = x;
yPos = y;
colour = initialColour;
face = new Ellipse(80, 120, xPos, yPos, colour);
leftNostril = new Nostril (20 + xPos, 84 + yPos);
rightNostril = new Nostril (50 + xPos, 84 + yPos);
}
}
Java:
public class Nostril {
//Attribute
public int xPos;
public int yPos;
public Ellipse Nostril;
public void draw() {
Nostril.draw();
}
public Nostril(int x, int y) {
xPos = x;
yPos = y;
Nostril = new Ellipse(10, 10, xPos, yPos, Colour.BLACK);
}
}
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:
class HelperClass {
static void wait(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.