Hallo,
ich habe ein Problem mir der Methode sleep(). Ich weiss nicht genau wie sie aussehen muss.
{
Red r;
int xPos;
int yPos;
xPos = 137;
yPos = 131;
r = new Red();
this.getWorld().addObject(r, xPos, yPos);
r.sleep(500);
this.getWorld().removeObject(r);
}```
So sieht es bis jetzt aus. Wenn ich kompelieren will kommt die Fehlermeldung "cannot find symbol - method sleep(int)".
Wie geht es richtig?
Ja,
Thread.sleep(zeit);
mit einerm try-catch drumgewickelt, aber das wird vermutlich nicht den geüwnschten Effekt haben: Dadurch wird ja der Thread pausiert, d.h. man sieht vermutlich kein Neuzeichnen mehr. Poste ggf. mal mehr Code, falls die Frage sich nicht so klärt.
Also es soll so laufen:
Das Objekt “Red” wird gesetzt und nach einer halben Sekunde soll es wieder verschwinden.
Wird ein “Farbmemory”, deswegen müssen die Farben (hier exemplarisches “Red”) auftauchen und nach einer bestimmten Zeit wieder verschwinden
Soweit ich weiß geht es ja um Greenfoot. Ich weiß nicht, welche “Spezifika” es da gibt (ich hatte es nur mal kurz ausprobiert, aber nicht mal da bin ich mir sicher). In Swing müßte man GROB sowas machen wie
public void setRed()
{
final Red r = new Red();
final int xPos = 137;
final int yPos = 131;
Thread thread = new Thread(new Runnable()
{
@Override
public void run()
{
getWorld().addObject(r, xPos, yPos);
try
{
Thread.sleep(500);
}
catch (InterrupedException e)
{
Thread.currentThread().interrupt();
}
getWorld().removeObject(r);
}
});
thread.start();
}
(immer mit der “Gefahr”, dass es nicht funktioniert, weil die “World” nur über bestimmte Threads verändert werden darf). Kannsts ja mal ausprobieren, ob das in Greenfoot so oder so ähnlich funktioniert.
also aussehen tuts schonmal gut
aber es kommt die fehlermeldung: „local variable r is accesed from within inner class; need to be declared final“
so siehts jetzt bei mir aus:
{
Red r;
int xPos;
int yPos;
xPos = 137;
yPos = 131;
Thread thread = new Thread(new Runnable()
{
@Override
public void run()
{
this.addObject(r, xPos, yPos);
try
{
Thread.sleep(500);
}
catch (InterrupedException e)
{
Thread.currentThread().interrupt();
}
this.removeObject(r);
}
});
thread.start();
}```
wenn ich die Variable r final setzte möchte er auch das ich xPos und yPos final setze. Dann kann z.B setObject nicht mehr finden. Irgendwie hackts...
Hab es jetz kopiert und in meinem eingefügt. Kompilieren geht nun aber das Objekt Red verschwindet nicht und wenn ich das Spiel pausier kommt das Greentfoot Terminal und spuckt Fehlermeldungen aus…
Exception in thread “Thread-445” java.lang.NullPointerException
at java.util.LinkedList.remove(LinkedList.java:225)
at greenfoot.collision.ColManager.removeObject(ColManager.java:211)
at greenfoot.World.removeObject(World.java:428)
at Starter$1.run(Starter.java:69)
at java.lang.Thread.run(Thread.java:662)
Hab’ mal kurz in der Greenfoot-API-Doku geschaut… Offenbar gibt es eine eigene Methode anstelle von “sleep”, nämlich “delay”: Wie seht’s denn aus, wenn du das (ohne Threads oder so) einfach so implementierst:
public void setRed()
{
Red r = new Red();
int xPos = 137;
int yPos = 131;;
this.getWorld().addObject(r, xPos, yPos);
Greenfoot.delay(500); // <--------------- Greenfoot-Ersatz für "sleep"
this.getWorld().removeObject(r);
}
Die “500” die da übergeben werden sind NICHT Millisekunden, sondern irgendeine Zeiteinheit, die von diesem Geschwindigkeits-Slider abhängt… ggf. kannst du dort mal andere Werte probieren (falls du nicht weißt oder nachlesen kannst, was dort ein vernünftiger Wert wäre…)
Wenn’s nicht klappt, müßte ich mir bei Gelegenheit mal Greenfoot runterladen und genauer ansehen. Kann ja nicht sooo schwer sein.
Noch ein bißchen blind getippt: Ich weiß nicht, von wo aus deine Methode aufgerufen wird, aber poste mal ein paar Zeilen, aus dem Bauch heraus:
class TheClass extends Actor
{
Red red;
long redShownTime;
public void act()
{
if (red == null)
{
red = new Red();
int xPos = 137;
int yPos = 131;
this.getWorld().addObject(r, xPos, yPos);
redShownTime = System.currentTimeMillis();
}
else
{
long curTime = System.currentTimeMillis();
if (curTime >= redShownTime + 500)
{
this.getWorld().removeObject(red);
red = null;
}
}
}
}
EDIT: Wenn das nicht hilft, probier’ ich’s morgen ggf. nochmal. Poste bis dahin mal ein bißchen code, wo man sieht, wo deine Methode aufgerufen wird oder werden soll, damit ich’s schneller testen kann.