Java / Greenfoot variablen übergeben?
Hallo,
wir sollen im Informatikunterricht in der Schule "pong" mit Greenfoot programmieren.
Nun möchte ich einen gegner programmieren;
dieser soll sich immer an der Y Koordinate des Balls befinden.
ich möchte also getY() von der Klasse "Ball" an eine andere Klasse "Gegner" übermitteln.
in der Klasse "Ball" wollte ich die Methode "BALL" mit einem return der Y Koordinate erstellen:
und diese dann in der Klasse "Gegner" dann benutzen um dessen Position zu ändern:
Das funktioniert aber nicht.
Könnt ihr mir helfen und sagen wie man das lösen kann?
Danke im Vorraus
1 Antwort
Beim ersten erstellst du eine Methode die nichts zurückgeben soll(void), willst aber etwas zurückgeben. Das passt nicht.
Der zweite Fehler hängt wahrscheinlich damit zusammen da der nur sieht, die BALL Methode gibt nichts zurück, aber er braucht eine Ganzzahl(int) als zweiten Parameter.
Übergib der Methode setLocation als zweites Argument
Ball.getY()
Die BALL-Methode ist überflüssig.
Beachte im Übrigen Java Code-Konventionen, um deinen Code besser lesbar zu gestalten und Fehlerrisiken deutlich zu verringern. Variablennamen beginnen in der Regel mit einem Kleinbuchstaben, damit man sie von Klassen/Typnamen unterscheiden kann. In deinem Fall ist z.B. nicht sofort ersichtlich, ob Ball auf ein Objekt zeigt oder die Klasse gemeint ist. Die Methode getY könnte also vom reinen Lesen als statisch eingeschätzt werden, obwohl sie es nicht ist.
Auch bei der Benamung von Bezeichnern solltest du etwas anders verfahren. Der Name BALL beschreibt nicht das tatsächliche Verhalten, welches deine Methode implementiert hat. Es ist nicht von außen ersichtlich, dass sie doch nur eine y-Koordinate zurückgeben sollte.
das funktioniert auch nicht ... dort steht dann als Fehler: "non-static method getY() cannot be referenced from a static context"
Also ist Ball eine Klasse. Genau solche Verwechslungen meinte ich im vorherigen Kommentar. Nur dein Ball-Objekt kann auf seine gebundenen Methoden zugreifen. Über den Klassennamen des Objekts geht es nicht.
Du musst der Gegner-Klasse also eine Referenz auf dein Ballobjekt überreichen.
Beispiel:
class Enemy {
private Ball ball;
public Enemy(Ball ball) {
this.ball = ball;
}
// etc. ...
}
// at game start
Ball ball = new Ball();
Enemy enemy = new Enemy(ball);
Die Enemy-Klasse bekommt ein Feld, welches künftig auf das Ballobjekt verweisen soll. Das Objekt selbst wird beim Anlegen des Enemy-Objekts über den Konstruktor hineingereicht und in dem Feld gespeichert. Künftig kannst du (z.B. in der act-Methode von Enemy) auf den Ball und somit auch auf seine sichtbaren Methoden zugreifen (so wie in meinem ersten Kommentar beschrieben).
Irgendwann zu Programmstart, wenn du all deine Objekte einmal erstellst, musst du dein konkretes Ballobjekt an dein konkretes Enemy-Objekt übergeben.
Danke schon mal … und wie muss ich es dann jeweils schreiben?