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

2021/10/12

Bilderwechsel nach drehung?

1
2
Maxidino Maxidino

2021/10/15

#
public class Ship extends Animal
{
   int speed = 300; 
   int x, y;
   GreenfootImage rImg, lImg;
    public void act() 
   {
       shoot();
       addedToWorld();
       speed();
       setImage();
   }
    
   public void setImage()
   {
        rImg = getImage();
        lImg = new GreenfootImage(rImg);
        lImg.mirrorHorizontally();
        setImage(speed > 0 ? rImg : lImg);
      
    }
   
   public void setXLoc(int x, int y)
   {
       setLocation(x/100, y/100);
       
   }
   
   public void speed()
    {
      if (x+speed > 3000 && x+speed< (getWorld().getWidth()-30)*100) 
      x += speed;
        else 
      speed = -speed;
        setXLoc(x, y);
      
    }
    
   public void addedToWorld()
    {
        x = getX()*100;
        y = getY()*100;
    }
    
    public void shoot()
    {
       {
        if (getWorld().getObjects(Rocket.class).size() == 0)
       {
        Rocket rackete = new Rocket();
        CrabWorld welt = (CrabWorld)getWorld();
        welt.addObject(rackete, getX(), getY());
        rackete.setRotation(getRotation());
        }
       }
   }
}
danpost danpost

2021/10/15

#
First, remove line 9 (greenfoot calls that automatically, when the actor is added into a world). However, line 39 need to be:
protected void addedToWorld(World world)
Next, cut line 19 and replace line 11 with it. Then change line 14 to:
public Ship()
Maxidino Maxidino

2021/10/15

#
Bro es fubnktioniert. Vielen vielen Dank das du mir so toll geholfen hast. Kann du mir denn vielleicht noch erklären wie die Codes funktionieren bzw. wie der Code in public void speed, setXLoc und addedtoworld funktioniert?
danpost danpost

2021/10/15

#
Most of those codes were to make smoother movement. However, since your ship is only moving left and right at 3 pixels per move, the stuff needed for smooth movement can be removed. It would then look like this:
public class Ship extends Animal
{
   int speed = 3; 
   GreenfootImage rImg, lImg;

   public void act() 
   {
       shoot();
       speed();
       setImage(speed > 0 ? rImg : lImg)
   }
     
   public Ship()
   {
        rImg = getImage();
        lImg = new GreenfootImage(rImg);
        lImg.mirrorHorizontally();
    }
    
    public void speed()
    {
        // turning around near edge
        if (getX() < 30 || getX() > getWorld().getWidth()-30) 
           speed = -speed;
        // moving
        move(speed);
    }
    
    public void shoot()
    {
        if (getWorld().getObjects(Rocket.class).isEmpty())
        {
            Rocket rackete = new Rocket();
            getWorld().addObject(rackete, getX(), getY());
            rackete.setRotation(getRotation());
        }
    }
}
Maxidino Maxidino

2021/10/15

#
oh ok. And whats means the expression getWidth?
Spock47 Spock47

2021/10/20

#
(english version follows below) getWidth liefert die Breite der Welt zurück. Insgesamt prüft die Bedingung
if (getX() < 30 || getX() > getWorld().getWidth()-30)
ob das Schiff nahe dem Rand der Welt ist. Das tut sie in zwei Teilen: 1. getX() < 30 prüft, ob das Schiff am linken Rand der Welt ist: ob die x-Koordinate des Schiffes kleiner ist als 30. 2. getX() > getWorld().getWidth()-30 prüft, ob das Schiff nahe dem rechten Rand der Welt ist: die Breite (getWidth) ist auch die höchste x-Koordindate. Wenn also die x-Koordinate des Schiffes größer ist als Breite - 30, dann heißt das, dass das Schiff weniger als 30 vom rechten Rand der Welt entfernt ist. 3. Diese zwei Bedingungen "Schiff ist nahe dem linken Rand" und "Schiff ist nahe dem rechten Rand" werden dann mit dem "oder"- Operator || zusammengefügt. Dieser ist wahr, wenn (mindestens) eine der beiden Bedingungen wahr ist. Und wenn diese zusammengesetzte Bedingung ("Schiff ist nahe dem Rand der Welt") wahr ist, dann wird die Geschwindigkeit des Schiffes in die andere Richtung geändert: speed = -speed. Wenn das Schiff positive Geschwindigkeit hatte (3) und sich vorher nach rechts bewegte, wäre die neue Geschwindigkeit -3; das Schiff würde sich also nun nach links bewegen. Wenn das Schiff negative Geschwindigkeit (-3) hatte, würde sie sich ändern zu -(-3) = +3 und sich nun also wieder nach rechts bewegen. Lebe lange und in Frieden, Spock47 === getWidth returns the width of the world. In total, the condition
if (getX() < 30 || getX() > getWorld().getWidth()-30)
checks whether the ship is near the edge of the world. It does this in two parts: 1. getX() < 30 checks whether the ship is near the left edge of the world: whether the x-coordinate of the ship is smaller than 30. 2. getX() > getWorld().getWidth()-30 checks whether the ship is near the right side of the world: the width is also the highest x-coordinate. So, if the x-coordinate of the ship is greater than width - 30, it means that the ship is less than 30 away from the right edge of the world. 3. These two conditions "is ship near left edge" and "is ship near right edge" are then combined with the "or"-operator || which is true, if (at least) one of the two conditions is true. And if this combined condition ("ship is near an edge of the world") is true, then the ship's speed gets changed to the other direction: speed = -speed. If it ship had positive speed (3) and was going to the right before, the new speed would be -3; resulting in the ship now going to the left. If the ship had negative speed (-3), it would be changed to -(-3) = +3 again and thus turns to the right again. (deutsche Version des Textes: siehe oben) Live long and prosper, Spock47
You need to login to post a reply.
1
2