go - 如何在 2d 游戏中处理全屏?

标签 go 2d fullscreen game-engine

我正在使用带有渲染库“pixel”的 Go 制作游戏。

我正在尝试全屏/调整大小,但我有一个问题,那就是如何处理图像拉伸(stretch)

我已经看到并使用了游戏“信箱”效果的解决方案。

也就是说,以相同的纵横比绘制游戏,因此拉伸(stretch)不会成为问题,将额外的空间留作黑条。

我的问题是,当尝试在此渲染库中执行此操作时,我只能缩放我正在绘制的“ Canvas ”的矩阵。

我习惯了使用 C++ 的 SFML,我可以在其中为“ View ”[正在绘制的内容] 定义一个固定大小,而不是缩放它。

这就是我获取矩阵当前缩放比例的方式,这是不正确的,但这是我所拥有的。

camZoom 是 2.0,它在那里所以屏幕更大。如果 camZoom 为 1.0 [正常],则图像太小。

func letterBox(win *pixelgl.Window) {
windowRatio := winWidth / winHeight
viewRatio := win.Bounds().W() / win.Bounds().H()
sizeX := 1.
sizeY := 1.

horizontalSpacing := true
if windowRatio < viewRatio {
    horizontalSpacing = false
}

if horizontalSpacing {
    sizeX = viewRatio / windowRatio
} else {
    sizeY = windowRatio / viewRatio
}

viewMatrix = pixel.IM.
    Moved(pixel.V(win.Bounds().Center().X/camZoom, win.Bounds().Center().Y/camZoom)).
    ScaledXY(pixel.V(win.Bounds().Center().X/camZoom, win.Bounds().Center().Y/camZoom), pixel.V(sizeY, sizeX))

这是它目前的样子:

正常 [未调整大小,1024x768]: normal

窗口宽度增加[收缩] [ x increased ] 2

窗口高度增加 [在 X 上拉伸(stretch),隐藏大部分“ Canvas ”] [ y increased ] 3

全屏 [只是保持原来的大小,但“ Canvas ”的宽度稍微缩小了] [ fs ] 4

我实在想不通其中的数学原理。

如果这不是解决我遇到的全屏问题的最佳方法,请告诉我,我可以提出另一个问题,但有人告诉我这是你应该做的。

最佳答案

最终变得 super 简单,只是我的一个数学错误。

func letterBox(win *pixelgl.Window) {
sizeX := 1.
sizeY := 1.

if win.Bounds().H()-winHeight > win.Bounds().W()-winWidth {
    sizeX = win.Bounds().W() / winWidth
    sizeY = win.Bounds().W() / winWidth
} else {
    sizeX = win.Bounds().H() / winHeight
    sizeY = win.Bounds().H() / winHeight
}

viewMatrix = pixel.IM.
    Moved(pixel.V(win.Bounds().Center().X/camZoom, win.Bounds().Center().Y/camZoom)).
    ScaledXY(pixel.V(win.Bounds().Center().X/camZoom, win.Bounds().Center().Y/camZoom), pixel.V(sizeX, sizeY))

只需弄清楚新尺寸窗口的宽度差异或高度差异是否更大,然后应用相同的比率 [新窗口宽度/旧框架宽度] 来适当缩放矩阵。对愚蠢问题的愚蠢回答。

关于go - 如何在 2d 游戏中处理全屏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56370460/

相关文章:

http - 在 GO 中重新组合大块 zip 下载

regex - 使用 golang 和 regexp 摆脱外部标签?

c++ - ActiveX 控件的全屏模式

C++ Qt QGraphicsWidget 背景

c++ - SDL2 全屏和渲染到纹理

javascript - 按 Esc 键退出全屏时发生了什么?我怎样才能用一个按钮复制它?

go - 循环导入和缺乏泛型令人头疼

Go GRPC 客户端断开连接终止 Go 服务器

c# - 在 2D 中查找远程点

python - 为什么pyglet.image和texture这么重?