Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Libgdx';s世界单位_Java_Libgdx - Fatal编程技术网

Java Libgdx';s世界单位

Java Libgdx';s世界单位,java,libgdx,Java,Libgdx,我一直在尝试学习libgdx,但现在我对那里的世界单位有点困惑,我甚至不知道我应该问什么确切的问题 不管怎样,我一直在阅读这个示例游戏代码 据我所知,在没有摄像头的情况下,SpriteBatch会渲染与设备分辨率相关的所有内容,所以像素,但当我们制作一个摄像头时,设置它的“大小”,定位,然后使用batch.setProjectionMatrix(camera.combined),batch会将像素转换为单位,然后它知道在哪里渲染,但是在这个游戏中,Rectangle对象之间有碰撞检测,当你用re

我一直在尝试学习libgdx,但现在我对那里的世界单位有点困惑,我甚至不知道我应该问什么确切的问题

不管怎样,我一直在阅读这个示例游戏代码 据我所知,在没有摄像头的情况下,
SpriteBatch
会渲染与设备分辨率相关的所有内容,所以像素,但当我们制作一个摄像头时,设置它的“大小”,定位,然后使用
batch.setProjectionMatrix(camera.combined)
,batch会将像素转换为单位,然后它知道在哪里渲染,但是在这个游戏中,
Rectangle
对象之间有碰撞检测,当你用
rect.set(x,y,1,1)设置这个
Rectangle
的位置时
其中
x
y
是世界单位,而不是像素,如果没有像
setProjectionMatrix
那样让矩形知道我们现在是以单位而不是像素工作,那么矩形如何知道它是否应该使用这些
x
y
作为单位而不是像素,那么这就是
1, 1);最后,是否也以单位表示?如果是这样的话,那么矩形如何知道这些单位应该有多大(例如游戏中的比例是1/16)
renderer=neworthogonaltiledmaprenderer(地图,1/16f)

我甚至不知道这个问题是否真的有意义,但这就是我所处的位置,我真的迷失在这里

编辑:好的,我现在理解了单位是如何工作的,但碰撞仍然让我有点困惑,这里的例子,我创建了这个

// onCreate
    mapSprite = new Sprite(new Texture(Gdx.files.internal("space.png")));
            planetTexture = new Texture(Gdx.files.internal("planet.png"));
            shapeRenderer = new ShapeRenderer();


           //Planet(X,Y,Radius)
        planet = new Planet(20, 30, 7);
        planet2 = new Planet(70, 50, 8);
        circle = new Circle(planet.getPosition().x + planet.radius, planet.getPosition().y + planet.radius, planet.radius);
        circle2 = new Circle(planet2.getPosition().x + planet2.radius, planet2.getPosition().y + planet2.radius, planet2.radius);


        mapSprite.setPosition(0,0);
        mapSprite.setSize(133, 100);

        stateTime = 0;

        camera = new OrthographicCamera();
        camera.setToOrtho(false, 133, 100);

        camera.position.set(133 /2, 100 /2, 0);
        camera.update();

        batch = new SpriteBatch();
...
// Render Method

batch.setProjectionMatrix(camera.combined);
        batch.begin();
        mapSprite.draw(batch);
        batch.draw(planetTexture, planet.getPosition().x, planet.getPosition().y, planet.radius * 2, planet.radius * 2);
        batch.draw(planetTexture, planet2.getPosition().x, planet2.getPosition().y, planet2.radius * 2, planet2.radius * 2);

        batch.end();

        shapeRenderer.setProjectionMatrix(camera.combined);
        shapeRenderer.setColor(Color.RED);
        shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);

        shapeRenderer.circle(circle.x, circle.y, circle.radius + 1);
        shapeRenderer.end();
一切都呈现得很好,
shaperender
圆就是在设置shaperender的投影矩阵
shaperender.setProjectionMatrix(camera.combined)
之后它应该位于的位置:

但是,我仍然不知道如何检查这个圆上的碰撞,当我在“渲染方法”中执行此操作并按下圆上的按钮时,什么都没有发生,就像我没有得到日志一样,我假设这是因为圆不知道世界比例(没有类似于
setprojectionmatrix
)和渲染坐标以及实际圆的位置“想”这是不匹配的。我如何检查那个圆圈上的碰撞

if(Gdx.input.justTouched()) {

    if(circle.contains(Gdx.input.getX(), Gdx.input.getY())) {

                    Gdx.app.log("SCREEN", "TOUCHED AND CONTAINS");
    }
}

EDIT2:我现在明白了,一切正常,我只是没有使用
相机。在使用相机渲染东西时,应将精灵批次的投影矩阵设置为相机的组合视图

世界与摄影机完全分离。世界有正坐标和负坐标。摄影机是你对世界的看法,就像文字摄影机一样,它可以在空间中移动。当你移动游戏摄影机时,你只是在改变你能看到的世界的哪一部分


所有物理都是在相对于世界原点的像素级上完成的(在您的情况下)。相机不会以任何方式改变它。

想象您有一台1200 x 800像素大的设备

现在,您说您将在位置:100100和大小:100100上有一个box2d矩形

现在使用SpriteBatch(Box2DebugRenderer)渲染时,您将看到一个1200 x 800单位的大世界。您必须尝试忘记以像素为单位进行思考。重要的是SpriteBatch始终绘制1200 x 800像素,但不总是1200 x 800单位,稍后还有更多

这就是你看到的:

当我们现在使用相机时,我们说我们将只使用600 x 400单位的世界。
我们创建了一个尺寸为600 x 400单位的摄像头

camera = new OrthographicCamera(600, 400);

该批仍绘制1200 x 800单位和1200 x 800像素

现在,使用batch.setProjectionMatrix(camera.combined);
为批次提供一个矩阵来计算单元的大小。使用该矩阵,他可以计算它的大小,并绘制1个单元
在这之后,SpriteBatch绘制了600 x 400个单位,但仍然是1200 x 800像素。
然后你会看到:

由于这个原因,你可以忘记以像素为单位思考相机矩阵为你从像素到单位进行计算,你可以专注于以单位为单位思考

下一个你必须以单位来思考的问题是,box2D以米为单位计算。因此矩形是100 x 100米大,距离底部100米。因此,在重力g=9,81m/s的情况下,矩形下降的速度没有你想象的那么快

SpriteBatch总是画1200 x 800像素,否则你只能在屏幕的一半上看到游戏。但通过相机矩阵,该批人知道他必须画多少像素1个单位,因此你可以在1200 x 800像素的屏幕上看到600 x 400个单位的世界

注意:1个单位并不总是等于1米。例如,在一个宇宙飞船游戏中,两艘船之间有5公里。因此,请不要创建一个10000 x 10000个单位的世界,因为Box2d不会计算这个数值。
然后你可以说1个单位等于100米,所以你有一个100 x 100个单位的世界。 现在你们必须记住,当一艘船应该以200米/秒的速度航行时,你们必须设置body.setLinearVelocity(2,0),因为1个单位等于100米

所以一定要以单位思考

编辑:
有时我们不使用像素,例如Gdx.input
Gdx.input返回像素位置。
现在我们的相机有两种方法可以从像素位置转换到单位位置,反之亦然

float x = Gdx.input.getX();
float y = Gdx.input.getY();
camera.unproject(new Vector3(x, y, 0));//this converts a Vector3 position of pixels to a Vector3 position of units
camera.project(new Vector3(10,10,0));//this converts a Vector3 position of units to a Vector3 position of pixels

我希望我能帮助你

所以当我使用
Rectangle.set(float x,float y,float width,float height)
所有这些值都是以像素为单位的?是的,所有的值都是以像素为单位的,每个坐标只是相对于其他的。好吧,但如果它像这样工作,这是否意味着在这个游戏示例中碰撞检测没有得到正确处理(有效)。当您将
x
y
值发送到
矩形时。像在上一张图像中一样设置
,它不会检查与该块的冲突,该块位于x=12个单位=192px,因为它以像素为单位计算冲突。您使用的是box2d吗?这是来自的游戏示例,我还没有尝试过box2d,但我认为没有任何box2d el“矩形没有”