如何在 pyglet 中更改 pixel_ratio?
How to change pixel_ratio in pyglet?
我使用 pylet 编写了一个游戏。它使用宽度为 1600 和高度为 900 的静态 window,假设用户拥有全高清显示器,因此一切都将可见。然而,在某些设备(带有小显示器)上,window 比预期的要大得多。我发现 pixel_ratio 已设置(例如设置为 2.0),使每个虚拟像素在物理像素中显示为双倍大小 (2x2)。
我想防止这种行为,但不知道如何,我知道我可以通过 get_pixel_ratio() 轻松获得像素比,但实际上我不知道如何设置或防止pyglet 自动设置它们。
我也尝试过使用 glViewport,它似乎有效果,但没有达到我想要的效果。
那么如何更改 pixel_ratio 或防止自动更改它。
在官方 discord 服务器中询问了相关信息,因为我试图用一些代码自己重现该问题,这就是我用来测试它的方法:
import math
from pyglet import *
from pyglet.gl import *
key = pyglet.window.key
class main(pyglet.window.Window):
def __init__ (self, width=800, height=600, fps=False, *args, **kwargs):
super(main, self).__init__(width, height, *args, **kwargs)
self.x, self.y = 0, 0
self.keys = {}
verts = []
for i in range(30):
angle = math.radians(float(i)/30 * 360.0)
x = 100*math.cos(angle) + 300
y = 100*math.sin(angle) + 200
verts += [x,y]
self.pixel_ratio = 100
self.circle = pyglet.graphics.vertex_list(30, ('v2f', verts))
self.alive = 1
def on_draw(self):
self.render()
def on_close(self):
self.alive = 0
def on_key_release(self, symbol, modifiers):
try:
del self.keys[symbol]
except:
pass
def on_key_press(self, symbol, modifiers):
if symbol == key.ESCAPE: # [ESC]
self.alive = 0
self.keys[symbol] = True
def render(self):
self.clear()
glClear(pyglet.gl.GL_COLOR_BUFFER_BIT)
glColor3f(1,1,0)
self.circle.draw(GL_LINE_LOOP)
self.flip()
def run(self):
while self.alive == 1:
self.render()
# -----------> This is key <----------
# This is what replaces pyglet.app.run()
# but is required for the GUI to not freeze
#
event = self.dispatch_events()
if __name__ == '__main__':
x = main()
x.run()
代码并不重要嘿,因为变量 pixel_ratio
只是,我引用:"indicating that the actual number of pixels in the window is larger than the size of the Window created."
这是 OSX 为应对高 DPI 而做的事情,使用此信息您应该能够相应地缩放图形。 Window.get_framebuffer_size()
将显示请求的 Window 大小和帧缓冲区大小的差异(如果有)。
所以你真正放大的唯一方法是使用 glScale
或者如果你使用精灵你可以使用 Sprite.scale
来缩放图像数据。如果您使用的是 2D 图形,我会选择 sprite 选项,因为它很容易使用。
我使用 pylet 编写了一个游戏。它使用宽度为 1600 和高度为 900 的静态 window,假设用户拥有全高清显示器,因此一切都将可见。然而,在某些设备(带有小显示器)上,window 比预期的要大得多。我发现 pixel_ratio 已设置(例如设置为 2.0),使每个虚拟像素在物理像素中显示为双倍大小 (2x2)。
我想防止这种行为,但不知道如何,我知道我可以通过 get_pixel_ratio() 轻松获得像素比,但实际上我不知道如何设置或防止pyglet 自动设置它们。
我也尝试过使用 glViewport,它似乎有效果,但没有达到我想要的效果。
那么如何更改 pixel_ratio 或防止自动更改它。
在官方 discord 服务器中询问了相关信息,因为我试图用一些代码自己重现该问题,这就是我用来测试它的方法:
import math
from pyglet import *
from pyglet.gl import *
key = pyglet.window.key
class main(pyglet.window.Window):
def __init__ (self, width=800, height=600, fps=False, *args, **kwargs):
super(main, self).__init__(width, height, *args, **kwargs)
self.x, self.y = 0, 0
self.keys = {}
verts = []
for i in range(30):
angle = math.radians(float(i)/30 * 360.0)
x = 100*math.cos(angle) + 300
y = 100*math.sin(angle) + 200
verts += [x,y]
self.pixel_ratio = 100
self.circle = pyglet.graphics.vertex_list(30, ('v2f', verts))
self.alive = 1
def on_draw(self):
self.render()
def on_close(self):
self.alive = 0
def on_key_release(self, symbol, modifiers):
try:
del self.keys[symbol]
except:
pass
def on_key_press(self, symbol, modifiers):
if symbol == key.ESCAPE: # [ESC]
self.alive = 0
self.keys[symbol] = True
def render(self):
self.clear()
glClear(pyglet.gl.GL_COLOR_BUFFER_BIT)
glColor3f(1,1,0)
self.circle.draw(GL_LINE_LOOP)
self.flip()
def run(self):
while self.alive == 1:
self.render()
# -----------> This is key <----------
# This is what replaces pyglet.app.run()
# but is required for the GUI to not freeze
#
event = self.dispatch_events()
if __name__ == '__main__':
x = main()
x.run()
代码并不重要嘿,因为变量 pixel_ratio
只是,我引用:"indicating that the actual number of pixels in the window is larger than the size of the Window created."
这是 OSX 为应对高 DPI 而做的事情,使用此信息您应该能够相应地缩放图形。 Window.get_framebuffer_size()
将显示请求的 Window 大小和帧缓冲区大小的差异(如果有)。
所以你真正放大的唯一方法是使用 glScale
或者如果你使用精灵你可以使用 Sprite.scale
来缩放图像数据。如果您使用的是 2D 图形,我会选择 sprite 选项,因为它很容易使用。