java - 无限垂直世界

标签 java android libgdx box2d

我在Box2d中创建了两个物体,它们是:Player和Platform;

我想创建像Doodle Jump这样的游戏,但我不知道如何创建“带有生成平台的无限世界”;

这是我正在创建数组的代码:

buckets = new Array<Bucket>();

for(int i=1;i<BUCKET_COUNT;i++){
    buckets.add(new Bucket(W/2,BUCKET_MARGIN*i, world));
}

在这段代码中,当相机位置改变时,我“尝试”改变每个平台的位置:

for(Bucket bucket : buckets){
        if(cam.position.y - (cam.viewportHeight/2) > bucket.getBody().getPosition().y + 22/PPM){
            bucket.repos(W/2,bucket.getBody().getPosition().y + BUCKET_MARGIN);
        }
    }

它有效! 但是它将最后一个平台位置更改为非常远的底部:

最佳答案

关于如何创造一个无限的世界?

使用世界实例转移原点方法。在 Box2D 2.3.2 C++ 库代码中,这是 b2World::ShiftOrigin(const b2Vec2& newOrigin) 方法。以下是该方法的声明及其文档的摘录:

/// Shift the world origin. Useful for large worlds.
/// The body shift formula is: position -= newOrigin
/// @param newOrigin the new origin with respect to the old origin
void ShiftOrigin(const b2Vec2& newOrigin);

在Java中,你应该能够找到类似的接口(interface)方法。

通过移动原点,您可以将物理世界的视口(viewport)保持在物理世界原点(0, 0)的中心(或附近)。这基本上是实现 Yevhen Danchenko 在评论中建议的实际方法。

使用它的一个原因是 Box2D 所依赖的浮点运算的实现本身并不是无限宽范围也不是无限精确。因此,移动事物有助于使事物更接近原点,在原点处浮点值更准确,并防止事物超出实际可用值的范围(假设您仅显示有限范围的 x 和 y 值)。

关于java - 无限垂直世界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43810602/

相关文章:

JavaFX 着色 XYChart.Series

java - 两个字符串 - 哪个更好?

java - 为什么 Ant Exec 任务返回代码与 ERRORLEVEL 值不匹配?

java - 无法将相对路径 ~/.gradle/daemon/6.4.1 转换为绝对文件

java - gdx-freetype 生成字体很慢

java - 在Scala中,给定一个子类,如何使用反射检查它是否覆盖其父接口(interface)(在Java中定义)的默认方法?

java - 如何在 ListView 中选定的列表项上设置自定义默认铃声?

javascript - 从Android平板电脑图像路径在d3.js中显示图像

android - View 类型中的 setOnClickListener(View.OnClickListener) 不适用于参数 (SequencerActivity) back.setOnClickListener(this);

java - 在 LibGDX 中每次都不会调用 ContactListner(Box2d) 的 EndContact