Python(Pygame)窗口显示

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zengxiantao1994/article/details/58272705

全屏显示

#coding=utf-8
'''
Created on 2017年2月27日

@author: zxt
'''
import pygame
from pygame.locals import QUIT, KEYDOWN, K_f, FULLSCREEN
from sys import exit

background_image_filename = "./images/sushiplate.jpg"
 
pygame.init()
screen = pygame.display.set_mode((640, 480), 0, 32)
background = pygame.image.load(background_image_filename).convert()
 
Fullscreen = False
 
while True:
 
    for event in pygame.event.get():
        if event.type == QUIT:
            exit()
        if event.type == KEYDOWN:
            if event.key == K_f:
                Fullscreen = not Fullscreen
            if Fullscreen:
                # 标志位FULLSCREEN, 全屏显示
                screen = pygame.display.set_mode((640, 480), FULLSCREEN, 32)
            else:
                screen = pygame.display.set_mode((640, 480), 0, 32)
 
    screen.blit(background, (0,0))
    pygame.display.update()
运行这个程序,默认还是窗口的,按“f ”,显示模式会在窗口和全屏之间切换。

可变尺寸的显示

虽然一般的程序窗口都能拖边框来改变大小,pygame的默认显示窗口是不行的,而事实上,很多游戏确实也不能改变显示窗口的大小,我们可以使用一个参数来改变这个默认行为。

#coding=utf-8
'''
Created on 2017年2月27日

@author: zxt
'''
import pygame
from pygame.locals import RESIZABLE, QUIT, VIDEORESIZE
from sys import exit

background_image_filename = './images/sushiplate.jpg'

SCREEN_SIZE = (640, 480)

pygame.init()
# 标志位RESIZABLE    创建一个可以改变大小的窗口
screen = pygame.display.set_mode(SCREEN_SIZE, RESIZABLE, 32)
pygame.display.set_caption("Window resized to " + str(SCREEN_SIZE))

background = pygame.image.load(background_image_filename).convert()

while True:
    
    event = pygame.event.wait()
    if event.type == QUIT:
        exit()
    if event.type == VIDEORESIZE:
        SCREEN_SIZE = event.size
        screen == pygame.display.set_mode(SCREEN_SIZE, RESIZABLE, 32)
        pygame.display.set_caption("Window resized to " + str(event.size))
    
    screen_width, screen_height = SCREEN_SIZE
    # 这里需要重新填充满窗口
    for y in range(0, screen_height, background.get_height()):
        for x in range(0, screen_width, background.get_width()):
            screen.blit(background, (x, y))
    
    pygame.display.update()

当你更改大小的时候,后端控制台会显示出新的尺寸,这里我们学习到一个新的事件VIDEORESIZE,它包含如下内容:

  • size  —  一个二维元组,值为更改后的窗口尺寸,size[0]为宽,size[1]为高
  • w  —  宽
  • h  —  一目了然,高;之所以多出这两个,无非是为了方便

其他、复合模式

我们还有一些其他的显示模式,但未必所有的操作系统都支持(放心windows、各种比较流行的Linux发行版都是没问题的),一般来说窗口就用0全屏就用FULLSCREEN,这两个总是OK的。

如果你想创建一个硬件显示(surface会存放在显存里,从而有着更高的速度),你必须和全屏一起使用:

screen = pygame.display.set_mode(SCREEN_SIZE, HWSURFACE | FULLSCREEN, 32)

当然你完全可以把双缓冲(更快)DOUBLEBUF也加上,这就是一个很棒的游戏显示了,不过记得你要使用pygame.display.flip()来刷新显示。pygame.display.update()是将数据画到前面显示,而这个是交替显示的意思。

稍微说一下双缓冲的意思,可以做一个比喻:我的任务就是出黑板报,如果只有一块黑板,那我得不停的写,全部写完了稍微Show一下就要擦掉重写,这样一来别人看的基本都是我在写黑板报的过程,看到的都是不完整的黑板报;如果我有两块黑板,那么可以挂一块给别人看,我自己在底下写另一块,写好了把原来的换下来换上新的,这样一来别人基本总是看到完整的内容了。双缓冲就是这样维护两个显示区域,快速的往屏幕上换内容,而不是每次都慢慢地重画。

还有OPENGL模式,这是一个得到广泛应用的3D加速显示模式。不过一旦使用了这个模式,pygame中的2D图像函数就不能用了。

展开阅读全文

没有更多推荐了,返回首页