Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 游戏显示位置_Python_Pygame - Fatal编程技术网

Python 游戏显示位置

Python 游戏显示位置,python,pygame,Python,Pygame,创建pygame窗口后,我需要窗口位置: window = pygame.display.set_mode((width, height), 0, 32) pygame.init() 默认情况下,窗口从0,0开始-但是如果用户更改窗口位置,我还需要x,y。有什么想法吗?有一个pygame.display.get\u wm\u info()调用,它将为您获取窗口处理程序——从那时起,它将使用X11或Windows API32通过该处理程序从窗口获取信息。我没有找到任何现成的关于如何做到这一点的信

创建pygame窗口后,我需要窗口位置:

window = pygame.display.set_mode((width, height), 0, 32)
pygame.init()

默认情况下,窗口从0,0开始-但是如果用户更改窗口位置,我还需要x,y。有什么想法吗?

有一个pygame.display.get\u wm\u info()调用,它将为您获取窗口处理程序——从那时起,它将使用X11或Windows API32通过该处理程序从窗口获取信息。我没有找到任何现成的关于如何做到这一点的信息

所以,我要明确一点:在pygame中没有普通的方法可以做到这一点。在获得窗口处理程序后,您必须处理另一个库,可能使用ctypes

另一方面,如果您必须操作窗口本身,那么pygame可能不是最适合您使用的库——您可以尝试PyQt甚至GTK+——它们还提供多媒体工具,同时更适合在GUI窗口和其他控件级别上操作


更新有一些方法可以为pygame图形设置openGL后端,这将允许完全控制显示-包括将其嵌入另一个窗口,作为tkinter或Qt应用程序的一部分。感兴趣的人可以沿着这些线进行更深一点的搜索。

(0,0)保留在左上角,无论窗口是否移动。如果您试图使(0,0)物理上保持在窗口初始化时屏幕上的位置,我认为pygame无法做到这一点。如果你想得到更清晰的答案,请尽量让你的问题更清晰。

我需要pygame窗口的x,y坐标-无论是在开始时还是在窗口移动时。最后一个很好

我找到了如何将pygame窗口居中放置在屏幕底部的方法:

    pos_x = screen_width / 2 - window_width / 2
    pos_y = screen_height - window_height
    os.environ['SDL_VIDEO_WINDOW_POS'] = '%i,%i' % (pos_x,pos_y)
    os.environ['SDL_VIDEO_CENTERED'] = '0'
背景:我有与屏幕相关的x、y坐标,我必须将屏幕坐标转换为窗口本地坐标,以便我可以使用它们,例如在pygame窗口内显示坐标或丢弃pygame窗口外的坐标


通过上面的方法,我知道了最初的位置。但是我只能使用一个pygame窗口(因为它始终位于同一位置),如果用户移动窗口,就会出现问题。

下面是一个示例代码,返回所有四个角位置:

from ctypes import POINTER, WINFUNCTYPE, windll
from ctypes.wintypes import BOOL, HWND, RECT


# get our window ID:
hwnd = pygame.display.get_wm_info()["window"]

# Jump through all the ctypes hoops:
prototype = WINFUNCTYPE(BOOL, HWND, POINTER(RECT))
paramflags = (1, "hwnd"), (2, "lprect")

GetWindowRect = prototype(("GetWindowRect", windll.user32), paramflags)

# finally get our data!
rect = GetWindowRect(hwnd)
print "top, left, bottom, right: ", rect.top, rect.left, rect.bottom, rect.right

# bottom, top, left, right:  644 98 124 644

它对我起了作用:

import os
import pygame
x = 100
y = 45
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (x,y)
pygame.init()
screen = pygame.display.set_mode((100,100))

取自Pygame 2中的,您也可以导入
\u sdl2.video
来设置窗口位置。请注意,此模块是实验性的,可以在将来的版本中进行更改

import pygame
from pygame._sdl2.video import Window

pygame.init()

window = Window.from_display_module()
window.position = your_position_tuple
在大多数情况下,使用其他答案中提到的环境变量就足够了,但缺点是,一旦更改了窗口位置,它将无法再次工作(至少在Pygame 2中)

基于。因此,您可以设置SDL环境变量

见:

在初始化pygame之前,可以使用SDL环境变量设置窗口的位置。可以使用python中的os.environ dict设置环境变量

x=100
y=0
导入操作系统
操作系统环境['SDL\u视频窗口位置]=%d,%d%(x,y)
导入pygame
pygame.init()
screen=pygame.display.set_模式((100100))

若要在您不知道用户的监视器大小的情况下完成此操作,请在pygame和os软件包之外使用。Screeninfo与操作系统无关,这意味着无论用户操作系统如何,都可以获得所有监视器的分辨率

import pygame
from screeninfo import get_monitors
import os

# Set the size of the pygame window
window_width = 512
window_height = 288
window_size = (window_width, window_height)

# Get the bounds of the users monitors, and select the first one
monitors = get_monitors() # Get the resolution of all of the users monitors
screen_width = monitors[0].width # Get width of first monitor found
screen_height = monitors[0].height # Get height of first monitor found

# Set the x and y coordinates of the pygame window in relation to the monitor's resolution 
# (I wanted my pygame window to be located in the bottom-right of the monitor)
pos_x = screen_width - window_width # Calculate the x-location
pos_y = screen_height - window_height # Calculate the y-location
os.environ['SDL_VIDEO_WINDOW_POS'] = '%i,%i' % (pos_x,pos_y) # Set pygame window location

pygame.init() # Initialize the pygame window
self.screen = pygame.display.set_mode(size) # Set the location of the pygame window

如果用户移动窗口,您需要x,y坐标吗?对吗?或者你想在初始化窗口时设置自己的坐标?我认为在Pygame中默认情况下这是不可能的。