This site requires JavaScript, please enable it in your browser!
Greenfoot back
Tuffel
Tuffel wrote ...

2021/9/10

I need help with pausing an actor

Tuffel Tuffel

2021/9/10

#
the code is: turn(Greenfoot.getRandomNumber(360)); move(5); { if(Greenfoot.getRandomNumber(1) == 0) { fliegeAusspucken(); //its a method to spawn another actor at the place this actor is being rn } } i want to make the actor stop after the fliegeAusspucken. But when i use Greenfoot.delay or something else it stops the whole scenario. Can someone fix this please?
Tuffel Tuffel

2021/9/10

#
i also have some other precode stuff from my school, if that helps heres the whole code of it: import greenfoot.*; // (World, Actor, GreenfootImage, and Greenfoot) import java.util.List; import javax.swing.JOptionPane; //import java.io.*; /** * Klasse für Objekte vom Typ Fliegenleger. * @author Mathias Müller * @version 29.08.2006 */ public class Fliegenleger extends Actor { private int aktionenProSekunde; private int fliegen; private boolean nachrichten; private boolean geklatscht; /** * Erzeugt ein Spinne-Objekt ohne Fliegen mit 4 Aktionen pro Sekunde. */ public Fliegenleger() { aktionenProSekunde = 4; fliegen = 0; nachrichten = true; geklatscht = false; } /** * Erzeugt ein Spinne-Objekt mit einer gegebenen Anzahl Fliegen und 4 Aktionen pro Sekunde. * @param fliegen die Anzahl der gefressenen Fliegen */ public Fliegenleger(int fliegen) { aktionenProSekunde = 200; if(fliegen < 0) { fliegen = 0; } this.fliegen = fliegen; nachrichten = true; geklatscht = false; } /** * Die Fliegenleger dreht sich um 90° entgegen dem Uhrzeigersinn. Wirkungslos bei geklatschter Fliegenleger. */ public void linksDrehen() { if(!geklatscht) { pause(); setRotation((getRotation()+270) % 360); pause(); } } /** * Die Fliegenleger dreht sich um 90° im Uhrzeigersinn. Wirkungslos bei geklatschter Fliegenleger. */ public void rechtsDrehen() { if(!geklatscht) { pause(); setRotation((getRotation()+90) % 360); pause(); } } /** * Die Fliegenleger geht einen Schritt in Blickrichtung, wenn sie nicht vor einem Hindernis steht. Wirkungslos bei geklatschter Fliegenleger. * Läuft sie dabei auf eine Klatsche, wird sie geklatscht. */ public void schritt() { if(!geklatscht) { pause(); boolean kv = klatscheVorn(); int richtung = getRotation(); int x = 0; int y = 0; switch(richtung) { case 0: x = getX() + 1; y = getY(); break; case 90: x = getX(); y = getY()+1; break; case 180: x = getX()-1; y = getY(); break; case 270: x = getX(); y = getY()-1; break; } if(!hindernisVorn()) { setLocation(x,y); if(kv) { geklatscht = true; setImage("images/thekla_geklatscht.png"); stop(500); if(nachrichten) { JOptionPane.showMessageDialog(null,"Die Fliegenleger wurde geklatscht.","Fehler",JOptionPane.ERROR_MESSAGE); } } pause(); } else { if(nachrichten) { } } } } /** * Die Fliegenleger frisst eine Fliege, falls mindestens eine auf dem Platz liegt. Wirkungslos bei geklatschter Fliegenleger. */ public void fliegeFressen() { if(!geklatscht) { pause(); Actor fliege = getOneObjectAtOffset(0,0,Fliege.class); if(fliege != null) { fliegen++; getWorld().removeObject(fliege); pause(); } else { if(nachrichten) { JOptionPane.showMessageDialog(null,"Auf dem Platz liegt keine Fliege.","Fehler",JOptionPane.ERROR_MESSAGE); } } } } /** * Die Fliegenleger wird mit anzahl zusŠtzlichen Fliegen gefŸttert. Wirkungslos bei geklatschter Fliegenleger. */ public void fliegenFuettern(int anzahl) { if(!geklatscht) { fliegen +=anzahl; } } /** * Die Fliegenleger spuckt eine Fliege aus, falls sie mindestens eine gefressen hat. Wirkungslos bei geklatschter Fliegenleger. */ public void fliegeAusspucken() { if(!geklatscht) { pause(); if(fliegen>0) { getWorld().addObject(new Fliege(),getX(),getY()); setLocation(getX(),getY()); fliegen--; pause(); } else { if(nachrichten) { JOptionPane.showMessageDialog(null,"Die Fliegenleger hat keine Fliege gefressen.","Fehler",JOptionPane.ERROR_MESSAGE); } } } } /** * Prüft, ob auf dem Platz vor der Fliegenleger eine Klatsche lauert. * @return true: Klatsche, false: keine Klatsche, bei geklatschter Spinne: immer false */ public boolean klatscheVorn() { if(!geklatscht) { int dx = 0; int dy = 0; int richtung = getRotation(); switch(richtung) { case 0: dx = 1; break; case 90: dy = 1; break; case 180: dx = -1; break; case 270: dy = -1; break; } Actor klatsche = getOneObjectAtOffset(dx,dy,Klatsche.class); return klatsche != null; } else { return false; } } /** * Prüft, ob auf dem Platz vor der Fliegenleger ein Hindernis liegt. * @return true: Hindernis, false: kein Hindernis, bei geklatschter Spinne: immer false */ public boolean hindernisVorn() { if(!geklatscht) { int dx = 0; int dy = 0; int richtung = getRotation(); switch(richtung) { case 0: dx = 1; break; case 90: dy = 1; break; case 180: dx = -1; break; case 270: dy = -1; break; } Actor klatsche = getOneObjectAtOffset(dx,dy,Hindernis.class); return klatsche != null; } else { return false; } } /** * Prüft, ob rechts neben der Fliegenleger ein Hindernis liegt. * @return true: Hindernis, false: kein Hindernis, bei geklatschter Spinne: immer false */ public boolean hindernisRechts() { if(!geklatscht) { int dx = 0; int dy = 0; int richtung = getRotation(); switch(richtung) { case 0: dy = 1; break; case 90: dx = -1; break; case 180: dy = -1; break; case 270: dx = 1; break; } Actor klatsche = getOneObjectAtOffset(dx,dy,Hindernis.class); return klatsche != null; } else { return false; } } /** * Prüft, ob links neben der Fliegenleger ein Hindernis liegt. * @return true: Hindernis, false: kein Hindernis, bei geklatschter Spinne: immer false */ public boolean hindernisLinks() { if(!geklatscht) { int dx = 0; int dy = 0; int richtung = getRotation(); switch(richtung) { case 0: dy = -1; break; case 90: dx = 1; break; case 180: dy = 1; break; case 270: dx = -1; break; } Actor klatsche = getOneObjectAtOffset(dx,dy,Hindernis.class); return klatsche != null; } else { return false; } } /** * Prüft, ob auf dem Platz der Fliegenleger mindestens eine Fliege liegt. * @return true: Fliege(n) am Platz, false: keine Fliegen am Platz, bei geklatschter Fliege: immer false */ public boolean fliegeAmPlatz() { if(!geklatscht) { Actor fliege = getOneObjectAtOffset(0,0,Fliege.class); return fliege != null; } else { return false; } } /** * Liefert die Anzahl der Fliegen auf dem Platz der Fliegenleger. * @return die Anzahl der Fliegen auf Platz der Fliegenleger, bei geklatschter Spinne: immer 0 */ public int fliegenAmPlatz() { if(!geklatscht) { List fliegen = getObjectsAtOffset(0,0,Fliege.class); return fliegen.size(); } else { return 0; } } /** * Prüft, ob die Fliegenleger mindestens eine Fliege gefressen hat. * @return true: Fliege(n) gefressen, false: keine Fliege gefressen, bei geklatschter Spinne: immer false */ public boolean fliegeGefressen() { if(!geklatscht) { return fliegen > 0; } else { return false; } } /** * Liefert die Anzahl der Fliegen, die die Fliegenleger gefressen hat. * @return die Anzahl der Fliegen, die die Fliegenleger gefressen hat, bei geklatschter Spinne: immer 0 */ public int fliegenGefressen() { if(!geklatscht) { return fliegen; } else { return 0; } } /** * Schaltet die Anzeige von Fehlern und Warnungen ein. */ public void nachrichtenZeigen() { if(!geklatscht) { nachrichten = true; } } /** * Schaltet die Anzeige von Fehlern und Warnungen aus. */ public void nachrichtenVerbergen() { if(!geklatscht) { nachrichten = false; } } /** * Legt das Tempo der Programmausführung fest. * @param die Anzahl der Aktionen pro Sekunde */ public void tempo(int aktionenProSekunde) { this.aktionenProSekunde = aktionenProSekunde; } /** * Die Fliegenleger unterbricht die Programmausführung für eine gegebene Zeit. * @param die Länge der Unterbrechung in Millisekunden */ private void stop(int milliSekunden) { try { Thread.sleep(milliSekunden); greenfoot.core.WorldHandler.getInstance().repaint(); } catch(InterruptedException ie) { } } private void pause() { try { Thread.sleep(500/aktionenProSekunde); greenfoot.core.WorldHandler.getInstance().repaint(); } catch(InterruptedException ie) { } } public void act() { turn(Greenfoot.getRandomNumber(360)); move(5); { if(Greenfoot.getRandomNumber(1) == 0) { fliegeAusspucken(); } } } } (its German btw)
danpost danpost

2021/9/11

#
Tuffel wrote...
i want to make the actor stop after the fliegeAusspucken. But when i use Greenfoot.delay or something else it stops the whole scenario.
To allow the actor to pause without stopping everything else, you would need:
int pauseTimer; // pause timer field

public void act()
{
    if (pauseTimer > 0 && --pauseTimer > 0) return; // to execute pausing
    turn(Greenfoot.getRandomNumber(360);
    move(5);
    if (Greenfoot.getRandomNumber(2) == 0) fliegeAusspucken();
}
To start the pause, just set pauseTimer to some positive value. At normal running speed for the scenario, you would use about 60 times the number of seconds to pause:
pauseTimer = 180; // pauses for about 3 seconds
Tuffel Tuffel

2021/9/15

#
so everytime i want to pause the act, i have write this thing: if (pauseTimer > 0 && --pauseTimer > 0) return; ; and if i want to pause him another time with a different amnout of time, can i just change th int (here pauseTimer) to like PauseTimer? Tysm for the help, appreciated:)
danpost danpost

2021/9/15

#
Tuffel wrote...
so everytime i want to pause the act, i have write this thing: if (pauseTimer > 0 && --pauseTimer > 0) return; ; and if i want to pause him another time with a different amnout of time, can i just change th int (here pauseTimer) to like PauseTimer? Tysm for the help, appreciated:)
To be clear,
if (pauseTimer > 0 && --pauseTimer > 0) return;
as the first line in the act method only sets up the pausing (allows the behavior). Pausing is initiated by assigning a positive value to pauseTimer:
pauseTimer = 180; // pauses for about 3 seconds
You need to login to post a reply.