处理中的红绿灯序列

时间:2016-05-09 22:39:28

标签: processing

我正在尝试获得我所拥有的这些代码并添加另一个交通信号灯和汽车但是从右到左不是从下到上。汽车仅在灯光为琥珀色或绿色时移动,在红色时停止。我试过复制代码并更改值的名称,但它不起作用。我已经尝试将它们命名为所有不同的名称,但它甚至不会显示我试图为另一辆车投入的其他图像。有人可以告诉/告诉我如何添加另一个红绿灯和汽车,但他们会在不同时间移动吗?

 
TrafficLight light1 = new TrafficLight(100, 40);
int onTime = 2000;
int startTime = millis();
PImage car;
int carX, carY;

void setup() {
    size(800, 600);
    light1.changeColour("red");
    light1.display();

    car = loadImage("Car.png");
    carX = 150;
    carY = 300;
}

void draw() {
    background(255);


    if (millis() - startTime > onTime && light1.lightOn == "red") {
        light1.changeColour("amber");
        startTime = millis();
    }
    if (millis() - startTime > onTime && light1.lightOn == "amber") {
        light1.changeColour("green");
        startTime = millis();
    }
    if (millis() - startTime > onTime && light1.lightOn == "green") {
        light1.changeColour("red");
        startTime = millis();
    }


    light1.display();
    image(car, carX, carY);
    if (light1.lightOn == "green") {
        carY -= 2;
    }
    {
    }
    if (light1.lightOn == "red") {
        carY -= 0;
    }
    {
    }
    if (light1.lightOn == "amber") {
        carY -= 1;
    }
    {
    }

    if (carY <= -200) {
        carY = 500;
    }
}


class TrafficLight {
    int xpos;
    int ypos;
    String lightOn = "red";

    TrafficLight(int x, int y) {
        xpos = x;
        ypos = y;
    }

    void changeColour(String lightColour) {
        lightOn = lightColour;
    }

    void display() {
        String lightColour = lightOn;
        fill(0, 0, 0);
        rect(xpos, ypos, 100, 220);//back panel
        if (lightColour == "red") {
            fill(255, 0, 0);
            lightOn = "red";
        } else {
            fill(100, 0, 0);
        }
        ellipse(xpos + 50, ypos + 40, 60, 60);//red
        if (lightColour == "amber") {
            fill(255, 255, 0);
            lightOn = "amber";
        } else {
            fill(100, 100, 0);
        }
        ellipse(xpos + 50, ypos + 110, 60, 60);//amber  
        if (lightColour == "green") {
            fill(0, 255, 0);
            lightOn = "green";
        } else {
            fill(0, 100, 0);
        }
        ellipse(xpos + 50, ypos + 180, 60, 60);//green
    }

}

1 个答案:

答案 0 :(得分:0)

您发布的代码只包含一辆车,这使得这个问题很难回答。 Stack Overflow并非真正针对一般&#34;我如何做到这一点&#34;输入问题。它更专为特定的设计&#34;我尝试了X,预期为Y,但却得到了Z而不是#34;输入问题。话虽这么说,但我会尝试回答:

这里有简短的回答:您需要为第二辆车创建状态,然后使用该状态确切地了解您如何处理第一辆车的状态。如果将该状态封装到中,然后使用该类的两个实例,这可能会更容易。

让我们从一个垂直移动的圆圈的简单示例开始,并在我们按下鼠标时停止:

 
MovingCircle verticalCircle;

void setup() {
  size(600, 600);
  verticalCircle = new MovingCircle(250, 250, 0, 5);
}

void mousePressed() {
  verticalCircle.moving = !verticalCircle.moving;
}

void draw() {
  background(0);
  verticalCircle.step();
}

class MovingCircle {

  float x;
  float y;
  float xSpeed;
  float ySpeed;
  boolean moving = true;

  public MovingCircle(float x, float y, float xSpeed, float ySpeed) {
    this.x = x;
    this.y = y;
    this.xSpeed = xSpeed;
    this.ySpeed = ySpeed;
  }

  void step() {

    if (moving) {
      x+=xSpeed;
      y+=ySpeed;

      if (x > width) {
        x = 0;
      }
      if (y > height) {
        y = 0;
      }
    }

    ellipse(x, y, 25, 25);
  }
}

此程序会创建一个向下移动屏幕的圆圈,并在您单击鼠标时停止并启动。请注意,我已经在MovingCircle类中封装了我需要的所有信息,所以现在如果我想添加另一个,我可以创建该类的另一个实例并按照我想要的方式与它进行交互。

这是我如何添加一个水平移动的圆圈:

MovingCircle verticalCircle;
MovingCircle horizontalCircle;

void setup() {
  size(600, 600);
  verticalCircle = new MovingCircle(250, 250, 0, 5);
  horizontalCircle = new MovingCircle(250, 250, 5, 0);
}

void mousePressed() {
  verticalCircle.moving = !verticalCircle.moving;
}

void keyPressed() {
  horizontalCircle.moving = !horizontalCircle.moving;
}

void draw() {
  background(0);
  verticalCircle.step();
  horizontalCircle.step();
}

这只是一个例子,但是你的代码中的原理是相同的:你需要将你的状态封装到一个类中,然后你可以使用该类的两个实例来拥有两个移动的汽车。

此外,您绝不应使用==来比较String值!改为使用.equals()功能!

if(lightColour.equals("red")){