- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在努力学习 libgdx,但现在我对那里的世界单位有点困惑,我什至不知道我应该问什么确切的问题。
无论如何,我一直在阅读这个示例游戏代码here据我了解,当没有相机时,SpriteBatch
渲染与设备分辨率相关的所有内容,例如像素,但是当我们制作相机时,设置它的“大小”、位置然后使用 batch.setProjectionMatrix(camera.combined)
, batch translates pixels to units and then it knows where to render , 但在这个游戏中有 Rectangle
之间的碰撞检测对象,以及当您设置此 Rectangle
的位置时与 rect.set(x, y, 1, 1);
其中 x
和 y
是世界单位而不是像素,矩形如何知道它是否应该使用那些 x
和 y
如果没有像 setProjectionMatrix
这样的东西,则作为单位而不是像素让它知道现在我们以单位而不是像素为单位工作,然后就是这个 1, 1);
最后,它也是单位吗?如果是这样,那么 Rectangle 如何知道这些单位应该有多大(例如,游戏中的比例是 1/16)renderer = new OrthogonalTiledMapRenderer(map, 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();
一切都很好,ShapeRenderer
设置 ShapeRenderer 的投影矩阵后,圆圈应该在的位置 shapeRenderer.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:我现在明白了,一切正常,我只是没有使用 camera.unproject
在触摸坐标上
最佳答案
假设您有一台 1200 x 800 像素的设备。
现在你说你将在位置上有一个 box2d 矩形:100、100 和大小:100,100
当您现在使用 SpriteBatch (Box2dDebugRenderer) 渲染它时,您将看到一个 1200 x 800 单位大的世界。您必须尝试忘记以像素为单位进行思考。重要的是 SpriteBatch 总是绘制 1200 x 800 像素但并不总是 1200 x 800 单位,稍后更多。
这就是你所看到的:
当我们现在使用相机时,我们说我们将只有 600 x 400 单位的世界。
我们创建了一个尺寸为:600 x 400 units 的相机!
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 m/s 时,您必须设置 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
希望能帮到你
关于java - Libgdx 的世界单位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51993577/
一个关于Lua和元表的初学者问题,以一个简单的Hello-World为例,涉及len事件,不幸的是它没有返回预期的结果(我使用的是从 Ubuntu 官方存储库安装的 Lua 5.1)。 案子 这是示例
我正在开发一个 OpenGL 应用程序。我需要一个地球自转模型(蓝色的水,绿色的土地)。我的问题不是处理 OpenGL/图形……而是处理数据。 我在哪里可以获得这些数据? (各个国家的边界)。如果
我试图了解在 OpenGL 中创建空间: 对象空间 世界空间 相机空间 投影空间 我对这些阶段的理解是否正确? “立方体”是在笛卡尔坐标系的中心创建的,直接在程序内部输入顶点坐标。 坐标转换为“世界”
我有一个Entity和Bundle的Components,我想附加到将成为第一个实体的子实体的实体上。我可以使用Commands生成带有我的组件的实体,但是我无法获得实际的Entity,这意味着我不能
我想创建一个游戏,它有一个无尽的(实际上是一个非常大的)世界,玩家可以在其中移动。我是否会抽出时间来实现游戏是一回事,但我发现这个想法很有趣,并且希望就如何实现它提供一些意见。 关键是要有一个所有数据
以下代码片段来自维基百科,是标准 Hello World! 的序言! Brainfuck 中的程序... 1. +++++ +++++ initialize counter (
就目前情况而言,这个问题不太适合我们的问答形式。我们期望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我正在尝试获取特定日期剩余的确切秒数、分钟数等。这听起来可能很愚蠢,但为什么结果会翻倍呢?这看起来不对,是吗? setInterval(function() { var startDate =
如果我有两个嵌套元素,假设: Foo 然后我对外部元素应用旋转,假设顺时针旋转 45 度: Foo 现在我想将内部 div 向下移动一点。 Foo http://j
在 WindowsForms 世界中,您可以获得可用图像编码器/解码器的列表 System.Drawing.ImageCodecInfo.GetImageDecoders() / GetImageEn
因此,作为我的计算机体系结构类(class)的一部分,我需要熟悉 Assembly,或者至少足够舒适,我正在尝试读取用户的输入然后重新打印(暂时),这是我的我是如何尝试用伪代码来展示它的: 声明 ms
在 HLSL 中有很多矩阵乘法,虽然我了解如何以及在何处使用它们,但我不确定它们是如何导出的或它们的实际目标是什么。 所以我想知道是否有在线资源可以解释这一点,我特别好奇将世界矩阵乘以 View 矩阵
我正在使用 http://jvectormap.owl-hollow.net/ 中的 jVectorMap一切正常。但世界地图的标准尺寸非常小。如果有人想打例如波斯尼亚和黑塞哥维那,他需要大眼镜!有可
我在做游戏。游戏由一个无限平面组成。单位必须在一个离散的正方形上,因此可以使用简单的 Location { x :: Int, y :: Int } 来定位它们。 可能有很多种Unit s。有些可能是
所以我创建了一个顶点着色器,它接受一个角度并计算旋转。尽管模型围绕世界中心而不是它自己的轴/原点旋转,但存在一个问题。 旁注:这是 2D 旋转。 如何让模型绕着自己的轴旋转? 这是我当前的顶点着色器:
所以我创建了一个顶点着色器,它接受一个角度并计算旋转。尽管模型围绕世界中心而不是它自己的轴/原点旋转,但存在一个问题。 旁注:这是 2D 旋转。 如何让模型绕着自己的轴旋转? 这是我当前的顶点着色器:
我最近萌生了创建标签云的想法,就像地球形状的动画一样。我从 ngdc.noaa.gov 中提取了海岸线坐标,并编写了一个小脚本,将其显示在我的浏览器中。现在您可以想象,整个海岸线由大约 48919 个
我使用 3d 模式渲染我的 2d 游戏,因为相机旋转和放大/缩小比 2d 模式容易得多。 现在我遇到了一个我似乎想不出如何解决的问题: 如何使我的世界的 2d 平面以 1 个纹理像素匹配屏幕上的 1
我正在寻找一种简单快捷的方法来清除整个 Phaser 屏幕,就像在 HTML5 canvas 中,您可以通过将 Canvas 的宽度重置为自身来删除所有内容。我无法通过搜索找到任何此类方法 - 只有
是否可以为这样的游戏创建一个 2.5D 世界(双龙)http://www.youtube.com/watch?v=xb9P0YTeq5Y使用box2d? 你知道任何工作示例吗? 预先感谢您的时间。 最
我是一名优秀的程序员,十分优秀!