如何在处理中创建一个简单的对象动画

how create a simple object animation in processing

问题

我正在尝试在 Processing 中创建一个简单的对象“汽车”动画。 我的代码是:

Car car;

void setup(){
   size(800, 600);
   background(#818B95);
   frameRate(30);
   
   car = new Car(10,10);
}

void draw(){  
    //refresh background
    background(#818B95); 
    
    print("-");
    car.drawCar();    
}

void mouseClicked() {
  
  car.run();
}

public class Car implements Runnable{
  
  private int pos_x, pos_y;
  
  public Car(int pos_x, int pos_y){
    this.pos_x = pos_x;
    this.pos_y = pos_y;
  }
  
  public void drawCar(){ 
    
    rect(pos_x,pos_y,10,10);
  }
  
  public void run(){
    while(true){
      pos_x += 10;
      print("*");
      delay(200);
    }
  }
}

我希望在单击鼠标按钮时看到 car/rectangle 向右移动,但没有任何反应。

我添加了两个打印以查看 draw 方法和我的 car.run 是否并行执行显示一些 *- 交替打印。 我看到的是一系列 -,直到我单击,然后只打印 *

是否有可能启动一个新的对象线程会停止主绘制周期?

解决方案

这只是不使用线程的建议解决方案(Mady Daby)的变体。

Car car;

void setup(){
   size(800, 600);
   background(#818B95);
   frameRate(30);
   
   car = new Car(10,10);
}

void draw(){  
    //refresh background
    background(#818B95); 
    
    print("-");
    car.drawCar();    
}

void mouseClicked() {
  
  car.moving = true;
}

public class Car{
  
  private int pos_x, pos_y;
  boolean moving = false;
  
  public Car(int pos_x, int pos_y){
    this.pos_x = pos_x;
    this.pos_y = pos_y;
  }
  
  public void drawCar(){ 
    
    rect(pos_x,pos_y,10,10);
    
    //animation 
    if(moving){
      pos_x += 10;
      print("*");
    }
  }
  
}

您可以通过引入一个布尔变量来使汽车向右移动,以跟踪汽车是否应该向右移动 moving 然后如果 moving 为真则递增 pos_x .您还可以使用点击在移动和不移动之间切换。

Car car;

void setup() {
  size(800, 600);
  background(#818B95);
  frameRate(30);

  car = new Car(10, 10);
}

void draw() {  
  //refresh background
  background(#818B95); 

  print("-");
  car.drawCar();
}

void mouseClicked() {
  car.toggleMoving();
}

public class Car implements Runnable {
  private int pos_x, pos_y;
  private boolean moving = false;

  public Car(int pos_x, int pos_y) {
    this.pos_x = pos_x;
    this.pos_y = pos_y;
  }

  public void toggleMoving() {
    moving = !moving;
  }

  public void drawCar() { 
    if (moving) {
      this.run();
    }
    rect(pos_x, pos_y, 10, 10);
  }

  public void run() {
    pos_x += 10;
    print("*");
    delay(200);
  }
}