如何让 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();
}
我正在尝试学习如何使用 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();
}