Pygame FULLSCREEN Display Flag Creates A Game Scre

2020-02-15 05:02发布

UPDATED ISSUE

I have discovered the issue appears to be with the fact that I am using the FULLSCREEN display flag to create the window. I added a rectangle to be drawn in the top left of the scree (0, 0), but when I run the program, It is mostly off the screen. Then, when I Alt-Tab away and back, the rectangle is appropriately placed at 0,0 and the turret is off center.

So basically, when the program starts, the game screen is larger than my actual screen, but centered. Then after Alt-Tab, the game screen is lined up with 0,0 but since the game screen is larger than my screen, the turret looks off center, but is actually centered relative to the game.

So the real question is why does using the FULLSCREEN display flag make a screen larger than my computer screen?

ORIGINAL ISSUE

I am building a simple demonstration of a turret in the center of the screen which follows the location of the cursor as if to fire where it is. Everything works perfectly until I Alt-Tab away from the screen, and then Alt-Tab back. At this point to turret is now off center (down and to the right)

import pygame, math
pygame.init()

image_library = {}

screen_dimen = pygame.display.Info()
print("Screen Dimensions ", screen_dimen)

def get_image(name):
    if name not in image_library:
        image = pygame.image.load(name)
        image_library[name] = image
    else:
        image = image_library[name]
    return image

robot_turret_image = get_image('robot_turret.png')

screen = pygame.display.set_mode((0, 0), pygame.`FULLSCREEN`)

done = False

clock = pygame.time.Clock()

while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        if event.type == pygame.MOUSEMOTION:
            print(event.pos)
        if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            done = True

    screen.fill((0, 0, 0))
    pos = pygame.mouse.get_pos()
    angle = 360 - math.atan2(pos[1] - (screen_dimen.current_h / 2),
                             pos[0] - (screen_dimen.current_w / 2)) * 180 / math.pi
    rot_image = pygame.transform.rotate(robot_turret_image, angle)
    rect = rot_image.get_rect(center=(screen_dimen.current_w / 2, screen_dimen.current_h / 2))

    screen.blit(rot_image, rect)

    color = (0, 128, 255)
    pygame.draw.rect(screen, color, pygame.Rect(0, 0, 200, 200))

    pygame.display.update()
    clock.tick(60)

It seems that the center is now off. I have printed out the screen dimensions before and after the Alt-Tab and they are the same, so I can't figure out why the image moves. I believe I am missing something regarding state changes with Pygame, but can't figure out what. If it is relevant, I am on Windows 10.

标签: python pygame
1条回答
爷、活的狠高调
2楼-- · 2020-02-15 05:18

Alright, I discovered a solution from gamedev.stackexchange

And I will re-hash it here. The issue was that Using the fullscreen tag was making a screen larger than my computer screen. The following code solves this

import ctypes
ctypes.windll.user32.SetProcessDPIAware()
true_res = (ctypes.windll.user32.GetSystemMetrics(0), ctypes.windll.user32.GetSystemMetrics(1))
pygame.display.set_mode(true_res,pygame.FULLSCREEN)

It is important to note that this is potentially just a windows fix, but I do not have another system with which to test it on. But It works on Windows 10 with python 3.5.1 and pygame 1.9.2a0

查看更多
登录 后发表回答