Seite 1 von 2
Variablen Klassenübergreifend nutzen
Verfasst: So Jun 21, 2015 3:07 pm
von sashpta
Hey
wie kann ich eine Variable die in einer Klasse erstellt wurde in einer anderen Klasse verwenden?
also auf das Snake Spiel bezogen wie kann ich die in "public class Snake_0 extends GameGrid" erstellte variable "startingSpeed" in "public void tryToEat(Location lastLocation)" von der Klasse "class Snake extends Actor " verwenden?
Hier der Code hab da mal ein paar Ausrufezeichen hin gemacht wo ich das meine ^^
Code: Alles auswählen
import ch.aplu.jgamegrid.*;
import java.awt.Color;
import java.util.ArrayList;
import java.awt.event.KeyEvent;
public class Snake_0 extends GameGrid
{
// geschwindigkeit
public int startingSpeed = 1000; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
public Snake_0()
{
super(20 , 20 ,20, Color.darkGray, false);
reset();
show();
doRun();
}
public void reset()
{
removeAllActors();
// Nachricht oben einfügen
setTitle("Bewege die Schlange mit den Pfeiltasten.");
Snake snake = new Snake();
addActor(snake, new Location(10, 10));
addActor(new Mouse(), getRandomEmptyLocation());
snake.setDirection(Location.NORTH);
}
public static void main(String[] args)
{
new Snake_0();
}
}
// ______________ Snake ______________
class Snake extends Actor
{
public ArrayList<TailSegment> tailList = new ArrayList<TailSegment>();
public int tailSize = 0;
public Snake()
{
super(true, "sprites/snakeHead.gif");
}
public void act()
{
if (gameGrid.kbhit())
{
switch (gameGrid.getKeyCode())
{
case KeyEvent.VK_UP:
setDirection(270);
break;
case KeyEvent.VK_RIGHT:
setDirection(0);
break;
case KeyEvent.VK_LEFT:
setDirection(180);
break;
case KeyEvent.VK_DOWN:
setDirection(90);
break;
default:
return;
}
}
int lastIndex = tailList.size() - 1;
Location lastLocation = getLocation();
if (lastIndex > -1)
{
lastLocation = tailList.get(lastIndex).getLocation();
for (int i = lastIndex; i > 0; i --)
tailList.get(i).setLocation(tailList.get(i - 1).getLocation());
tailList.get(0).setLocation(getLocation());
}
move();
// wenn man das spielfeld verlässt
if (!isInGrid())
{
gameOver("Außerhalb des Spielfeldes!");
return;
}
// wenn man sich selbst isst
Actor a = gameGrid.getOneActorAt(getLocation(), TailSegment.class);
if (a != null)
{
gameOver("Du kannst dich nicht selbst essen!");
return;
}
tryToEat(lastLocation);
}
public void gameOver(String text)
{
gameGrid.setTitle(text);
gameGrid.removeAllActors();
gameGrid.addActor(new Actor("sprites/gameover.png"), new Location(10, 8));
gameGrid.doPause();
delay(5000);
gameGrid.doReset();
gameGrid.doRun();
}
public void tryToEat(Location lastLocation)
{
Actor actor = gameGrid.getOneActorAt(getLocation(), Mouse.class);
if (actor != null)
{
TailSegment newTail = new TailSegment();
gameGrid.addActor(newTail, lastLocation);
tailList.add(newTail);
tailSize++;
actor.removeSelf();
setSimulationPeriod(startingSpeed - 50); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
gameGrid.addActor(new Mouse(), gameGrid.getRandomEmptyLocation());
}
}
}
class Mouse extends Actor
{
public Mouse()
{
super("sprites/sMouse.gif");
}
}
// ____________ Snake Schwanz ________
class TailSegment extends Actor
{
public TailSegment()
{
super("sprites/snakeTail.gif");
}
}
habt ihr ne Ahnung ob und wenn ja wie das geht?
Danke
Edit by cloidnerux: quote- zu code-Tags geändert
Re: Variablen Klassenübergreifend nutzen
Verfasst: So Jun 21, 2015 4:29 pm
von cloidnerux
Du kannst globale Variablen anlegen, dass sollte man aber tunlichst vermeiden.
Je nach dem, wie der Parameter genutzt wird, hast du unterschiedliche Lösungen.
Ist er konstant und ändert sich nicht während das Programm läuft, kannst du ihn als "public static" kennzeichnen:
Code: Alles auswählen
public class Snake_0 extends GameGrid
{
// geschwindigkeit
public static int startingSpeed = 1000;
So kannst du per
darauf zugreifen. Static bedeutet hier, dass die Variable "statisch" ist, sich damit nicht änder. So kann man ohne Instanz einer Klasse, auf diesen Wert zugreifen.
Ändert sich der Wert im laufe des Programmes, solltest du der Klasse Snake eine Instanz der Klasse Snake_0(Und nutzt bitte Sinnvolle Namen) übergeben.
Re: Variablen Klassenübergreifend nutzen
Verfasst: So Jun 21, 2015 6:31 pm
von sashpta
Oke danke, wie meinst du das mit der Instanz?
Re: Variablen Klassenübergreifend nutzen
Verfasst: So Jun 21, 2015 10:46 pm
von nufan
cloidnerux hat geschrieben:Du kannst globale Variablen anlegen
Hm? In Java?
cloidnerux hat geschrieben:Ist er konstant und ändert sich nicht während das Programm läuft, kannst du ihn als "public static" kennzeichnen:
Verwechselst du static mit final?
Re: Variablen Klassenübergreifend nutzen
Verfasst: Mo Jun 22, 2015 9:05 am
von Xin
dani93 hat geschrieben:cloidnerux hat geschrieben:Du kannst globale Variablen anlegen
Hm? In Java?
Klassenintern?
Code: Alles auswählen
public class GlobalVariables
{
public:
public static int value = 0;
};
int accessFromEverywhere = GlobalVariables.value;
Nicht schön, aber Java
cloidnerux hat geschrieben:Ist er konstant und ändert sich nicht während das Programm läuft, kannst du ihn als "public static" kennzeichnen:
Verwechselst du static mit final?[/quote]
Sieht so aus.
sashpta hat geschrieben:Oke danke, wie meinst du das mit der Instanz?
Eine Klasse klassifiziert ein Objekt. Zum Beispiel ein Klumpen Blech mit Rädern gehört zur Klasse "Auto". Wenn wir von class Auto sprechen, muss aber kein Auto anwesend sein. Wir wissen auch ohne Auto, dass ein Auto Räder hat. Von der Beschreibung "class Auto" kannst Du aber nicht überfahren werden. Dafür brauchst Du eine Instanz der Klasse Auto: eben ein echtes Auto und nicht nur die Beschreibung.
"class Auto" ist die Beschreibung, new Auto() erzeugt ein Objekt vom Typ Auto: eine Instanz.
Re: Variablen Klassenübergreifend nutzen
Verfasst: Mo Jun 22, 2015 12:03 pm
von sashpta
Oke, erst mal vielen Dank, aber wie würde man das dann als Instanz machen?
ich muss dann in
für die Variable "startingSpeed" ne Instanz erstellen, so wie ich das jetzt verstanden habe, sprich ich muss irgendwie sowas wie
machen oder? und wie ruf ich die später wieder auf? will die ja später wieder in ner anderen class aufrufen
Re: Variablen Klassenübergreifend nutzen
Verfasst: Mo Jun 22, 2015 1:03 pm
von Xin
Deine Klasse Snake_0 ist ja offenbar Dein Spiel. Also Dein globales Umfeld. Alles wird von einer einzigen Instanz von Snake_0 aus kontrolliert - richtig? Entsprechend kannst Du Deine Variable 'startingSpeed' auch in Snake_0 verwalten.
Wenn Du die Instanz von Snake_0 verlässt (also in gerufenen Methoden anderer Objekte), so übergibst Du entweder den Wert von 'startingSpeed' oder Du leitst Snake_0 von einem Interface ab - zum Beispiel "GlobalConfig", was für alle Informationen Getter anbietet: getStartingSpeed(). Snake_0 implementiert das und alle externen Methoden bekommen eine Referenz zu einem "GlobalConfig"-Objekt. Du übergibst von Snake_0 immer this als Konfiguration und die Methoden können sich alle Informationen von dem GlobalConfig-Objekt abholen, welches still und heimlich Deine Snake_0-Instanz ist.
Re: Variablen Klassenübergreifend nutzen
Verfasst: Mo Jun 22, 2015 5:31 pm
von sashpta
Xin hat geschrieben:Deine Klasse Snake_0 ist ja offenbar Dein Spiel. Also Dein globales Umfeld. Alles wird von einer einzigen Instanz von Snake_0 aus kontrolliert - richtig? Entsprechend kannst Du Deine Variable 'startingSpeed' auch in Snake_0 verwalten.
Wenn Du die Instanz von Snake_0 verlässt (also in gerufenen Methoden anderer Objekte), so übergibst Du entweder den Wert von 'startingSpeed' oder Du leitst Snake_0 von einem Interface ab - zum Beispiel "GlobalConfig", was für alle Informationen Getter anbietet: getStartingSpeed(). Snake_0 implementiert das und alle externen Methoden bekommen eine Referenz zu einem "GlobalConfig"-Objekt. Du übergibst von Snake_0 immer this als Konfiguration und die Methoden können sich alle Informationen von dem GlobalConfig-Objekt abholen, welches still und heimlich Deine Snake_0-Instanz ist.
hab das dann so gemacht, hab als Kommentar dazu geschrieben was ich verändert hab, aber das klappt leider nicht :/ hab da bestimmt was falsch gemacht aber hab auch das mit dem "GlobalConfig" und so nicht so recht verstanden ^^
Code: Alles auswählen
import ch.aplu.jgamegrid.*;
import java.awt.Color;
import java.util.ArrayList;
import java.awt.event.KeyEvent;
public class Snake_0 extends GameGrid
{
public Snake_0()
{
super(20 , 20 ,20, Color.darkGray, false);
int startingSpeed = 1000; // hier ist jetzt das startingSpeed in Snake_0 drin
reset();
show();
doRun();
}
public void reset()
{
removeAllActors();
// Nachricht oben einfügen
setTitle("Bewege die Schlange mit den Pfeiltasten.");
Snake snake = new Snake();
addActor(snake, new Location(10, 10));
addActor(new Mouse(), getRandomEmptyLocation());
snake.setDirection(Location.NORTH);
}
public static void main(String[] args)
{
new Snake_0();
}
}
// ______________ Snake ______________
class Snake extends Actor
{
public ArrayList<TailSegment> tailList = new ArrayList<TailSegment>();
public int tailSize = 0;
public Snake()
{
super(true, "sprites/snakeHead.gif");
}
public void act()
{
if (gameGrid.kbhit())
{
switch (gameGrid.getKeyCode())
{
case KeyEvent.VK_UP:
setDirection(270);
break;
case KeyEvent.VK_RIGHT:
setDirection(0);
break;
case KeyEvent.VK_LEFT:
setDirection(180);
break;
case KeyEvent.VK_DOWN:
setDirection(90);
break;
default:
return;
}
}
int lastIndex = tailList.size() - 1;
Location lastLocation = getLocation();
if (lastIndex > -1)
{
lastLocation = tailList.get(lastIndex).getLocation();
for (int i = lastIndex; i > 0; i --)
tailList.get(i).setLocation(tailList.get(i - 1).getLocation());
tailList.get(0).setLocation(getLocation());
}
move();
// wenn man das spielfeld verlässt
if (!isInGrid())
{
gameOver("Außerhalb des Spielfeldes!");
return;
}
// wenn man sich selbst isst
Actor a = gameGrid.getOneActorAt(getLocation(), TailSegment.class);
if (a != null)
{
gameOver("Du kannst dich nicht selbst essen!");
return;
}
tryToEat(lastLocation);
}
public void gameOver(String text)
{
gameGrid.setTitle(text);
gameGrid.removeAllActors();
gameGrid.addActor(new Actor("sprites/gameover.png"), new Location(10, 8));
gameGrid.doPause();
delay(5000);
gameGrid.doReset();
gameGrid.doRun();
}
public void tryToEat(Location lastLocation)
{
Actor actor = gameGrid.getOneActorAt(getLocation(), Mouse.class);
if (actor != null)
{
getStartingSpeed().Snake_0 // hab das jetzt hier hin gesetzt
TailSegment newTail = new TailSegment();
gameGrid.addActor(newTail, lastLocation);
tailList.add(newTail);
tailSize++;
actor.removeSelf();
setSimulationPeriod(startingSpeed - 50);
gameGrid.addActor(new Mouse(), gameGrid.getRandomEmptyLocation());
}
}
}
class Mouse extends Actor
{
public Mouse()
{
super("sprites/sMouse.gif");
}
}
// ____________ Snake Schwanz ________
class TailSegment extends Actor
{
public TailSegment()
{
super("sprites/snakeTail.gif");
}
}
cloidnerux hat geschrieben:
Ist er konstant und ändert sich nicht während das Programm läuft, kannst du ihn als "public static" kennzeichnen:
Code: Alles auswählen
public class Snake_0 extends GameGrid
{
// geschwindigkeit
public static int startingSpeed = 1000;
So kannst du per
darauf zugreifen.
hab das mal versucht, hier der Code:
Code: Alles auswählen
import ch.aplu.jgamegrid.*;
import java.awt.Color;
import java.util.ArrayList;
import java.awt.event.KeyEvent;
public class Snake_0 extends GameGrid
{
public static int startingSpeed = 1000;
public Snake_0()
{
super(20 , 20 ,20, Color.darkGray, false);
reset();
show();
doRun();
}
public void reset()
{
removeAllActors();
// Nachricht oben einfügen
setTitle("Bewege die Schlange mit den Pfeiltasten.");
Snake snake = new Snake();
addActor(snake, new Location(10, 10));
addActor(new Mouse(), getRandomEmptyLocation());
snake.setDirection(Location.NORTH);
}
public static void main(String[] args)
{
new Snake_0();
}
}
// ______________ Snake ______________
class Snake extends Actor
{
public ArrayList<TailSegment> tailList = new ArrayList<TailSegment>();
public int tailSize = 0;
public Snake()
{
super(true, "sprites/snakeHead.gif");
}
public void act()
{
if (gameGrid.kbhit())
{
switch (gameGrid.getKeyCode())
{
case KeyEvent.VK_UP:
setDirection(270);
break;
case KeyEvent.VK_RIGHT:
setDirection(0);
break;
case KeyEvent.VK_LEFT:
setDirection(180);
break;
case KeyEvent.VK_DOWN:
setDirection(90);
break;
default:
return;
}
}
int lastIndex = tailList.size() - 1;
Location lastLocation = getLocation();
if (lastIndex > -1)
{
lastLocation = tailList.get(lastIndex).getLocation();
for (int i = lastIndex; i > 0; i --)
tailList.get(i).setLocation(tailList.get(i - 1).getLocation());
tailList.get(0).setLocation(getLocation());
}
move();
// wenn man das spielfeld verlässt
if (!isInGrid())
{
gameOver("Außerhalb des Spielfeldes!");
return;
}
// wenn man sich selbst isst
Actor a = gameGrid.getOneActorAt(getLocation(), TailSegment.class);
if (a != null)
{
gameOver("Du kannst dich nicht selbst essen!");
return;
}
tryToEat(lastLocation);
}
public void gameOver(String text)
{
gameGrid.setTitle(text);
gameGrid.removeAllActors();
gameGrid.addActor(new Actor("sprites/gameover.png"), new Location(10, 8));
gameGrid.doPause();
delay(5000);
gameGrid.doReset();
gameGrid.doRun();
}
public void tryToEat(Location lastLocation)
{
Actor actor = gameGrid.getOneActorAt(getLocation(), Mouse.class);
if (actor != null)
{
TailSegment newTail = new TailSegment();
gameGrid.addActor(newTail, lastLocation);
tailList.add(newTail);
tailSize++;
actor.removeSelf();
setSimulationPeriod(Snake_0.startingSpeed - 50);
gameGrid.addActor(new Mouse(), gameGrid.getRandomEmptyLocation());
}
}
}
class Mouse extends Actor
{
public Mouse()
{
super("sprites/sMouse.gif");
}
}
// ____________ Snake Schwanz ________
class TailSegment extends Actor
{
public TailSegment()
{
super("sprites/snakeTail.gif");
}
}
der kann das setSimulationPeriod nicht finden meint er aber warum? hatte das schon mal anders geschrieben, so, dass es bei jedem Tod schneller wurd und da gings auch mit 'setSimulationPeriod' warum jezt nicht?
wobei mir ist grad eingefalle, wär es nicht besser anstatt
zu machen? und würd das was bringen?
Re: Variablen Klassenübergreifend nutzen
Verfasst: Mo Jun 22, 2015 9:56 pm
von sashpta
Mir ist grad noch was aufgefallen, muss man evtl auch bei
was ändern?
weil der Code ist ja so:
Code: Alles auswählen
import ch.aplu.jgamegrid.*;
import java.awt.Color;
import java.util.ArrayList;
import java.awt.event.KeyEvent;
public class Snake_0 extends GameGrid
{
private int startingSpeed = 100; // !!!!!!!!!!!!!!!!
public Snake_0()
{
super(20 , 20 ,20, Color.darkGray, false);
reset();
setSimulationPeriod(startingSpeed); // _____________________________________
show();
doRun();
}
public void reset()
{
removeAllActors();
// Nachricht oben einfügen
setTitle("Bewege die Schlange mit den Pfeiltasten.");
Snake snake = new Snake();
addActor(snake, new Location(10, 10));
addActor(new Mouse(), getRandomEmptyLocation());
snake.setDirection(Location.NORTH);
}
public static void main(String[] args)
{
new Snake_0();
}
}
// ______________ Snake ______________
class Snake extends Actor
{
public int startingSpeed = 1000;
public ArrayList<TailSegment> tailList = new ArrayList<TailSegment>();
public int tailSize = 0;
public Snake()
{
super(true, "sprites/snakeHead.gif");
}
public void act()
{
if (gameGrid.kbhit())
{
switch (gameGrid.getKeyCode())
{
case KeyEvent.VK_UP:
setDirection(270);
break;
case KeyEvent.VK_RIGHT:
setDirection(0);
break;
case KeyEvent.VK_LEFT:
setDirection(180);
break;
case KeyEvent.VK_DOWN:
setDirection(90);
break;
default:
return;
}
}
int lastIndex = tailList.size() - 1;
Location lastLocation = getLocation();
if (lastIndex > -1)
{
lastLocation = tailList.get(lastIndex).getLocation();
for (int i = lastIndex; i > 0; i --)
tailList.get(i).setLocation(tailList.get(i - 1).getLocation());
tailList.get(0).setLocation(getLocation());
}
move();
// wenn man das spielfeld verlässt
if (!isInGrid())
{
gameOver("Außerhalb des Spielfeldes!");
return;
}
// wenn man sich selbst isst
Actor a = gameGrid.getOneActorAt(getLocation(), TailSegment.class);
if (a != null)
{
gameOver("Du kannst dich nicht selbst essen!");
return;
}
tryToEat(lastLocation);
}
public void gameOver(String text)
{
gameGrid.setTitle(text);
gameGrid.removeAllActors();
gameGrid.addActor(new Actor("sprites/gameover.png"), new Location(10, 8));
gameGrid.doPause();
delay(5000);
gameGrid.doReset();
gameGrid.doRun();
}
public void tryToEat(Location lastLocation)
{
Actor actor = gameGrid.getOneActorAt(getLocation(), Mouse.class);
if (actor != null)
{
TailSegment newTail = new TailSegment();
gameGrid.addActor(newTail, lastLocation);
tailList.add(newTail);
tailSize++;
actor.removeSelf();
startingSpeed = startingSpeed - 50; // !!!!!!!!!!!!!!!!!!!!!
gameGrid.addActor(new Mouse(), gameGrid.getRandomEmptyLocation());
}
}
}
class Mouse extends Actor
{
public Mouse()
{
super("sprites/sMouse.gif");
}
}
// ____________ Snake Schwanz ________
class TailSegment extends Actor
{
public TailSegment()
{
super("sprites/snakeTail.gif");
}
}
da wo die '_______________' sind wird ja festgelegt, dass die Geschwindigkeit, mit der sich die Schlange bewegt gleich der Variable startingSpeedist. So, jedoch kann man bei setSimulationPeriod() auch ne Zahl rein schreiben, somit würde man die Variable 'startingSpeed doch gar nicht mehr brauchen, und müsste es nur noch schaffen, dass man das 'setSimulationPeriod()' ändert oder nicht?
Oder ist das so, dass man das nicht dauerhaft ändern kann wenn mans mit Zahlen macht? und dass man deswegen die Variable braucht?
Re: Variablen Klassenübergreifend nutzen
Verfasst: Di Jun 23, 2015 5:45 pm
von Xin
sashpta hat geschrieben:da wo die '_______________' sind wird ja festgelegt, dass die Geschwindigkeit, mit der sich die Schlange bewegt gleich der Variable startingSpeedist. So, jedoch kann man bei setSimulationPeriod() auch ne Zahl rein schreiben, somit würde man die Variable 'startingSpeed doch gar nicht mehr brauchen, und müsste es nur noch schaffen, dass man das 'setSimulationPeriod()' ändert oder nicht?
Oder ist das so, dass man das nicht dauerhaft ändern kann wenn mans mit Zahlen macht? und dass man deswegen die Variable braucht?
An setSimulationPeriod wird nicht die Variable übergeben, sondern eine Kopie des Inhaltes.
Du kannst also auch setSimulationPeriod(100) für den gleichen Effekt angeben.
Ob Du eine Variable benötigst, hängt davon ab, ob Du dir einen Wert merken möchtest, der im Verlauf des Programms variabel ist - der ich also verändert. Ein Punktestand zum Beispiel.