Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
416 views
in Technique[技术] by (71.8m points)

python - Pygame FULLSCREEN Display Flag Creates A Game Screen That Is Too Large For The Screen

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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...