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/12

#
Wie kann ich einen Bilderwechsel Programieren, so dass nachdem mein Schiff den Rand berührt hat und sich um 180 Grad gedreht hat nicht kopfüber weiterfährt? Das Bild muss also bei jeder Drehung sich ändern?
move();
if (atWorldEdge() == true){
turn(10);
}
danpost danpost

2021/10/12

#
You will only need 2 images (one for moving left and one for moving right); but, you will need a field for the "rotation", which will be used for the direction the ship moves and not for rotating the ship. And to move, you will want to use the setLocation method instead of the move method. It might also be reasonable to track the coordinates of the ship with double fields so that all possible angles are accessible. To move with fields:
int moveDirection;
int speed = 3;
the use of setLocation would be like this:
double radians = Math.PI*moveDirection/180;
setLocation(getX()+(int)(Math.cos(radians)*speed), getY()+(int)(Math.sin(radians)*speed));
It more complicated with exact (or more precise) coordinate tracking. If moving slower than 3 pixels per frame as above (speed < 3), it would almost be required. There are a couple way to increase the precision of motion. One is tracking coordinates in double value fields as in the SmoothMover class (which you could make use of); another way is to use int values that represent fractional pixels (like 1/100th of a pixel) as in my QActor class (which you could also make use of). The SmoothMover class can be imported via the menu bar (Edit>>Import class...). The QActor class can be found in my Asteroids w/Improved QActor class scenario. If nothing else, you can see how they work and implement your own system.
Maxidino Maxidino

2021/10/12

#
Thank you very much. I will try later if it works. But how do i have to use the 2 images in the Method ,,setLocation"?
danpost danpost

2021/10/13

#
Maxidino wrote...
Thank you very much. I will try later if it works. But how do i have to use the 2 images in the Method ,,setLocation"?
The images are used after moving. If moveDirection is pointing at all to the right, you set the right image; otherwise, you set the left one.
Maxidino Maxidino

2021/10/13

#
Könnten sie mir das vielleicht direkt als Code schreiben, so dass ich nur noch die Bilder auswechseln muss? Ich bin noch sehr unerfahren in greenfoot und verstehe das alles nicht so ganz.
danpost danpost

2021/10/13

#
Maxidino wrote...
Könnten sie mir das vielleicht direkt als Code schreiben, so dass ich nur noch die Bilder auswechseln muss? Ich bin noch sehr unerfahren in greenfoot und verstehe das alles nicht so ganz.
// declare fields to retain images
GreenfootImage rechtsImage, linksImage;

// to create Images
public Schiff()
{
    rechtsImage = getImage(); // save right image
    linksImage = new GreenfootImage(rechtsImage); // copy image
    linksImage.mirrorHorizontally(); // save flipped image
}

// in act (at end of method) to control image
moveDirection = moveDirection%360; // reduce direction to range (-359, 359)
if (moveDirection < 0) moveDirection += 360; // further reduce direction to range (0, 359)
setImage((moveDirection/90)%3 == 0 ? rechtsImage : linksImage); // set appropriate image
Maxidino Maxidino

2021/10/14

#
Sorry Bro but nothing works there are 13 Errors.
danpost danpost

2021/10/14

#
Maxidino wrote...
Sorry Bro but nothing works there are 13 Errors.
The following is a sample class utilizing precision movement and images (that works):
import greenfoot.*;

public class Car extends Actor
{
    GreenfootImage rImg, lImg; // images
    int rot; // move direction ("rotation", in degrees)
    int speed = 300; // precision speed (3)
    int x, y; // precision coordinate values
    
    // create and maintain left and right facing images
    public Car()
    {
        rImg = getImage();
        lImg = new GreenfootImage(rImg);
        lImg.mirrorHorizontally();
    }
     
    // initialize precision coordinates
    protected void addedToWorld(World w)
    {
        x = getX()*100;
        y = getY()*100;
    }
    
    // precision movement
    public void setXLoc(int x, int y)
    {
        setLocation(x/100, y/100); 
    }
    
    public void act()
    {
        // turning
        if (Greenfoot.isKeyDown("left")) rot--;
        if (Greenfoot.isKeyDown("right")) rot++;
        rot = (rot+360)%360;
        // moving
        if (Greenfoot.isKeyDown("up"))
        {
            int dx = (int)(Math.cos(Math.PI*rot/180)*speed);
            int dy = (int)(Math.sin(Math.PI*rot/180)*speed);
            if (x+dx > 3000 && x+dx < (getWorld().getWidth()-30)*100) x += dx;
            if (y+dy > 3000 && y+dy < (getWorld().getHeight()-30)*100) y += dy;
            setXLoc(x, y);
        }
        // setting image
        setImage((rot/90)%3 == 0 ? rImg : lImg);
    }
}
Maxidino Maxidino

2021/10/15

#
Ok vielen Dank es funktioniert aber es passt nicht so ganz in mein Spiel. Kannst du mir einen Code schreiben das mein Schiff einfach ohne Bilderwechseln wenn es am Weltrand ist in die andere Richtung fährt? Das Schiff sol also autmotisch einfach wenn es den Weltrand berührt hat in die entgegengesetzte richtung weiterfahren. Danke im Vorraus
danpost danpost

2021/10/15

#
Maxidino wrote...
Ok vielen Dank es funktioniert aber es passt nicht so ganz in mein Spiel. Kannst du mir einen Code schreiben das mein Schiff einfach ohne Bilderwechseln wenn es am Weltrand ist in die andere Richtung fährt? Das Schiff sol also autmotisch einfach wenn es den Weltrand berührt hat in die entgegengesetzte richtung weiterfahren. Danke im Vorraus
You mean this?
import greenfoot.*;
 
public class Car extends Actor
{
    int speed = 300; // precision speed (3)
    int x, y; // precision coordinate values
     
    // initialize precision coordinates
    protected void addedToWorld(World w)
    {
        x = getX()*100;
        y = getY()*100;
    }
     
    // precision placement
    public void setXLoc(int x, int y)
    {
        setLocation(x/100, y/100); 
    }
     
    // moving
    public void act()
    {
        if (x+speed > 3000 && x+speed< (getWorld().getWidth()-30)*100) x += speed;
        else speed = -speed;
        setXLoc(x, y);
    }
}
Maxidino Maxidino

2021/10/15

#
You mean this?
Vielen Vieln Dank endlich funktioniert es so wie ich es mir vorgestellt habe. Könnte man den Code jetzte auch noch so ergänzen dass das Bild automtisch gespiegel wird wenn das Schiff den Bildrand erreicht hat, damit das es nicht so aussieht als wenn das Schiff rückwärts fährt?
danpost danpost

2021/10/15

#
Maxidino wrote...
Could the code now also be supplemented so that the image is automatically mirrored when the ship has reached the edge of the image, so that it doesn't look as if the ship is going backwards?
Add back in lines 5, 10 thru 16 and 47 from here, with line 47 being:
setImage(speed > 0 ? rImg : lImg);
Maxidino Maxidino

2021/10/15

#
Jetzt fährt das Schiff zum rechen Bildrand mit dem Bild in der Richtigen richtung. Wenn das Schiff dan den rechten Rand berührt fährt es zum linken Rand aber währenddessen wechselt das Bild die ganze Zeit zwischen recht und links hin und her. Wenn es dannam linken Bildrand ankommt wechsel das Bild nicht mehr hin und her und fährt normal zum rechten Bildrand?
danpost danpost

2021/10/15

#
Maxidino wrote...
Jetzt fährt das Schiff zum rechen Bildrand mit dem Bild in der Richtigen richtung. Wenn das Schiff dan den rechten Rand berührt fährt es zum linken Rand aber währenddessen wechselt das Bild die ganze Zeit zwischen recht und links hin und her. Wenn es dannam linken Bildrand ankommt wechsel das Bild nicht mehr hin und her und fährt normal zum rechten Bildrand?
Please provide your current class codes.
Maxidino Maxidino

2021/10/15

#
wait a second
There are more replies on the next page.
1
2