Hallo Leute,
Ich hab Probleme damit die Ausführungsgeschwindigkeit einer Simulation zu steuern, dazu erst einmal ein paar Infos.
Momentan muss ich für die Uni den Hamster Simulator nachprogrammieren, dessen wichtigsten Bestandteile sind ein Editor in dem man neue Befehle für den Hamster in Java programmieren kann und ein JPanel indem der Hamster visuell in einer 2D- Welt dargestellt wird.
In dem JPanel wird der Hamster und sein Territorium dargestellt. Diese beiden Klassen bilden auch das Model.
Der Hamster ist von einer Klasse Actor abgeleitet und hat dementsprechend schon einen Befehlssatz. Man kann den selbstgeschriebenen Code im Editor compilieren und dann wird der Hamster durch einen neuen Hamster ersetzt, dieser besitzt dann die neuen Methoden sowie die Methoden des Actors.
Soweit so gut, jetzt möchte das man eine Simulation starten kann (start, pause, stop, JSlider für die Ausführungsgeschwindigkeit). Die Simulation soll über Threads realisiert werden.
Dazu habe ich einen Simulations_Manager indem geschaut wird welcher der Buttons gedrückt wurde und indem geprüft wird ob der Wert des JSliders verändert wurde.
Wenn der play- Button gedrückt wird soll die Simulation gestartet werden, hier liegt mein Problem:
Es soll nämlich die Main- Methode des momentan aktiven Actors/Hamsters ausgeführt werden, das habe ich soweit auch hinbekommen, allerdings habe ich keine Möglichkeit gefunden wie ich wärend der Ausführung der Main- Methode die Ausführungsgeschwindigkeit anpassen kann.
Mir ist klar das dies mit Thread.sleep(sleepTime) passieren sollte, allerdings wird die Main- Methode direkt als ganzes ausgeführt, ich hätte das aber gerne so, das die Main- Methode quasi Schritt für Schritt ausgeführt wird.
Jetzt ist meine Frage ob es überhaupt möglich ist die Main- Methode Schritt für Schritt auszuführen, oder wie man das sonst realisieren könnte.
Ich hatte noch gehofft das man das Warten sonst in der update() Methode realisieren kann aber da fehlt mir auch der Ansatz.
Würde mich freuen wenn mir jemand einen Schubs in die richtige Richtung geben kann oder sonst einen Ansatz hat wie das Problem sonst zu lösen ist.
Gruß Chris
Ich hab Probleme damit die Ausführungsgeschwindigkeit einer Simulation zu steuern, dazu erst einmal ein paar Infos.
Momentan muss ich für die Uni den Hamster Simulator nachprogrammieren, dessen wichtigsten Bestandteile sind ein Editor in dem man neue Befehle für den Hamster in Java programmieren kann und ein JPanel indem der Hamster visuell in einer 2D- Welt dargestellt wird.
In dem JPanel wird der Hamster und sein Territorium dargestellt. Diese beiden Klassen bilden auch das Model.
Der Hamster ist von einer Klasse Actor abgeleitet und hat dementsprechend schon einen Befehlssatz. Man kann den selbstgeschriebenen Code im Editor compilieren und dann wird der Hamster durch einen neuen Hamster ersetzt, dieser besitzt dann die neuen Methoden sowie die Methoden des Actors.
Soweit so gut, jetzt möchte das man eine Simulation starten kann (start, pause, stop, JSlider für die Ausführungsgeschwindigkeit). Die Simulation soll über Threads realisiert werden.
Dazu habe ich einen Simulations_Manager indem geschaut wird welcher der Buttons gedrückt wurde und indem geprüft wird ob der Wert des JSliders verändert wurde.
Java:
public class SimulationManager implements ActionListener {
JToggleButton play;
JToggleButton pause;
JToggleButton stop;
boolean running;
boolean paused;
Simulation simulation;
public SimulationManager(JToggleButton play, JToggleButton pauseButton,
JToggleButton stopButton, Simulation simulation) {
this.play = play;
this.pause = pauseButton;
this.stop = stopButton;
this.simulation = simulation;
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == this.play) {
this.simulation.startSimulation();
} else if (e.getSource() == this.stop) {
this.simulation.stopSimulation();
} else if (e.getSource() == this.pause) {
this.simulation.pauseSimulation();
}
}
}
Wenn der play- Button gedrückt wird soll die Simulation gestartet werden, hier liegt mein Problem:
Es soll nämlich die Main- Methode des momentan aktiven Actors/Hamsters ausgeführt werden, das habe ich soweit auch hinbekommen, allerdings habe ich keine Möglichkeit gefunden wie ich wärend der Ausführung der Main- Methode die Ausführungsgeschwindigkeit anpassen kann.
Mir ist klar das dies mit Thread.sleep(sleepTime) passieren sollte, allerdings wird die Main- Methode direkt als ganzes ausgeführt, ich hätte das aber gerne so, das die Main- Methode quasi Schritt für Schritt ausgeführt wird.
Java:
public class Simulation extends Thread implements Runnable, Observer {
// volatile Thread thread;
Territorium terri;
// TODO Schieberegler für Geschwindigkeit
volatile int sleepTime;
public Simulation(Territorium territorium) {
this.terri = territorium;
// this.thread = new Thread();
}
@Override
public void run() {
Class<?> clas = this.terri.getActor().getClass();
try {
Method method = clas.getMethod("main", null);
String[] params = null;
try {
method.invoke(this.terri.getActor(), params);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void startSimulation() {
this.run();
}
public void stopSimulation() {
this.stop();
}
public void pauseSimulation() {
this.interrupt();
}
@Override
public void update(Observable o, Object arg) {
if(!(this == null)) {
try {
this.sleep(sleepTime*100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void setSleeptime(int fps) {
this.sleepTime = fps;
}
}
Jetzt ist meine Frage ob es überhaupt möglich ist die Main- Methode Schritt für Schritt auszuführen, oder wie man das sonst realisieren könnte.
Ich hatte noch gehofft das man das Warten sonst in der update() Methode realisieren kann aber da fehlt mir auch der Ansatz.
Würde mich freuen wenn mir jemand einen Schubs in die richtige Richtung geben kann oder sonst einen Ansatz hat wie das Problem sonst zu lösen ist.
Gruß Chris