Search code examples
javagreenfoot

Greenfoot: Move two cars using different keys


I am new to java and Greenfoot. I would like to move two cars differently one using "up", "down", "left", "right" for the car1 and "w", "s", "a", "d" respectively.

I would like to make something like Car.car1.isKeyDown("up") and Car.car2.isKeyDown("w") for moveForward(), Car.car1.isKeyDown("down") and Car.car2.isKeyDown("s") for moveBack() etc. How should I do it?

Here is what I've got:

/**
 * Class that models objects of type "car"
 *
 */

public class Car extends Actor
{
    // Attributes of the class Car
private static int numberWheels = 4;                                          
private boolean areHeadlightsOn = false;              


private String image1;
private String image2;

private boolean isKeyDown = false;

/**
 * Constructor
 */
public Car(String file1, String file2){
    setImage1(file1); // Sets the attribute image1 to file1
    setImage2(file2); // Sets the attribute image2 to file2

    setImage(file1);
    // Sets the image that appears in the screen at the beginning to the one in file1
}



/**
 * Method that is being always invoked when the program is running
 */
public void act(){
    moveForward();
    moveBack();
    turnLeft();
    turnRight();
    turnHeadlightsOn();
    turnHeadlightsOff();
}    

/**
 * Move the car forward every time the key "up" is pressed
 */
public void moveForward(){
    if (Greenfoot.isKeyDown("up")){
        move(5);
    }
}

/**
 * Move the car back every time the key "down" is pressed
 */
public void moveBack(){
    if (Greenfoot.isKeyDown("down")){
        move(-1);
    }
}    

/**
 * Turn the car to the left every time the key "left" is pressed
 */    
public void turnLeft(){
    if (Greenfoot.isKeyDown("left")){ 
        turn(-4);
    }
}

/**
 * Turn the car to the right every time the key "right" is pressed
 */      
public void turnRight(){
    if (Greenfoot.isKeyDown("right")){ 
        turn(4);
    }
}

/**
 * Turn the headlights on when the key "space" is pressed.
 * The attribute isKeyDown is used to prevent setting the headlights on and off when the key "space" is pressed (and remains pressed for some time)
 */
public void turnHeadlightsOn(){
    if (Greenfoot.isKeyDown("space") && !getIsKeyDown()){
        if (getAreHeadlightsOn() == false){
            setAreHeadlightsOn(true);
            setImage(getImage2());
            setIsKeyDown(true);
        }


    }
    if (!Greenfoot.isKeyDown("space") && getIsKeyDown()){
         setIsKeyDown(false);
    }           
}   


/**
 * Turn the headlights off when the key "space" is pressed.
 * The attribute isKeyDown is used to prevent setting the headlights off and on when the key "space" is pressed (and remains pressed for some time)
 */  
public void turnHeadlightsOff(){
    if (Greenfoot.isKeyDown("space") && !getIsKeyDown()){
        if (getAreHeadlightsOn() == true){
            setAreHeadlightsOn(false);
            setImage(getImage1());
            setIsKeyDown(true);
        }

    }
    if (!Greenfoot.isKeyDown("space") && getIsKeyDown()){
        setIsKeyDown(false);
    }           
}      


public void setAreHeadlightsOn(boolean areHeadlightsOn){
    this.areHeadlightsOn = areHeadlightsOn;
}

public boolean getAreHeadlightsOn(){
    return this.areHeadlightsOn;
}     

public void setImage1(String image1){
    this.image1 = image1;
}

public String getImage1(){
    return this.image1;
}    

public void setImage2(String image2){
    this.image2 = image2;
}

public String getImage2(){
    return this.image2;
}       

public void setIsKeyDown(boolean isKeyDown){
    this.isKeyDown = isKeyDown;
}

public boolean getIsKeyDown(){
    return this.isKeyDown;
    }          
}


 /*MyWorld class
  */


import greenfoot.*;

public class MyWorld extends World
{
  public MyWorld() 
  {
    super(800, 600, 1); 
    setBackground("road.jpg");
    populateWorld();
  }

public void populateWorld(){
    Car car1 = new Car(new String("car1.png"),
                           new String("car2.png");
    Car car2 = new Car(new String("car3.png"), 
                           new String("car4.png");

    addObject(car1, 120, 70);
    addObject(car2, 580, 30);  
   }
}

Solution

  • You just need to add the keys you want to use as parameters to the Car class. e.g.

    public class Mario {
        private upKey;
    
        public Mario(String upKey) {
             this.upKey = upKey;
        }
    
        public void jump(){
            if (Greenfoot.isKeyDown(upKey)){
                move(5);
            }
        }
    }
    

    Then you can set the key that jumps for each object!

     Mario player1 = new Mario("up");
     Mario player2 = new Mario("w");
    

    You can track any letter key with just the individual letter itself. "s", "a", "d". You can add more keys as more parameters. Hope that makes sense.

    You could also add a 'setKeys(String key)' method or something if you don't want to add all the keys in the constructor.