- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我花了几个令人沮丧的小时来尝试实现(我认为的)一个简单的 FontActor
类。
这个想法是使用提供的 BitmapFont 在特定位置绘制文本。我已经做到了这么多。但是,我正在努力根据渲染的文本计算 Actor 的宽度/高度。
(使用FitViewport进行测试)
open class FontActor<T : BitmapFont>(val font: T, var text: CharSequence = "") : GameActor() {
val layout = Pools.obtain(GlyphLayout::class.java)!!
companion object {
val identity4 = Matrix4().idt()
val distanceFieldShader: ShaderProgram = DistanceFieldFont.createDistanceFieldShader()
}
override fun draw(batch: Batch?, parentAlpha: Float) {
if (batch == null) return
batch.end()
// grab ui camera and backup current projection
val uiCamera = Game.context.inject<OrthographicCamera>()
val prevTransform = batch.transformMatrix
val prevProjection = batch.projectionMatrix
batch.transformMatrix = identity4
batch.projectionMatrix = uiCamera.combined
if (font is DistanceFieldFont) batch.shader = distanceFieldShader
// the actor has pos = x,y in local coords, but we need UI coords
// start by getting group -> stage coords (world)
val coords = Vector3(localToStageCoordinates(Vector2(0f, 0f)), 0f)
// world coordinate destination -> screen coords
stage.viewport.project(coords)
// screen coords -> font camera world coords
uiCamera.unproject(coords,
stage.viewport.screenX.toFloat(),
stage.viewport.screenY.toFloat(),
stage.viewport.screenWidth.toFloat(),
stage.viewport.screenHeight.toFloat())
// adjust position by cap height so that bottom left of text aligns with x, y
coords.y = uiCamera.viewportHeight - coords.y + font.capHeight
/// TODO: use BitmapFontCache to prevent this call on every frame and allow for offline bounds calculation
batch.begin()
layout.setText(font, text)
font.draw(batch, layout, coords.x, coords.y)
batch.end()
// viewport screen coordinates -> world coordinates
setSize((layout.width / stage.viewport.screenWidth) * stage.width,
(layout.height / stage.viewport.screenHeight) * stage.height)
// restore camera
if (font is DistanceFieldFont) batch.shader = null
batch.projectionMatrix = prevProjection
batch.transformMatrix = prevTransform
batch.begin()
}
}
在我的父 Screen
类实现中,我在每次调整窗口大小时重新缩放字体,这样它们就不会变得“平滑”或拉伸(stretch):
override fun resize(width: Int, height: Int) {
stage.viewport.update(width, height)
context.inject<OrthographicCamera>().setToOrtho(false, width.toFloat(), height.toFloat())
// rescale fonts
scaleX = width.toFloat() / Config.screenWidth
scaleY = height.toFloat() / Config.screenHeight
val scale = minOf(scaleX, scaleY)
gdxArrayOf<BitmapFont>().apply {
Game.assets.getAll(BitmapFont::class.java, this)
forEach { it.data.setScale(scale) }
}
gdxArrayOf<DistanceFieldFont>().apply {
Game.assets.getAll(DistanceFieldFont::class.java, this)
forEach { it.data.setScale(scale) }
}
}
在您调整窗口大小之前,此方法可以正常工作并且看起来很棒。调整大小后,字体看起来很好,并且会根据窗口的相对大小自动调整,但是 FontActor
的大小错误,因为我对 setSize
的调用是错误的。
初始窗口:
使窗口水平变大后:
例如,如果我随后水平缩放窗口(这对世界大小没有影响,因为我使用的是 FitViewport
),则字体看起来是正确的,正如预期的那样。但是,即使屏幕上的文本大小没有改变,从 draw()
返回的 layout.width
值也会发生变化。经过调查,我意识到这是由于我使用了 setScale
,但简单地将宽度除以 x 缩放因子并不能纠正错误。再说一次,如果我删除 setScale
调用,这些数字是有意义的,但字体现在被压扁了!
我尝试的另一个策略是将宽度/高度转换为屏幕坐标,然后使用相关的project/unproject方法来获取世界坐标中的宽度和高度。这与图像中显示的问题相同。
如何解决我的数学问题?
或者,是否有更智能/更简单的方法来实现这一切?(不,我不需要 Label
,我只想要一个文本 Actor 。)
最佳答案
一个问题是我的缩放代码。修复方法是更改相机更新,如下所示:
context.inject<OrthographicCamera>().setToOrtho(false, stage.viewport.screenWidth.toFloat(), stage.viewport.screenHeight.toFloat())
这使得我的文本相机与世界视口(viewport)相机相匹配。我使用整个屏幕进行计算,因此进行了拉伸(stretch)。
出于同样的原因,我的 scaleX
/Y
计算也是错误的。纠正这两个错误计算后,我得到了一个可以很好缩放的 FontActor
,并且在世界坐标中具有正确的边界。
关于java - BitmapFont 的自定义 actor (libgdx),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60367268/
简单易用,跨平台,20KB! 效果 效果预览: https://www.bilibili.com/video/BV1cf4y1H7Pa 无论写代码还是写工具,都要明确输入与输出。
抱歉,我对 libgdx 有点陌生(到目前为止我真的很喜欢它!),所以可能有点入门问题 我正在为我的角色扮演游戏实现一个对话框类。基本上我让它一个字符一个字符地显示,就像你在最终幻想游戏中看到的那样。
所以我正在更新我的旧 Android 游戏,但我遇到了一些字体问题。我必须放大位图字体,但现在它很模糊。因此,我想知道在哪里可以获得更高分辨率的位图字体以及我必须将其放在哪个文件夹中?有人可以帮助我吗
我使用 Freetype、工具和 box2d for intellej 创建了我的项目,并尝试在 android studio 中运行: BitmapFont font = new BitmapFon
抱歉这个愚蠢的问题,但我是一个安静的菜鸟。我不知道如何在 Libgdx 中绘制位图字体。好吧,我已经使用 HIERO v2.0 工具制作了 BitmapFont 文件。然后我在代码中初始化它: Bit
我有一个 BitmapFont 来显示玩家得分。玩家以恒定的速度移动。对于 BitmapFont,我使用第二个 OrtographicCamera 和 SpriteBatch,因此我不需要重新计算字体
我有一个 BitmapFont,它在玩家以恒定速率在屏幕上移动时显示他的得分。因为播放器总是在移动,所以我必须重新计算每帧在什么位置绘制字体。我使用此代码。 scoreFont.setScal
我花了几个令人沮丧的小时来尝试实现(我认为的)一个简单的 FontActor 类。 这个想法是使用提供的 BitmapFont 在特定位置绘制文本。我已经做到了这么多。但是,我正在努力根据渲染的文本计
我已经到处寻找这个问题,但找不到解决方案。 这是我的渲染循环: Gdx.gl.glClearColor(0, 0, 0, 1); Gdx.gl.glClear(GL10.GL_COLOR_BUFF
查看LibGDX BitmapFont documentation我没有看到有办法将多个 .tga 文件添加到 BitmapFont 中。当字体大小大于 ~42 时,这只会给我带来麻烦,因此它必须创建
我在(非常)简单的项目中遇到了一个问题。当我绘制文本时,它在 Android(Samsung Galaxy S Advance)和桌面之间显示在不同的位置(并且明显具有不同的大小)。 在我的渲染器类中
我想要的是在更改屏幕大小时相应地更改大小的位图字体。我的意思是在我的电脑上,字体显得相当大,但在我的手机上,它是一种难以阅读的小字体。我可以更改大小,但我希望它在所有屏幕上看起来都相似,而不是在一个屏
我正在尝试使用文件 1.ttf(Android 的 LibGdx 应用程序)中的 BitmapFont。但是,无论我把这个文件放在哪里,我都会得到一个错误,说找不到它。这是我的代码: BitmapFo
我似乎不知道如何正确旋转位图字体。我想你修改了 SpriteBatch 的转换矩阵。但是,尝试旋转围绕某个点旋转文本,但我不知道如何相对于文本本身旋转它。 最佳答案 您可以在 sprite 中创建字形
我敢打赌我做了一些愚蠢的事情,只是似乎没有注意到它。 package com.me.mygdxgame; import com.badlogic.gdx.ApplicationListener; im
我目前正在尝试缩放字体,但收到错误消息“方法 setScale(float, float) 未定义 BitmapFont 类型”这是我收到错误的代码部分,特别是在第 2 行和第 4 行。 fo
我想在我的 Libgdx 游戏中绘制字符串,但我无法使用位图字体,因为我的游戏规模太小,无法使用它们。 最佳答案 听起来您的意思是视口(viewport)的比例太小而无法正确显示字体。有两种解决方案。
之前我在libgdx中的BitmapFont类中使用了getBound方法,但现在我无法使用它了。 我找不到最新版本的更改。 感谢任何帮助。谢谢 最佳答案 在API 1.5.6之后,我们有一种不同的方
我注意到当我使用 opengl 2 时,位图字体颜色不起作用它总是显示我的字体黑色。如何解决? 代码: 在创建() BitmapFont font; font = new BitmapFont(Gdx
我有一个支持安卓和桌面版本的libgdx项目。对于字体,我之前使用 FreeTypeFontGenerator 来生成我的字体。字体工作正常,但后来我决定用 .fnt 和 .png 文件创建我的 Bi
我是一名优秀的程序员,十分优秀!