【2】【MOOC】Python游戏开发入门-北京理工大学【第三部分-游戏开发之机制(屏幕绘制机制)】

学习地址链接:http://www.icourse163.org/course/0809BIT021E-1001873001?utm_campaign=share&utm_medium=androidShare&utm_source=qq

 

备注:我开始在运行壁球游戏(全屏型)代码时,出现壁球超出屏幕范围外的问题,然后在 设置->显示 里,更改文本、应用和其他项目的大小,改为100%就正常了:)

 

Pygame屏幕绘制机制

1.Pygame屏幕绘制机制简介

屏幕控制:
pygame.display

用来控制Pygame游戏的屏幕
pygame有且只有一个屏幕
屏幕左上角为(0,0)
以像素为单位
-----------------------------------------------
屏幕控制需求:
游戏全屏
游戏屏幕大小可调节
游戏屏幕无边框
更改游戏标题栏内容
更改游戏图标......
-----------------------------------------------
屏幕控制的重要函数:
屏幕尺寸和模式:
pygame.display.set_mode()
pygame.display.Info()
窗口标题和图标:
pygame.display.set_caption()
pygame.display.set_icon()
pygame.display.get_caption()
窗口感知和刷新:
pygame.display.get_active()
pygame.display.flip()
pygame.display.update()
-----------------------------------------------
OpenGL和硬件加速:(略)
pygame.display

可以采用OpenGL支持显示
可以采用硬件加速显示
绘制加速将带来更流畅的运行效果

===================================================================================

2.Pygame屏幕尺寸和模式设置

屏幕模式函数:
pygame.display.set_mode(r=(0,0),flags=0)

r是游戏屏幕的分辨率,采用(width, height)方式输入
flags用来控制显示类型,可用|组合使用,常用显示标签如下:
pygame.RESIZABLE 窗口大小可调
pygame.NOFRAME 窗口没有边界显示
pygame.FULLSCREEN 窗口全屏显示
注意:每种显示方式要配合相应的处理机制


屏幕设置为大小可调:
注意:大小可调时要有尺寸变化的响应
对扩张显示界面的刷新
对扩张/缩小显示界面的游戏响应

屏幕设置为无边框:
注意:无边框时要增加其他退出方式

屏幕设置为全屏:
注意:全屏时要考虑系统分辨率,否则将会按照用户设定被拉伸
-------------------------------------------------------------
屏幕信息函数:

pygame.display.Info()
产生一个显示信息对象VideoInfo,表达当前屏幕的参数信息
在.set_mode()之前调用,则显示当前 系统显示参数信息
参数很多,其中有两个十分重要,如下:
(1)current_w:当前显示模式或窗口的像素 宽度
(2)current_h:当前显示模式或窗口的像素 高度


(1)壁球小游戏(全屏型)
注意:采用系统分辨率进行全屏
源代码:
 1 # 壁球小游戏(全屏型)
 2 import pygame,sys
 3  
 4 pygame.init()
 5 vInfo = pygame.display.Info()   #窗口全屏显示
 6 size = width, height = vInfo.current_w, vInfo.current_h
 7 speed = [1,1]
 8 BLACK = 0, 0, 0
 9 #print(pygame.display.Info())
10 #screen = pygame.display.set_mode(size, pygame.RESIZABLE)  #窗口大小可调
11 #screen = pygame.display.set_mode(size, pygame.NOFRAME)  #窗口无边框
12 screen = pygame.display.set_mode(size, pygame.FULLSCREEN)  #窗口全屏显示
13  
14 pygame.display.set_caption("Pygame壁球")
15 ball = pygame.image.load("PYG02-ball.gif")
16 ballrect = ball.get_rect()
17 fps = 300
18 fclock = pygame.time.Clock()
19  
20 while True:
21     for event in pygame.event.get():
22         if event.type == pygame.QUIT:
23             sys.exit()
24         elif event.type == pygame.KEYDOWN:
25             if event.key == pygame.K_LEFT:
26                 speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0]) - 1)*int(speed[0]/abs(speed[0]))
27             elif event.key == pygame.K_RIGHT:
28                 speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
29             elif event.key == pygame.K_UP:
30                 speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
31             elif event.key == pygame.K_DOWN:
32                 speed[1] = speed[1] if speed[1] == 0 else (abs(speed[1]) - 1)*int(speed[1]/abs(speed[1]))
33             elif event.key == pygame.K_ESCAPE:
34                 sys.exit()
35     ballrect = ballrect.move(speed)
36     if ballrect.left < 0 or ballrect.right > width:
37         speed[0] = - speed[0]
38     if ballrect.top < 0 or ballrect.bottom > height:
39         speed[1] = - speed[1]
40  
41     screen.fill(BLACK)
42     screen.blit(ball, ballrect)
43     pygame.display.update()
44     fclock.tick(fps)
壁球小游戏(全屏型)


(2)壁球小游戏(伸缩型)

Pygame.VIDEORESIZE
这是一种窗口大小更改的事件
事件发生后,返回event.size元组,包含新窗口的宽度和高度
.size[0]宽度,也可以用event.w
.size[1]高度,也可以用event.h
返回参数仅在事件发生时有用
源代码:
 1 # 壁球小游戏(伸缩型)
 2 import pygame,sys
 3  
 4 pygame.init()
 5 size = width, height = 600, 400
 6 speed = [1,1]
 7 BLACK = 0, 0, 0
 8 screen = pygame.display.set_mode(size, pygame.RESIZABLE)  #窗口大小可调
 9 #screen = pygame.display.set_mode(size, pygame.NOFRAME)  #窗口无边框
10 #screen = pygame.display.set_mode(size, pygame.FULLSCREEN)  #窗口全屏显示
11  
12 pygame.display.set_caption("Pygame壁球")
13 ball = pygame.image.load("PYG02-ball.gif")
14 ballrect = ball.get_rect()
15 fps = 300
16 fclock = pygame.time.Clock()
17  
18 while True:
19     for event in pygame.event.get():
20         if event.type == pygame.QUIT:
21             sys.exit()
22         elif event.type == pygame.KEYDOWN:
23             if event.key == pygame.K_LEFT:
24                 speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0]) - 1)*int(speed[0]/abs(speed[0]))
25             elif event.key == pygame.K_RIGHT:
26                 speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
27             elif event.key == pygame.K_UP:
28                 speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
29             elif event.key == pygame.K_DOWN:
30                 speed[1] = speed[1] if speed[1] == 0 else (abs(speed[1]) - 1)*int(speed[1]/abs(speed[1]))
31             elif event.key == pygame.K_ESCAPE:
32                 sys.exit()
33         elif event.type == pygame.VIDEORESIZE:
34             size = width, height = event.size[0], event.size[1]
35             screen = pygame.display.set_mode(size, pygame.RESIZABLE)
36     ballrect = ballrect.move(speed)
37     if ballrect.left < 0 or ballrect.right > width:
38         speed[0] = - speed[0]
39     if ballrect.top < 0 or ballrect.bottom > height:
40         speed[1] = - speed[1]
41  
42     screen.fill(BLACK)
43     screen.blit(ball, ballrect)
44     pygame.display.update()
45     fclock.tick(fps)
壁球小游戏(伸缩型)

===================================================================================

3.Pygame窗口标题和图标设置

pygame.display.set_caption(title, icontitle=None)
title设置窗口的标题内容
icontitle设置图表化后的小标题
小标题可选,部分系统没有


pygame.display.get_caption()
返回当前设置窗口的标题及小标题内容
返回结构为(title,icontitle)
该函数与游戏交互逻辑配合,可以根据游戏情节修改标题内容


pygame.display.set_icon(surface)
设置窗口的图标效果
图标是一个Surface对象
在下述链接中下载图标图片:
https://python123.io/PY15/PYG03-flower.png
https://python123.io/PY15/PYG03-withered-flower.png

源代码:
 1 # 壁球小游戏(图标型)
 2 import pygame,sys
 3  
 4 pygame.init()
 5 size = width, height = 600, 400
 6 speed = [1,1]
 7 BLACK = 0, 0, 0
 8 screen = pygame.display.set_mode(size, pygame.RESIZABLE)  #窗口大小可调
 9  
10 icon = pygame.image.load("PYG03-flower.png")
11 pygame.display.set_icon(icon)
12 pygame.display.set_caption("Pygame壁球")
13 ball = pygame.image.load("PYG02-ball.gif")
14 ballrect = ball.get_rect()
15 fps = 300
16 fclock = pygame.time.Clock()
17  
18 while True:
19     for event in pygame.event.get():
20         if event.type == pygame.QUIT:
21             sys.exit()
22         elif event.type == pygame.KEYDOWN:
23             if event.key == pygame.K_LEFT:
24                 speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0]) - 1)*int(speed[0]/abs(speed[0]))
25             elif event.key == pygame.K_RIGHT:
26                 speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
27             elif event.key == pygame.K_UP:
28                 speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
29             elif event.key == pygame.K_DOWN:
30                 speed[1] = speed[1] if speed[1] == 0 else (abs(speed[1]) - 1)*int(speed[1]/abs(speed[1]))
31             elif event.key == pygame.K_ESCAPE:
32                 sys.exit()
33         elif event.type == pygame.VIDEORESIZE:
34             size = width, height = event.size[0], event.size[1]
35             screen = pygame.display.set_mode(size, pygame.RESIZABLE)
36     ballrect = ballrect.move(speed)
37     if ballrect.left < 0 or ballrect.right > width:
38         speed[0] = - speed[0]
39     if ballrect.top < 0 or ballrect.bottom > height:
40         speed[1] = - speed[1]
41  
42     screen.fill(BLACK)
43     screen.blit(ball, ballrect)
44     pygame.display.update()
45     fclock.tick(fps)
壁球小游戏(图标型)

===================================================================================

4.Pygame窗口感知和刷新运用

屏幕控制的重要函数:

pygame.display.get_active()
当窗口在系统中显示(屏幕绘制/非图标化)时返回True,否则返回False
该函数可以用来判断是否游戏窗口被最小化
进一步,判断后可以暂停游戏,改变响应模式等

pygame.display.flip()
重新绘制整个窗口

pygame.display.update()
仅重新绘制窗口中有变化的区域,相比.flip()执行更快


源代码:
 1 # 壁球小游戏(感知型)
 2 import pygame,sys
 3  
 4 pygame.init()
 5 size = width, height = 600, 400
 6 speed = [1,1]
 7 BLACK = 0, 0, 0
 8 screen = pygame.display.set_mode(size, pygame.RESIZABLE)  #窗口大小可调
 9  
10 icon = pygame.image.load("PYG03-flower.png")
11 pygame.display.set_icon(icon)
12 pygame.display.set_caption("Pygame壁球")
13 ball = pygame.image.load("PYG02-ball.gif")
14 ballrect = ball.get_rect()
15 fps = 300
16 fclock = pygame.time.Clock()
17  
18 while True:
19     for event in pygame.event.get():
20         if event.type == pygame.QUIT:
21             sys.exit()
22         elif event.type == pygame.KEYDOWN:
23             if event.key == pygame.K_LEFT:
24                 speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0]) - 1)*int(speed[0]/abs(speed[0]))
25             elif event.key == pygame.K_RIGHT:
26                 speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
27             elif event.key == pygame.K_UP:
28                 speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
29             elif event.key == pygame.K_DOWN:
30                 speed[1] = speed[1] if speed[1] == 0 else (abs(speed[1]) - 1)*int(speed[1]/abs(speed[1]))
31             elif event.key == pygame.K_ESCAPE:
32                 sys.exit()
33         elif event.type == pygame.VIDEORESIZE:
34             size = width, height = event.size[0], event.size[1]
35             screen = pygame.display.set_mode(size, pygame.RESIZABLE)
36     if pygame.display.get_active():
37         ballrect = ballrect.move(speed)
38     if ballrect.left < 0 or ballrect.right > width:
39         speed[0] = - speed[0]
40     if ballrect.top < 0 or ballrect.bottom > height:
41         speed[1] = - speed[1]
42  
43     screen.fill(BLACK)
44     screen.blit(ball, ballrect)
45     pygame.display.update()
46     fclock.tick(fps)
壁球小游戏(感知型)

 



 
posted @ 2017-12-08 13:48  GraceSkyer  阅读(833)  评论(0编辑  收藏  举报

~~~~~~ACM大牛语录,激励一下~~~~~~

为了世界的和平,为了女生的安全,我拼命做题,做题,做题!

用最短的时间,刷最多的题!

给我一滴泪,我就看到了你全部的海洋!

seize the hour, seize the day.

人生难免有无奈,幸福走远了,或是感叹幸福来迟了.其实我一直相信,无论手中的幸福是多么微不足道的感觉,我会把握住那每一分,每一秒,当幸福依旧像那百鸟般飞逝,终究无法掌握时,我会感谢它,曾经降临过!

A自己的题,让别人郁闷去吧

WA肠中过,AC心中留 TLE耳边过,AC特别牛

天然的悲苦和伤逝,过去有过,以后还会有

^*^一步一步往上爬^*^

AC就像练级,比赛就像PK. 练级不如PK好玩

其实,世上本没有ACM,AC的人多了,也便有了!

AC无止尽~ Seek you forever~

找呀找呀找水题,找到一个AC一个呀!

AC是检验程序的唯一标准。

真的猛士,敢于直面惨淡的人生,敢于正视淋漓的鲜血……