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

2020/2/1

Remove object if it hits the line

Milad Milad

2020/2/1

#
Hey, Im really new in these greenfoot things and try to make the game curve fever. Everything works yet except off removing the objects if they hit the line(doesnt matter if hitting their own lines or the line from the other object). I tried every method I know but I only get errors or my object gets removed instantly after start. I deleted everything related to removing the objects because of hitting the line and asking now for your help. I hope I copied everything right as code, if not just tell me. Sorry formy bad english :)
        import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot und MouseInfo)
        
        /**
         * Ergänzen Sie hier eine Beschreibung für die Klasse MyWorld.
         * 
         * @author (Ihr Name) 
         * @version (eine Versionsnummer oder ein Datum)
         */
        public class MyWorld extends World
        {
            
            
            public static int LocXPlayer1;
            public static int LocYPlayer1;
            public static int LocXPlayer2;
            public static int LocYPlayer2;
            GreenfootSound backgroundMusic = new GreenfootSound("WormBaron.mp3");
            
            /**
             * Konstruktor für Objekte der Klasse MyWorld
             * 
             */
            public MyWorld()
            {    
                // Erstellt eine neue Welt mit 700x700 Zellen und einer Zell-Größe von 1x1 Pixeln.
                super(700, 700, 1); 
                generateLocations();
                generateObjects();
            }
            
    
            public void playSound()
            {
                //Hinergrundmusik wrd mit der Lautstärke () und in duerschleife abgespielt.
                backgroundMusic.playLoop();
                backgroundMusic.setVolume(20);
            }
            
            public void act()
            {
                playSound();
               
            }
            
            
            public void generateObjects()
            {
                //erstellt die Spieler und den Timer
                addObject(new Player1(), LocXPlayer1, LocYPlayer1);
                addObject(new Player2(), LocXPlayer2, LocYPlayer2);
                addObject(new Timer(), 350, 350);
            }
            
             public void generateLocations()
            {
                //generiert zufällige Koordinaten für die Spieler im Berreich von 50 und 650 mit Voraussetzung, dass ein bestimmter Abstand zwischen den Spielern besteht.
                LocXPlayer1 = getRandomNumber(50, 650);
                LocYPlayer1 = getRandomNumber(50, 650);
                LocXPlayer2 = getRandomNumber(50, 650);
                LocYPlayer2 = getRandomNumber(50, 650);
                
                if(Math.abs(LocXPlayer1-LocXPlayer2)<75 || Math.abs(LocYPlayer1-LocYPlayer2)<75){
                    generateLocations();
                }
                
            }
            
            public int getRandomNumber(int start,int end)  
            {  
                //Funktion zum Generieren von zufälligen Zahlen.
                int normal = Greenfoot.getRandomNumber(end-start+1);  
                return normal+start;  
            }
            
    
            
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot und MouseInfo)

/**
 * Ergänzen Sie hier eine Beschreibung für die Klasse Player.
 * 
 * @author (Ihr Name) 
 * @version (eine Versionsnummer oder ein Datum)
 */
public class Player extends Actor
{
    
    /**
     * Act - tut, was auch immer Player tun will. Diese Methode wird aufgerufen, 
     * sobald der 'Act' oder 'Run' Button in der Umgebung angeklickt werden. 
     */
    public void act() 
    {
        // Ergänzen Sie Ihren Quelltext hier...
        
    }    
    
    
    
    
    
    
    
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot und MouseInfo)

/**
 * Ergänzen Sie hier eine Beschreibung für die Klasse Player1.
 * 
 * @author (Ihr Name) 
 * @version (eine Versionsnummer oder ein Datum)
 */
public class Player1 extends Player



{
    
    
        
    
    
    
    
    /**
     * Act - tut, was auch immer Player1 tun will. Diese Methode wird aufgerufen, 
     * sobald der 'Act' oder 'Run' Button in der Umgebung angeklickt werden. 
     */
    public void act() 
    {
        // Ergänzen Sie Ihren Quelltext hier...
        
        createTrack();
        movement();
        move(2);
        delteAtEdge();
        
        
    }    
    
    
    
    public void movement()
    {
        if (Greenfoot.isKeyDown("right"))
        {
            turn(4);
        }
        
        if (Greenfoot.isKeyDown("left"))
        {
            turn(-4);
        }
        
    }
    
    public void createTrack()
    {
        
           
               getWorld().addObject(new Line1(), getX(), getY());
           
        
        
        
    }
    
    public void delteAtEdge()
    {
       
            if(getX() > 697)
            {
                getWorld().removeObject(this);
                
            }
            else if(getX() < 3)
            {
                getWorld().removeObject(this);
                
            }
            else if(getY() < 3)
            {
                getWorld().removeObject(this);
                
            }
            else if(getY() > 697)
            {
                getWorld().removeObject(this);
                
            }
            
        
    }
    
    
    
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot und MouseInfo)

/**
 * Ergänzen Sie hier eine Beschreibung für die Klasse Line1.
 * 
 * @author (Ihr Name) 
 * @version (eine Versionsnummer oder ein Datum)
 */
public class Line1 extends Player1
{
    
    /**
     * Act - tut, was auch immer Line1 tun will. Diese Methode wird aufgerufen, 
     * sobald der 'Act' oder 'Run' Button in der Umgebung angeklickt werden. 
     */
    public void act() 
    {
        // Ergänzen Sie Ihren Quelltext hier...
        
        
    }    
}       
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot und MouseInfo)

/**
 * Ergänzen Sie hier eine Beschreibung für die Klasse Player2.
 * 
 * @author (Ihr Name) 
 * @version (eine Versionsnummer oder ein Datum)
 */
public class Player2 extends Player
{
    /**
     * Act - tut, was auch immer Player2 tun will. Diese Methode wird aufgerufen, 
     * sobald der 'Act' oder 'Run' Button in der Umgebung angeklickt werden. 
     */
    public void act() 
    {
        // Ergänzen Sie Ihren Quelltext hier...
        
        createTrack();
        movement();
        move(2);
        delteAtEdge();
        
    }    
    public void movement()
    {
        if (Greenfoot.isKeyDown("d"))
        {
            turn(4);
        }
        
        if (Greenfoot.isKeyDown("a"))
        {
            turn(-4);
        }
        
    }
    
    public void createTrack()
    {
         
        getWorld().addObject(new Line2(), getX(), getY());
        
        
    }
    
    public void delteAtEdge()
    {
        
            if(getX() > 697)
            {
                getWorld().removeObject(this);
            }
            else if(getX() < 3)
            {
                getWorld().removeObject(this);
            }
            else if(getY() < 3)
            {
                getWorld().removeObject(this);
            }
            else if(getY() > 697)
            {
                getWorld().removeObject(this);
            }
            
        
    }
    
    
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot und MouseInfo)

/**
 * Ergänzen Sie hier eine Beschreibung für die Klasse Line2.
 * 
 * @author (Ihr Name) 
 * @version (eine Versionsnummer oder ein Datum)
 */
public class Line2 extends Player2
{
    
    /**
     * Act - tut, was auch immer Line2 tun will. Diese Methode wird aufgerufen, 
     * sobald der 'Act' oder 'Run' Button in der Umgebung angeklickt werden. 
     */
    public void act() 
    {
        // Ergänzen Sie Ihren Quelltext hier...
        
           
        
    }    
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot und MouseInfo)

/**
 * Ergänzen Sie hier eine Beschreibung für die Klasse Timer.
 * 
 * @author (Ihr Name) 
 * @version (eine Versionsnummer oder ein Datum)
 */
public class Timer extends Actor
{
    public int dtime = 50;
    
    /**
     * Act - tut, was auch immer Timer tun will. Diese Methode wird aufgerufen, 
     * sobald der 'Act' oder 'Run' Button in der Umgebung angeklickt werden. 
     */
    public void act() 
    {
       countdown();
    }    
    public void countdown()
    {
        setImage("3.png");
        Greenfoot.delay(dtime);
        setImage("2.png");
        Greenfoot.delay(dtime);
        setImage("1.png");
        Greenfoot.delay(dtime);
        //go = 1;
        setImage("Go!.png");
        Greenfoot.delay(dtime);
        getWorld().removeObject(this);
    }
}
Yehuda Yehuda

2020/2/2

#
What are you trying to do? If you want to do something if a Player is touching a Line then the following code would be in the Player class:
if (isTouching(Line1.class) || isTouching(Line2.class)) {
    // thing to do
    }
I think. I haven't coded in a couple of years. Try doing something, and then report any problems you're having. They might be elsewhere and the code you've tried really might have been good.
Milad Milad

2020/2/2

#
so as example I wrote this command for player1. if player1 hits the line from himself or from player2 player one gets removed. But the problem is that because player1 creates the line1 after the game starts player1 gets removed instantly. But I want that player1 gets removed after he touches the line after he created it.
public void removeObjectByTouchingLine(){
        
            if (isTouching(Line1.class) || isTouching(Line2.class)) {
    
            getWorld().removeObject(this);
            }
            
    }
and wrote removeObjectByTouchingLine(); in act() in player1
danpost danpost

2020/2/2

#
It might help to do things in an order that helps your cause. Also, the new lines can be placed better to help your cause. I would move first, then check for touching lines before adding the new one, placing it at "back" side of the player:
/** in act */
move(2);
removeObjectByTouchingLine();
if (getWorld() == null) return; // needed to avoid IllegalStateException on following codes
createTrack();
// etc.

/** in createTrack */
Actor line = new Line1();
getWorld().addObject(line, getX(), getY());
line.setRotation(getRotation());
line.move(-getImage().getWidth()/2);
On another topic, the Line1 and Line2 classes should not extend the player classes -- they should extend either Actor or possibly a Line class that, in turn, extends Actor. The extending of a class is to build a modified object of the same type as the class it extends (a line is not a player, by any means).
Milad Milad

2020/2/2

#
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class Player1 here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Player1 extends Player
{
    public void act() 
    {
        // Ergänzen Sie Ihren Quelltext hier...
         
        
         
        move(2);
        removeObjectByTouchingLine();
        if (getWorld() == null) return; // needed to avoid IllegalStateException on following codes
        createTrack();
        movement();
        delteAtEdge();
    }    
     
     
     
    public void movement()
    {
        if (Greenfoot.isKeyDown("right"))
        {
            turn(4);
        }
         
        if (Greenfoot.isKeyDown("left"))
        {
            turn(-4);
        }
         
    }
     
    public void createTrack()
    {
         
            
               //getWorld().addObject(new Line1(), getX(), getY());
            
               Actor line = new Line1();
               getWorld().addObject(line, getX(), getY());
               line.setRotation(getRotation());
               line.move(-getImage().getWidth()/2);
         
         
    }
     
    public void delteAtEdge()
    {
        
            if(getX() > 697)
            {
                getWorld().removeObject(this);
                 
            }
            else if(getX() < 3)
            {
                getWorld().removeObject(this);
                 
            }
            else if(getY() < 3)
            {
                getWorld().removeObject(this);
                 
            }
            else if(getY() > 697)
            {
                getWorld().removeObject(this);
                 
            }
             
         
    }
     
     public void removeObjectByTouchingLine(){
         
            if (isTouching(Line1.class) || isTouching(Line2.class)) {
     
            getWorld().removeObject(this);
            }
             
    }
     
}
this is what I did know and now it creates after start a point and after the timer ends the green actor simply remove.
Milad Milad

2020/2/2

#
well... i got some new information i changed some things and now it works. the actor is now faster than line1 but he is way to fast. move(3) is to slow because the line catches player1 and move(4) works but player 1 is to fast. do you have and kind of solution for that problem. thanks
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class Player1 here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Player1 extends Player
{
    public void act() 
    {
        // Ergänzen Sie Ihren Quelltext hier...
         
        
        
        move(4);
        removeObjectByTouchingLine();
        if (getWorld() == null) return; // needed to avoid IllegalStateException on following codes
        createTrack();
        movement();
        delteAtEdge();
        
    }    
     
     
     
    public void movement()
    {
        if (Greenfoot.isKeyDown("right"))
        {
            turn(6);
        }
         
        if (Greenfoot.isKeyDown("left"))
        {
            turn(-6);
        }
         
    }
     
    public void createTrack()
    {
         
            
               //getWorld().addObject(new Line1(), getX(), getY());
            
               Actor line = new Line1();
               getWorld().addObject(line, getX(), getY());
               line.setRotation(getRotation());
               line.move(-getImage().getWidth()/2);
         
         
    }
     
    public void delteAtEdge()
    {
        
            if(getX() > 697)
            {
                getWorld().removeObject(this);
                 
            }
            else if(getX() < 3)
            {
                getWorld().removeObject(this);
                 
            }
            else if(getY() < 3)
            {
                getWorld().removeObject(this);
                 
            }
            else if(getY() > 697)
            {
                getWorld().removeObject(this);
                 
            }
             
         
    }
     
     public void removeObjectByTouchingLine(){
         
            if (isTouching(Line1.class) || isTouching(Line2.class)) {
     
            getWorld().removeObject(this);
            }
             
    }
     
}
danpost danpost

2020/2/2

#
Milad wrote...
<< Code Omitted >> this is what I did know and now it creates after start a point and after the timer ends the green actor simply remove.
"green actor"???
i changed some things and now it works. the actor is now faster than line1 but he is way to fast. move(3) is to slow because the line catches player1 and move(4) works but player 1 is to fast. << Code Omitted >>
The speed should of the player should not make any difference, as long as it does move every act cycle (which it is showing to be). "catches player1"? -- the line doesn't move, does it? Show Line1 class codes.
Milad Milad

2020/2/3

#
Sorry danpost forgot that you cant know this. and I already fixed it. but now i have another problem.
if (isTouching(Line1.class) || isTouching(Line2.class)) {
                
                ((MyWorld) getWorld()).addScoreCounterPlayer2();
                
                this.getWorld().showText("Du hast gewonnen", 200, 300);
                restartGame();
                
                
                
            }
public void restartGame()
            {
            Greenfoot.setWorld(new MyWorld());
            
    }   
If Player1 tocuhes Line1 or 2 Player2 gets a Score and the Game restarts. But there is no text. I tired to set the command under restart world and it doesnt worked either.
danpost danpost

2020/2/4

#
Milad wrote...
<< Code Omitted >> If Player1 tocuhes Line1 or 2 Player2 gets a Score and the Game restarts. But there is no text. I tired to set the command under restart world and it doesnt worked either.
Maybe adding a delay before calling restartGame would be sufficient:
Greenfoot.delay(90);
restartGame(); // line 6 in the post above
Milad Milad

2020/2/5

#
thank you it worked
You need to login to post a reply.