Ich nehme mal an es geht hier nicht um die Klassen sondern die daraus gebildeten Objekte:
Ganz allgemein muss das Objekt vom Typ City eine Referenz auf das Objekt vom Typ Walk besitzen. Diese Referenz könnte von einem anderen Objekt/ einer anderen Klasse die beide Objekte kennt übergeben werden.
Ganz allgemein muss das Objekt vom Typ City eine Referenz auf das Objekt vom Typ Walk besitzen. Diese Referenz könnte von einem anderen Objekt/ einer anderen Klasse die beide Objekte kennt übergeben werden.
Das kriege ich ja eben nicht hin habe in der Klasse City oben wo ich die Variablen initialisiere folgendes hingeschrieben:
Java:
privateWalk walkObject;
Wenn ich nun in der Methode, von der Klasse City, auf die "getXPos()" bzw. auf die "getYPos()" zugreifen möchte funktioniert das nicht. Habe es wie folgt versucht:
Java:
int x = walkObject.getXPos();int y = walkObject.getYPos();
Vielleicht sollte ich dazu sagen, dass ich mich damit noch nicht solange auseinander setze. Allerdings aufgrund von PHP-Kenntnissen und ein wenig C#, doch einigermaßen vorankomme.
Hier mal ein Ausschnitt auf der Klasse City:
Java:
import greenfoot.*;// (World, Actor, GreenfootImage, Greenfoot and MouseInfo)publicclassCityextendsWorld{privateWalk walkObject;/**
* Erzeugt 'anzahl' an Frauen und fügt sie an zufälligen Positionen in der Welt ein.
*/privatevoidaddFrauen(int anzahl){for(int i=1;i<=anzahl;i++){int x = walkObject.getXPos();int y = walkObject.getYPos();addObject(newFrau(), x, y);}}}
Und hier ein Ausschnitt aus der Klasse "Walk":
Java:
import greenfoot.*;// (World, Actor, GreenfootImage, Greenfoot and MouseInfo)publicclassWalkextendsActor{/**
* Generiert eine X-Koordinate
*/publicintgetXPos(){World myWorld =getWorld();int x =Greenfoot.getRandomNumber(myWorld.getWidth());if(x <21){
x =21;}if(x >= myWorld.getWidth()-21){
x = myWorld.getWidth()-21;}return x;}/**
* Generiert eine Y-Koordinate
*/publicintgetYPos(){World myWorld =getWorld();int y =Greenfoot.getRandomNumber(myWorld.getHeight());if(y <21){
y =21;}if(y >= myWorld.getHeight()-21){
y = myWorld.getHeight()-21;}return y;}}
Die Methode "getWorld()" gibt eine Referenz auf das World-Objekt zurück.
Kenne greenwood und die Zusammenhänge nicht.
Wo wird denn eine City Objekt und ein Walk Objekt erzeugt? Eventuell kann man das Walk Objekt in City neu erzeugen.
du kommst ehrlich gesagt ziemlich unfreundlich rüber... aber OK.
Ja ich weiß, ich benötige Hilfe, aber trotzdem kann man da ja trotzdem eine gewisse freundlichkeit an den Tag bringen...
habe oben das "= new Walk()" weggelassen wegen der Fehlermeldung!
nun habe ich es wieder eingefügt nun sieht das ganze wie folgt aus:
Java:
import greenfoot.*;// (World, Actor, GreenfootImage, Greenfoot and MouseInfo)publicclassCityextendsWorld{privateWalk walkObject =newWalk();/**
* Erzeugt 'anzahl' an Frauen und fügt sie an zufälligen Positionen in der Welt ein.
*/privatevoidaddFrauen(int anzahl){for(int i=1;i<=anzahl;i++){int x = walkObject.getXPos();int y = walkObject.getYPos();addObject(newFrau(), x, y);}}}
Als Fehlermeldung erhalte ich dann folgendes:
Code:
java.lang.NullPointerException
at City.addFrauen(City.java:39)
at City.<init>(City.java:27)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at greenfoot.core.Simulation.newInstance(Simulation.java:520)
at greenfoot.platforms.ide.WorldHandlerDelegateIDE$3.run(WorldHandlerDelegateIDE.java:406)
at greenfoot.core.Simulation.runQueuedTasks(Simulation.java:411)
at greenfoot.core.Simulation.maybePause(Simulation.java:269)
at greenfoot.core.Simulation.runContent(Simulation.java:201)
at greenfoot.core.Simulation.run(Simulation.java:194)
java.lang.NullPointerException
at Walk.getYPos(Walk.java:66)
at City.addFrauen(City.java:40)
at City.<init>(City.java:27)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at greenfoot.core.Simulation.newInstance(Simulation.java:520)
at greenfoot.platforms.ide.WorldHandlerDelegateIDE$3.run(WorldHandlerDelegateIDE.java:406)
at greenfoot.core.Simulation.runQueuedTasks(Simulation.java:411)
at greenfoot.core.Simulation.maybePause(Simulation.java:269)
at greenfoot.core.Simulation.runContent(Simulation.java:201)
at greenfoot.core.Simulation.run(Simulation.java:194)
Der Sinn der Klasse Walk ist mir nicht ganz klar.
Logisch wäre für mich wenn Frau von Actor erbt und City mehrere Frau Objekt erzeugt per setLocation deren Position gesetzt wird. Was da Walk zu tun hat - da es ja scheinbar nur zum generieren zufälliger Positionen genutzt wird - habe ich nicht verstanden.
Der Sinn der Klasse Walk ist mir nicht ganz klar.
Logisch wäre für mich wenn Frau von Actor erbt und City mehrere Frau Objekt erzeugt per setLocation deren Position gesetzt wird. Was da Walk zu tun hat - da es ja scheinbar nur zum generieren zufälliger Positionen genutzt wird - habe ich nicht verstanden.
In Walk sind noch weitere Methoden definiert, unter anderem wie sich die Frau und noch weitere Elemente auf der Welt bewegen. Die Elemente (Frau, Mann, u.a.) werden alle als Subklassen von der Walk Klasse abgeleitet. Nur weil sie an sich mit meinem Problem nix zu tun haben, habe ich das hier weggelassen. =)
du kommst ehrlich gesagt ziemlich unfreundlich rüber... aber OK.
Ja ich weiß, ich benötige Hilfe, aber trotzdem kann man da ja trotzdem eine gewisse freundlichkeit an den Tag bringen...
Und scheinbar hast du noch diverses anderes einfach weggelassen.
Allein schon aus den Zeilennummern der Fehlermeldung und der Tatsache, dass World nur diese Konstruktoren hat World (Greenfoot API)
folgt, dass da wohl noch einiges fehlt. Sonst wäre das überhaupt nicht kompilierbar.
Also noch mal: Wenn du Hilfe willst, dann poste die gesamte Klasse!
import greenfoot.*;// (World, Actor, GreenfootImage, Greenfoot and MouseInfo)/**
* City: Basisklasse für das Erzeugen der Welt.
*
* @author möp
* @version 2012-12-20
*/publicclassCityextendsWorld{privateWalk walkObject =newWalk();/**
* Constructor for objects of class City.
*/publicCity(){// Create a new world with 700x600 cells with a cell size of 1x1 pixels.super(700,600,1);setBackground("hintergrund.jpg");addXYZ(1);addZXY(10);addXZY(2);addFrauen(4);addMaenner(4);}/**
* Erzeugt 'anzahl' an Frauen und fügt sie an zufälligen Positionen in der Welt ein.
*/privatevoidaddFrauen(int anzahl){for(int i=1;i<=anzahl;i++){int x = walkObject.getXPos();int y = walkObject.getYPos();addObject(newFrau(), x, y);}}/**
* Erzeugt 'anzahl' an Männern und fügt sie an zufälligen Positionen in der Welt ein.
*/privatevoidaddMaenner(int anzahl){for(int i=1;i<=anzahl;i++){int x =Greenfoot.getRandomNumber(getWidth());int y =Greenfoot.getRandomNumber(getHeight());if(x <21){
x =21;}if(x >=getWidth()-21){
x =getWidth()-21;}if(y <21){
y =21;}if(y >=getHeight()-21){
y =getHeight()-21;}addObject(newMann(), x, y);}}[....]}
an der Stelle "[....]" habe ich die Methoden "addXYZ()", "addZXY()" und "addXZY()".
Im Prinzip sind die 3 nur Kopien, von addMaenner, nur das ein anderes Objekt in die Welt gesetzt wird. und das hat nix mit dem Problem an sich zu tun. ich möchte halt einfach die x und y Koordinate mit meinen 2 Methoden die ich bereits in einer anderen Klasse deklariert habe bestimmen. Die beiden Methoden sind in der Walk Klasse deklariert, weil in Unterklassen auch auf die beiden Methoden zugreife und mir einfach das neu deklarieren ersparen wollte.
// EDIT
ich glaube ich hab den Fehler gefunden, die Methoden getYPos und getXPos, greifen mit der methode getWorld auf eine Referenz der World zurück. Könnte es sein dass sich die beiden da blockieren? und dadurch die fehler entstehen?
Werde glaub ich einfach die Methoden getXPos und getYPos nochmal in City deklarieren dann sollte das problem behoben sein, dann könnte ich ja vllt umgekehrt auf die Methoden zugreifen.
Muss City nicht im Konstruktor erst das walkObjekt per addObjekt "in sich aufnehmen"? Sonst fehlt dem walkObjekt der World Kontext - wenn ich das richtig deute.