【问题标题】:Greenfoot: Move two cars using different keysGreenfoot:使用不同的钥匙移动两辆车
【发布时间】:2018-01-03 22:31:14
【问题描述】:

我是 java 和 Greenfoot 的新手。我想以不同的方式移动两辆汽车,其中一辆分别使用 car1 的“上”、“下”、“左”、“右”和“w”、“s”、“a”、“d”。

我想为moveForward() 制作Car.car1.isKeyDown("up")Car.car2.isKeyDown("w"),为moveBack() 制作Car.car1.isKeyDown("down")Car.car2.isKeyDown("s") 等。我该怎么做?

这是我得到的:

/**
 * 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);  
   }
}

【问题讨论】:

    标签: java greenfoot


    【解决方案1】:

    您只需将要用作参数的键添加到 Car 类。例如

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

    然后你就可以为每个对象设置跳跃的键了!

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

    您可以仅使用单个字母本身来跟踪任何字母键。 “s”、“a”、“d”。您可以添加更多键作为更多参数。希望这是有道理的。

    如果您不想在构造函数中添加所有键,也可以添加“setKeys(String key)”方法或其他方法。

    【讨论】:

    • 感谢答案,但我仍然卡住了。我试图在我的 Car 类中添加您的代码(粘贴 Mario 类),但出现错误。另外我不知道把马里奥 car1 = new Mario("up");马里奥汽车2 =新马里奥(“w”);。我是否在 MyWorld 类中声明它们?
    • @dice 我的代码只是一个示例,如果我创建了一个只能跳跃的马里奥对象而不是汽车。不要复制粘贴我写的任何内容,但要尝试理解所写内容的概念。详细一点,看看目前如何为每辆车使用不同的 .png?你可以用移动键做同样的事情。
    • 您已经在“populateWorld()”方法中声明了 Car 对象。
    猜你喜欢
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 2018-09-18
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多