当前位置: 首页 > 面试题库 >

在libgdx中渲染box2d

严阳成
2023-03-14
问题内容

我有一个使用FitViewport的尺寸为800x480的游戏世界,最初使用像素来渲染box2d物体+固定装置,因此所有物理效果看起来都是漂浮而缓慢的。通过查看文档,我发现box2d使用度量单位,因此我将box2d的位置和大小转换为32倍,因此最终得到了25x15米的box2d世界。

我遇到的问题是,现在box2d对象变得非常小。如何缩小它们,使它们在屏幕上显示常规尺寸?


问题答案:

您需要在world和box2之间使用转换因子。

在您的create()中,您将拥有:

private OrthographicCamera camera;
private BodyDef bodyDef;
private Body body;
private PolygonShape box;
static float WORLD_TO_BOX, BOX_TO_WORLD, bodyWidth, bodyHieght;

public Create(){
    //Conversion factors
    WORLD_TO_BOX = 1/32f;  
    BOX_TO_WORLD = 1/WORLD_TO_BOX;

    //Creation of the camera with your factor 32
    camera = new OrthographicCamera();
    camera.viewportHeight = Gdx.graphics.getHeight() * WORLD_TO_BOX;  
    camera.viewportWidth = Gdx.graphics.getWidth() * WORLD_TO_BOX;  
    camera.position.set(camera.viewportWidth/2, camera.viewportHeight/2, 0f);  
    camera.update();

    //Let's say you want to create a body in the center of your screen
    BodyDef = new BodyDef();  
    BodyDef.position.set(new Vector2(camera.viewportWidth/2, -camera.viewportHeight/2));  
    body = world.createBody(BodyDef);  
    box = new PolygonShape();  
    //Let's say you want your body to have the shape of a square which sides size is one fifth of your camera width
    bodyWidth = camera.viewportWidth/10;
    bodyHeight = camera.viewportWidth/10;
    box.setAsBox(bodyWidth, bodyHeight);
    body.createFixture(box, 0.0f);
}

目前,您仅使用转换因子WORLD_TO_BOX来创建相机。但是,如果要在身上绘制一些精灵,可以在render()中使用BOX_TO_WORLD因子。例如,您要使用spritebatch在您的正方形上以正确的大小和位置在正方形的render()中绘制一个sprite:

private Texture texture;

public void render(){
    game.batch.begin();
    game.batch.setColor(1,1,1,1);
//In Box2D, the orgin of a body is the center of the body, 
//while in your world the orgin of a sprite is the bottom left corner
//I Box2D the width and the height of a body will be twice the values you entered,
//while in your world the width and the height of a sprite are the exact values you entered.
//Taking all this into account, to draw a sprite above a body you need to :
//1 - center the sprite above the body. Ex : (body.getPosition().x - bodyWidth) for the X position
//2 - draw the sprite at the right size, taking in account the factor 2. Ex : bodyWidth * 2 for the widht of the sprite
//3 - Apply the BOX_TO_WORLD factor to all every sizes and distances
    game.batch.draw(texture,
                    BOX_TO_WORLD * (body.getPosition().x - bodyWidth),
                    BOX_TO_WORLD * (body.getPosition().y - bodyHeight),
                    BOX_TO_WORLD * bodyWidth * 2,
                    BOX_TO_WORLD * bodyHeight * 2);
     game.batch.end();
}

希望它能回答您的问题。



 类似资料:
  • 我正在重温LibGDX游戏编程,不幸的是,我不得不重新学习我以前知道的东西。 我目前正在使用平铺地图编辑器制作一个非常简单的大金刚风格关卡。我总共有大约20个矩形。 我在我的主要游戏屏幕类中创建了一个box2d世界,并有一个for循环来将矩形对象放入世界和调试器。 我的问题是,只有我绘制的底部(和第一个)矩形出现。我已经检查了比例,还放了一个println(),它告诉我已经解析了对象信息,所有的矩

  • 我的代码的逻辑流: 模型批处理开始 使用ModelBatch在子弹世界中呈现所有3D模型 模型批处理结束 SpriteBatch开始 使用SpriteBatch使用ParticleEffect(effect.Draw)呈现火焰效果 SpriteBatch结束 使用Stage绘制HUD 问题是:火的效果在三维空间的某一点上表现得很好。但是当我旋转相机,使一个3D模型位于相机和火效果之间,火效果呈现在

  • 我有一个大学项目,用LibGDX制作关于粉碎游戏的游戏,我做了这个项目,当玩家生命为0时,它从游戏屏幕类切换到EndGameScreen类,但是这种情况发生了失败的渲染,我实际上不确定这是否是因为setScreen方法或我的EndGameScreen类是不正确的 游戏屏幕类 EndGameScreen类 }

  • 我有一个问题,我认为它与屏幕渲染及其生命周期有关。基本上我有两个屏幕(菜单和游戏)。在GameScreen渲染方法中,我称之为World。更新,然后我的渲染。在(GameScreen的)隐藏方法中,我从Redner类中处理SpriteBatch。 因此,当我将屏幕从游戏更改为菜单(intheworld.update)时,Java崩溃。据我所知,飞机失事了。所以我的问题是,当我在渲染周期中间设置一个

  • 我在android上使用libgdx时遇到字体问题。当我第一次打开应用程序时,它们工作得很好。但是,当我暂停应用程序然后继续时,字体呈现不正确。 下面是我如何创建字体的。 我的暂停/恢复方法中没有任何内容,不确定是否应该有什么内容。 这是它之前/之后的样子。

  • 我面临一些渲染问题。试图建立一个2d平台游戏,我的计划是创建与搅拌机的演员。我是新手,搅拌机和libgdx,不知道错误在哪里。 在《搅拌机》中,演员看起来很好。由libgdx渲染,我只看到奇怪的形式,根本不像我的演员。 -----编辑好,我缩小了问题的范围。在blender中,我创建了一个简单的立方体。在我的libgdx应用程序中,如果只渲染多维数据集而不渲染其他内容,则可以很好地渲染此多维数据集