在 pygame 中编写游戏时,我尝试使用 XOR (^) 二元运算符来“切换”我传递给函数的任何标志。然而,我不断遇到溢出错误(和
Warning: re-creating window in toggle_fullscreen action()
错误)。
为了调试这个,我尝试使用 & 运算符来检查是否正确检测到标志并将其与 pygame 提供的常量值进行比较。
print(pygame.display.get_surface().get_flags() & exampleflag, exampleflag)
虽然这在检查 pygame.NOFRAME 时有效(当不处于无边界模式时,结果是
0 32
;当处于无边界模式时,结果是 32 32
。pygame.SCALED
时,它总是会输出 0 512
,即使 pygame.SCALED
存在并且我期待 512 512
。pygame.FULLSCREEN
时(我使用 pygame.display.toggle_fullscreen()
切换它,如果这有任何帮助的话),结果是 0 -2147483648
(因为窗口不是全屏,所以期待 0 0
),这显然是不正确的,可能是为什么我收到溢出错误。
我真的不明白 pygame 标志是如何工作的,超出了基本二元运算符的作用,因为它没有很好的记录(事实上,你可以使用 & 本身检查标志,这是我在另一个问题上发现的堆栈溢出)。有人可以解释为什么会发生这种情况吗?
pygame 表面标志与您传递给
pygame.display.set_mode
的标志完全不同。 SCALED
、FULLSCREEN
和 NOFRAME
是 set_mode
标志。您无法使用 Surface.get_flags()
来测试它们。
这些是表面标志,如Surface.get_flags
下的
记录:
SWSURFACE 0x00000000 # Surface is in system memory
HWSURFACE 0x00000001 # (obsolete in pygame 2) Surface is in video memory
ASYNCBLIT 0x00000004 # (obsolete in pygame 2) Use asynchronous blits if possible
HWACCEL 0x00000100 # Blit uses hardware acceleration
SRCCOLORKEY 0x00001000 # Blit uses a source color key
RLEACCELOK 0x00002000 # Private flag
RLEACCEL 0x00004000 # Surface is RLE encoded
SRCALPHA 0x00010000 # Blit uses source alpha blending
PREALLOC 0x01000000 # Surface uses preallocated memory