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

2017/9/21

Triggering method based on players location

Ethannnn6122 Ethannnn6122

2017/9/21

#
Hello. I am trying to make an attack method for an enemy in my game. I was thinking that I could somehow trigger the walkRight method when the players location is to the right of the enemy and trigger walkLeft when the players location is to the left of the enemy. I would appreciate any help that can help me accomplish this. My code:
import greenfoot.*;  
public class Enemy extends Actor
{
    
    private final GreenfootImage LMg1 = new GreenfootImage("EnemyWalking1.png");
    private final GreenfootImage LMg2 = new GreenfootImage("EnemyWalking2.png"); 
    private final GreenfootImage LMg3 = new GreenfootImage("EnemyWalking3.png");
    private final GreenfootImage LMg4 = new GreenfootImage("EnemyWalking4.png"); 
    private final GreenfootImage LMg5 = new GreenfootImage("EnemyWalking5.png");
    private final GreenfootImage LMg6 = new GreenfootImage("EnemyWalking6.png"); 
    private final GreenfootImage LMg7 = new GreenfootImage("EnemyWalking7.png");
    private final GreenfootImage LMg8 = new GreenfootImage("EnemyWalking8.png"); 
    
    private final GreenfootImage RMg1 = new GreenfootImage(LMg1);
    private final GreenfootImage RMg2 = new GreenfootImage(LMg2); 
    private final GreenfootImage RMg3 = new GreenfootImage(LMg3);
    private final GreenfootImage RMg4 = new GreenfootImage(LMg4); 
    private final GreenfootImage RMg5 = new GreenfootImage(LMg5);
    private final GreenfootImage RMg6 = new GreenfootImage(LMg6); 
    private final GreenfootImage RMg7 = new GreenfootImage(LMg7);
    private final GreenfootImage RMg8 = new GreenfootImage(LMg8); 
    

    
    
    private int speed = 10;
    private int frame;
    private boolean going;
    private boolean facingRight;
    private boolean attacking;
    private int delay = 5;
    
   
    public Enemy()
    {
      setImage(LMg1);
      going = false;
      facingRight = false;
      attacking = false;
      
        
      RMg1.mirrorHorizontally();
      RMg2.mirrorHorizontally();     
      RMg3.mirrorHorizontally();     
      RMg4.mirrorHorizontally();
      RMg5.mirrorHorizontally();  
      RMg6.mirrorHorizontally();
      RMg7.mirrorHorizontally();
      RMg8.mirrorHorizontally();
      scaleEnemy(); 
    }
    public void scaleEnemy() {
       LMg1.scale(LMg1.getWidth() + 200, LMg1.getHeight() + 200);
       LMg2.scale(LMg2.getWidth() + 200, LMg2.getHeight() + 200);
       LMg3.scale(LMg3.getWidth() + 200, LMg3.getHeight() + 200);
       LMg4.scale(LMg4.getWidth() + 200, LMg4.getHeight() + 200);
       LMg5.scale(LMg5.getWidth() + 200, LMg5.getHeight() + 200);
       LMg6.scale(LMg6.getWidth() + 200, LMg6.getHeight() + 200);
       LMg7.scale(LMg7.getWidth() + 200, LMg7.getHeight() + 200);
       LMg8.scale(LMg8.getWidth() + 200, LMg8.getHeight() + 200);
    }
    public void attack(){
        attacking = true;
        
        
    }
    
     public void walkRight()
    { 
        going = true;
        facingRight = true;
        frame ++;
         if(frame <=1 * delay)
        {
           
        }
        else if(frame <=2 * delay)
        {
            setImage(RMg1);
        }
        else if(frame <=3 * delay)
        {
            setImage(RMg2);
        }
        else if (frame <=4 * delay)
        {
            setImage(RMg3);
        } else if (frame <=5 * delay) 
        {
            setImage(RMg4);
        } else if (frame <=6 * delay) 
        {
            setImage(RMg5);
            
        }else if (frame <=7 * delay) 
        {
            setImage(RMg6);
            
        }else if (frame <=8 * delay) 
        {
            setImage(RMg7);
            
        }else if (frame <=9 * delay) 
        {
            setImage(RMg8);
             frame =1;
             return;       
        }
    }
    public void walkLeft()
    { 
        going = true;
        facingRight = true;
        frame ++;
         if(frame <=1 * delay)
        {
           
        }
        else if(frame <=2 * delay)
        {
            setImage(LMg1);
        }
        else if(frame <=3 * delay)
        {
            setImage(LMg2);
        }
        else if (frame <=4 * delay)
        {
            setImage(LMg3);
        } else if (frame <=5 * delay) 
        {
            setImage(LMg4);
        } else if (frame <=6 * delay) 
        {
            setImage(LMg5);
            
        }else if (frame <=7 * delay) 
        {
            setImage(LMg6);
            
        }else if (frame <=8 * delay) 
        {
            setImage(LMg7);
            
        }else if (frame <=9 * delay) 
        {
            setImage(LMg8);
             frame =1;
             return;       
        }
    }
    public void act() 
    {
        
        attack();
    }
}
danpost danpost

2017/9/21

#
The enemies are either going to have to get a reference to the player every act cycle or maintain one in a field. That way you can get its location for comparison.
Ethannnn6122 Ethannnn6122

2017/9/21

#
Could you give an example of what you mean...not sure I am understanding what you mean. Thanks
Super_Hippo Super_Hippo

2017/9/22

#
You can use this to get a reference to the player object.
Actor player = getWorld().getObjects(Player.class).get(0);
You can then call the methods 'getX' and 'getY' on it to get its coordinates. If there is not always exactly one player object into the world, this may not work or needs some extra condition checks.
You need to login to post a reply.