LibGdx Box2d collison 与 sprite 不匹配
LibGdx Box2d collison not matching up with sprite
我正在为大学制作游戏 class。当我的主角(树)撞到地面时,它停在离地面不远的地方
screenshot 1
当玩家降落在小平台上时,差距更大
screenshot 2
我创建角色和地面的 body 的代码是这个
public static Body createBody(int x, int y, float width, float height, boolean isStatic){
Body body;
BodyDef def = new BodyDef();
if(isStatic){
def.type = BodyDef.BodyType.StaticBody;
}
else {
def.type = BodyDef.BodyType.DynamicBody;
}
def.position.set(x / PPM , y / PPM);
// returns a World object
body = GlobalWorld.getInstance().createBody(def);
PolygonShape shape = new PolygonShape();
shape.setAsBox(width / 2 / PPM, height / 2 / PPM);
body.createFixture(shape, 1.0f);
shape.dispose();
return body;
}
地面的代码在它自己的class
public class Material {
private Texture image;
private Body body;
private Sprite sprite;
public Material(Texture t, int x, int y, int w, int h){
image = t;
sprite = new Sprite(t);
body = BoxBuilder.createBody(x, y, w, h, true);
body.setUserData("Ground");
}
public void draw(){
// returns a SpriteBatch
SpriteBatch batch = GlobalBatch.getInstance();
sprite.setPosition(body.getPosition().x * PPM, body.getPosition().y * PPM);
batch.begin();
sprite.draw(batch);
batch.end();
}
public void dispose(){
image.dispose();
}
}
绘制地面的代码
public void draw(){
for(Material m : worldObjects){
m.draw();
}
}
我画人物的代码
public void create(){
// do stuff
// global vars
body = createBody(0, 480, 313, 260, false);
texture = new Texture("tree.PNG");
sprite = new Sprite(texture);
// do stuff
}
public void render(){
// do stuff
sprite.setPosition(body.getPosition().x*PPM, body.getPosition().y*PPM);
batch.begin()
sprite.draw(batch)
batch.end()
// do stuff
}
PPM(每米像素)为
public static final float PPM = 32;
我不知道这里有什么问题,我想让角色降落在地面上,而不是降落在地面上。因此,如果有人能告诉我是什么原因造成的,或者给我指点一个很好的教程来学习更多关于 box2d 的信息,我将不胜感激。
当我们使用 PolygonShape
创建主体时,主体位于该多边形的中心,因此当使用主体位置绘制时,它从 PolygonShape
的中心开始绘制,因此我们需要在左下角绘制.
在Materialclass
替换
sprite.setPosition(body.getPosition().x * PPM, body.getPosition().y * PPM);
和
sprite.setPosition(body.getPosition().x*PPM-sprite.getWidth()/2,body.getPosition().y-sprite.getHeight()/2);
sprite.setRotation(body.getAngle()*MathUtils.radDeg);
并且对于字符绘制也改变
sprite.setPosition(body.getPosition().x*PPM, body.getPosition().y*PPM);
和
sprite.setPosition(body.getPosition().x*PPM-sprite.getWidth()/2, body.getPosition().y*PPM-sprite.getHeight()/2);
sprite.setRotation(body.getAngle()*MathUtils.radDeg);
正如我在您的代码中看到的,您没有在 Material
class 中设置 Sprite
的大小,也没有为字符设置宽度和高度。
在MaterialClass
sprite = new Sprite(t);
sprite.setSize(w,h);
对于角色
body = createBody(0, 480, 313, 260, false);
texture = new Texture("tree.PNG");
sprite = new Sprite(texture);
sprite.setSize(313,260);
我正在为大学制作游戏 class。当我的主角(树)撞到地面时,它停在离地面不远的地方
screenshot 1
当玩家降落在小平台上时,差距更大
screenshot 2
我创建角色和地面的 body 的代码是这个
public static Body createBody(int x, int y, float width, float height, boolean isStatic){
Body body;
BodyDef def = new BodyDef();
if(isStatic){
def.type = BodyDef.BodyType.StaticBody;
}
else {
def.type = BodyDef.BodyType.DynamicBody;
}
def.position.set(x / PPM , y / PPM);
// returns a World object
body = GlobalWorld.getInstance().createBody(def);
PolygonShape shape = new PolygonShape();
shape.setAsBox(width / 2 / PPM, height / 2 / PPM);
body.createFixture(shape, 1.0f);
shape.dispose();
return body;
}
地面的代码在它自己的class
public class Material {
private Texture image;
private Body body;
private Sprite sprite;
public Material(Texture t, int x, int y, int w, int h){
image = t;
sprite = new Sprite(t);
body = BoxBuilder.createBody(x, y, w, h, true);
body.setUserData("Ground");
}
public void draw(){
// returns a SpriteBatch
SpriteBatch batch = GlobalBatch.getInstance();
sprite.setPosition(body.getPosition().x * PPM, body.getPosition().y * PPM);
batch.begin();
sprite.draw(batch);
batch.end();
}
public void dispose(){
image.dispose();
}
}
绘制地面的代码
public void draw(){
for(Material m : worldObjects){
m.draw();
}
}
我画人物的代码
public void create(){
// do stuff
// global vars
body = createBody(0, 480, 313, 260, false);
texture = new Texture("tree.PNG");
sprite = new Sprite(texture);
// do stuff
}
public void render(){
// do stuff
sprite.setPosition(body.getPosition().x*PPM, body.getPosition().y*PPM);
batch.begin()
sprite.draw(batch)
batch.end()
// do stuff
}
PPM(每米像素)为
public static final float PPM = 32;
我不知道这里有什么问题,我想让角色降落在地面上,而不是降落在地面上。因此,如果有人能告诉我是什么原因造成的,或者给我指点一个很好的教程来学习更多关于 box2d 的信息,我将不胜感激。
当我们使用 PolygonShape
创建主体时,主体位于该多边形的中心,因此当使用主体位置绘制时,它从 PolygonShape
的中心开始绘制,因此我们需要在左下角绘制.
在Materialclass
替换
sprite.setPosition(body.getPosition().x * PPM, body.getPosition().y * PPM);
和
sprite.setPosition(body.getPosition().x*PPM-sprite.getWidth()/2,body.getPosition().y-sprite.getHeight()/2);
sprite.setRotation(body.getAngle()*MathUtils.radDeg);
并且对于字符绘制也改变
sprite.setPosition(body.getPosition().x*PPM, body.getPosition().y*PPM);
和
sprite.setPosition(body.getPosition().x*PPM-sprite.getWidth()/2, body.getPosition().y*PPM-sprite.getHeight()/2);
sprite.setRotation(body.getAngle()*MathUtils.radDeg);
正如我在您的代码中看到的,您没有在 Material
class 中设置 Sprite
的大小,也没有为字符设置宽度和高度。
在MaterialClass
sprite = new Sprite(t);
sprite.setSize(w,h);
对于角色
body = createBody(0, 480, 313, 260, false);
texture = new Texture("tree.PNG");
sprite = new Sprite(texture);
sprite.setSize(313,260);