我正在使用带有渲染库“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))
这是它目前的样子:
窗口宽度增加[收缩] [ ] 2
窗口高度增加 [在 X 上拉伸(stretch),隐藏大部分“ Canvas ”] [ ] 3
全屏 [只是保持原来的大小,但“ Canvas ”的宽度稍微缩小了] [ ] 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/