python中pygame.display.set_mode_pygame-游戏开发学习笔记(四)–pygame.display.set_mode()显示的问题...

pygame.display.set_mode(xxx)就是创建一个游戏窗口,也就是显示的意思。好的画面意义不言而。就连超级玛丽其实也很美丽的。

全屏显示

把第二个参数设置为FULLSCREEN时,就能得到一个全屏窗口了

screen = pygame.display.set_mode((640, 480), FULLSCREEN, 32)

注意:如果你的程序有什么问题,很可能进入了全屏模式就不太容易退出来了,所以最好先用窗口模式调试好,再改为全屏模式。(我就出不来过。可以用win键试一下)

在全屏模式下,显卡可能就切换了一种模式,你可以用如下代码获得您的机器支持的显示模式:

Python

import pygame

pygame.init()

pygame.display.list_modes()

如:

>>> pygame.display.list_modes()

[(1920, 1080), (1680, 1050), (1440, 900), (1360, 768), (1280, 1024), (1280, 720), (1024, 768), (800, 600), (720, 576), (720, 480), (640, 480)]

1

2

3

4

5

6

importpygame

pygame.init()

pygame.display.list_modes()

如:

>>>pygame.display.list_modes()

[(1920,1080),(1680,1050),(1440,900),(1360,768),(1280,1024),(1280,720),(1024,768),(800,600),(720,576),(720,480),(640,480)]

看一下一个实例:

Python

#coding:utf-8

background_image_filename = '1.1.jpg'

import pygame

from pygame.locals import *

from sys import exit

pygame.init()

screen = pygame.display.set_mode((1280,800), 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:

screen = pygame.display.set_mode((1280,800), FULLSCREEN, 32)

else:

screen = pygame.display.set_mode((1280,800), 0, 32)

screen.blit(background, (0,0))

pygame.display.update()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

#coding:utf-8

background_image_filename='1.1.jpg'

importpygame

frompygame.localsimport*

fromsysimportexit

pygame.init()

screen=pygame.display.set_mode((1280,800),0,32)

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

Fullscreen=False

whileTrue:

foreventinpygame.event.get():

ifevent.type==QUIT:

exit()

ifevent.type==KEYDOWN:

ifevent.key==K_f:

Fullscreen=notFullscreen

ifFullscreen:

screen=pygame.display.set_mode((1280,800),FULLSCREEN,32)

else:

screen=pygame.display.set_mode((1280,800),0,32)

screen.blit(background,(0,0))

pygame.display.update()

运行这个程序,默认还是窗口的,按“f ”,显示模式会在窗口和全屏之间切换。程序也没有什么难度,应该都能看明白。

可变尺寸的显示

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

Python

#coding:utf-8

background_image_filename = '1.1.jpg'

import pygame

from pygame.locals import *

from sys import exit

SCREEN_SIZE = (1280,800)

pygame.init()

screen = pygame.display.set_mode(SCREEN_SIZE, RESIZABLE, 32)

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()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

#coding:utf-8

background_image_filename='1.1.jpg'

importpygame

frompygame.localsimport*

fromsysimportexit

SCREEN_SIZE=(1280,800)

pygame.init()

screen=pygame.display.set_mode(SCREEN_SIZE,RESIZABLE,32)

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

whileTrue:

event=pygame.event.wait()

ifevent.type==QUIT:

exit()

ifevent.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

# 这里需要重新填满窗口

foryinrange(0,screen_height,background.get_height()):

forxinrange(0,screen_width,background.get_width()):

screen.blit(background,(x,y))

pygame.display.update()

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

size  —  一个二维元组,值为更改后的窗口尺寸,size[0]为宽,size[1]为高

w  —  宽

h  —  一目了然,高;之所以多出这两个,无非是为了方便

注意:在我的Windows 7 64bit上运行的时候,一改变窗口大小就非法退出;在Linux机器上很正常,应该是系统的兼容性问题(Pygame还只支持32位),不过想来平时都不会更改游戏窗口大小,问题不大。

至于无边框的窗口等,看一看本教程的第一篇就能知道了,不再赘述。

其他、复合模式

我们还有一些其他的显示模式,但未必所有的操作系统都支持(放心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图像函数就不能用了,我们会在以后讲详细的内容。

这次的东西不是很多,基本就是讲了一个显示参数,如果基础比较好,一看就明白了。不过还是建议实际的输入写一下巩固认识。下一回讲字体模块(游戏没图可以,没字咋整?)

你可能感兴趣的:(python中pygame.display.set_mode_pygame-游戏开发学习笔记(四)–pygame.display.set_mode()显示的问题...)