Как мне работать с полноэкранным режимом в 2d игре? - PullRequest
0 голосов
/ 30 мая 2019

Я создаю игру, используя Go с библиотекой рендеринга "pixel".

Я пытаюсь заставить работать полноэкранный режим / изменение размера, но у меня есть проблема, и вот как бороться с растяжением изображений

Я видел и использовал решение эффекта "почтового ящика" для игры.

То есть, рисуя игру в том же соотношении сторон, такрастяжение не было бы проблемой, оставляя дополнительное пространство в виде черных полос.

Моя проблема заключается в том, что при попытке сделать это в этой библиотеке рендеринга я могу только масштабировать матрицу«Холст», на котором я рисую.

Я привык к SFML с C ++, где я могу просто определить фиксированный размер для «Представления» [того, что рисуется], а не масштабировать его.

Вот так я получаю текущее масштабирование для матрицы, это неправильно, но это то, что у меня есть.

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, скрывая большую часть «холста»] [y increased] 3

Полноэкранный [просто сохраняет свой первоначальный размер, но ширина «холста» немного уменьшена] [fs] 4

Я просто не могу понять математику с ним.

Если это не лучший способ решить проблему с полноэкранным режимом, которая у меня есть, тогда дайте мне знать, и я могу задать еще один вопрос, но мне сказали, что это то, как вы должны это сделать.

1 Ответ

0 голосов
/ 30 мая 2019

Получилось очень просто, просто математическая ошибка с моей стороны.

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))

}

Просто нужно было выяснить, была ли разница в ширине окна нового размера больше или в высоте, а затем применить такое же соотношение [ширина нового окна / ширина старого кадра], чтобы правильно масштабировать матрицу. Тупой ответ на тупой вопрос.

...