设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 21543|回复: 2
打印 上一主题 下一主题

【Pygame 第2课】 游戏的本质

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
楼主
发表于 2013-8-16 22:15:22 |显示全部楼层 |倒序浏览
你小时候有没有玩过这样一种玩具:一块硬纸,一面画着一只鸟,一面画着一个笼子。硬纸下粘上一根细棒。用手来回转动细棒,让硬纸的两面快速交替出现,就会看见鸟被关在了笼子里。

这种现象被称为视觉暂留,又称余晖效应。人眼的性质使得光信号在进入之后,会保持一小段时间,这段时间大约是0.1~0.4秒。电影、动画便是利用这种现象得以实现,把一幅幅静态画面快速连续播放,形成看上去连续的活动画面。游戏也不例外。

回顾一下昨天的代码,你会注意到有一个while True的循环,注释为“游戏主循环”。这就是游戏的主体部分。每次循环都相当于是一张静态的画面,程序一直运行,画面就有了动态的效果。这个程序中还看不出,因为始终只有一张固定不动的背景图片。

与动画不同,游戏中不仅要把一幅幅画面播放出来,还需要处理玩家的操作与游戏中内容的交互。所以在这个while循环中,还要去接收玩家的输入,以及处理游戏中的各种逻辑判断、运动、碰撞等等。

在我们程序的主循环里,做了对退出事件的响应:
  1. for event in pygame.event.get():
  2.     if event.type == pygame.QUIT:
  3.         #接收到退出事件后退出程序
  4.         pygame.quit()
  5.         exit()
复制代码
然后把图像绘制到窗口中:
  1. screen.blit(background, (0,0))
复制代码
最后,把整个窗口画面更新:
  1. pygame.display.update()
复制代码
如果你看过泥土动画,那么就可以把整个游戏过程想象成拍摄泥土动画的过程:每一次,screen.blit()相当于去把人偶、布景移动一点点位置,pygame.display.update()则是按下快门拍下一帧新的画面。而if event.type == pygame.QUIT:就是在判断,导演是不是喊停收工了。这一切都由计算机在很短的时间内处理,以至于玩家感觉是连贯的。

尽管我们只是从简单的游戏做起,但在本质上,绝大多数的游戏都是相通的。

有些大型3D游戏需要在一次循环内做很多事情,需要进行复杂的物理运算、计算光线的照射效果、处理大量电脑角色的智能、网络信息通讯等。在配置不高的电脑上,这些计算花费的时间就多,游戏刷新画面的频率就变慢了。这也就是我们常听说“一个游戏的帧率低”的原因,这种时候你就会感到游戏不流畅。

#==== Crossin的编程教室 ====#
微信ID:crossincode
论坛:http://crossin.me
QQ群:312723402

面向零基础初学者的编程课
每天5分钟,轻松学编程



#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2016-6-5 11:47:15 |显示全部楼层
kuaikemai 发表于 2016-6-5 11:21
老师,我这里不太懂:
    screen.blit(background,(0,0))
    pygame.display.update()

游戏主循环是while,那个for循环只是用来处理事件响应列表的。你这个放在for里面没有意义啊,如果一帧里同时触发了好几个事件,那这个就会执行多次,虽然效果上一样,但是降低了效率。如果没有发生事件,那就会执行不到

for循环完成和while循环完成也是不相关的,每次while里都会执行一遍for循环,只要while不退出,程序就不结束
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

板凳
发表于 2017-3-5 17:07:49 |显示全部楼层
brahmagupta 发表于 2017-3-5 14:16
好吧 也有pygame.draw。

不过一般游戏开发不太用 draw,大多数选择框架提供的贴图方法
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-5-5 11:49 , Processed in 0.027305 second(s), 26 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部