如何让 screen/camera 跟随 box2d 物体移动

How to have the screen/camera follow a box2d body as it moves

我正在尝试学习如何使用 box2d(此代码中的很多代码都是从传奇 Dan Shiffman 那里偷来的)所以我创建了一个小的 "game",其中球在 Perlin 噪声地形中滚动。我的代码的一个明显问题是球很快就滚出了屏幕。我知道我将不得不改变我的地形生成,因为它不会随着屏幕移动而继续生成,但现在我想知道如何首先让屏幕移动。我想将圆圈的 x 值保持在屏幕中央。

我发现了几个类似的问题,答案是移动世界,但这对 box2d 来说似乎不是个好主意。我还发现有人提到相机? class 但我是初学者,不知道那是什么或如何使用它。

部分主要代码:


void setup() {
  size(1000,800);
  smooth();
  frameRate(30);
  sw = new StopWatchTimer();
  sw.start();

  box2d = new Box2DProcessing(this);
  box2d.createWorld();

  p = new player(10,10,10);

  surface = new Surface();

  grav = -50;
  box2d.setGravity(0, grav);

}

void draw() {

  background(200);

  //text(sw.second(),100,100);

  box2d.step();
  surface.display();
  time();
  keyTyped();

  box2d.setGravity(0, grav);

  p.display();
  prePos = p.getPos();
}

来自玩家的一些代码class:

player(float x, float y, float r_) {
    r = r_;

    makeBody(x, y, r);
    body.setUserData(this);
    col = color(175);
  }


  public void makeBody(float x, float y, float r) {

    BodyDef bd = new BodyDef();

    bd.position = box2d.coordPixelsToWorld(x, y);
    bd.type = BodyType.DYNAMIC;
    body = box2d.createBody(bd);


    cs = new CircleShape();
    cs.m_radius = box2d.scalarPixelsToWorld(r);

    fd = new FixtureDef();
    fd.shape = cs;

    fd.density = 5;
    fd.friction = 1;
    fd.restitution = .3;


    body.createFixture(fd);

}

我很清楚这个问题问得很少,但我不确定需要哪些代码,而且我不是一个善于表达的人,所以如果需要任何澄清或更多代码来使这个问题易于理解,请不要犹豫为此对我大吼大叫。

您可以使用 translate() 命令。您可以将玩家的坐标作为参数放入绘图中。 我假设 p.getPos() returns 是一个 PVector。如果是这种情况,那么绘制将如下所示:

void draw() {
  pushMatrix()
  translate(p.getPos().x+width/2,p.getPos().y+height/2); // <--Added Line
  background(200);

  //text(sw.second(),100,100);

  box2d.step();
  surface.display();
  popMatrix()
  time();
  keyTyped();

  box2d.setGravity(0, grav);

  p.display();
  prePos = p.getPos();
}