设为首页收藏本站

Crossin的编程教室

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

【Pygame 第2课】 游戏的本质

[复制链接]

174

主题

45

好友

10万

积分

管理员

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
回复

使用道具 举报

0

主题

0

好友

558

积分

高级会员

Rank: 4

沙发
发表于 2014-9-20 16:12:45 |只看该作者
讲的通俗易懂,很令人明白。
学习,纯粹。
回复

使用道具 举报

0

主题

0

好友

34

积分

新手上路

Rank: 1

板凳
发表于 2014-11-24 10:35:23 |只看该作者
对头,很清晰
回复

使用道具 举报

0

主题

1

好友

273

积分

中级会员

Rank: 3Rank: 3

地板
发表于 2016-1-30 09:50:53 |只看该作者
讲得很好啊~~~
回复

使用道具 举报

0

主题

0

好友

14

积分

新手上路

Rank: 1

5#
发表于 2016-6-5 11:21:02 |只看该作者
老师,我这里不太懂:
    screen.blit(background,(0,0))
    pygame.display.update()
这两句放在while循环内 而在for之外。
那不是应该要在for循环完了之后才能做这两句吗?但是for循环完成不是要退出程序才能结束?

然后我自己试了下, 把这两句放在for循环内也是一样的结果。不太懂了
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

6#
发表于 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
回复

使用道具 举报

1

主题

0

好友

145

积分

注册会员

Rank: 2

7#
发表于 2017-3-5 14:03:12 |只看该作者
本帖最后由 brahmagupta 于 2017-3-5 14:24 编辑

笔记:
Blit:其意义是将一个平面的一部分或全部图象整块从这个平面复制到另一个平面(位块 传输)
和其他语言里的draw,plot什么的函数名还不太一样(效果一样,都是绘制图形)。

docs中的原文:
BLIT: Basically, blit means to copy graphics from one image to another. A more formal definition is to copy an array of data to a bitmapped array destination. You can think of blit as just "assigning" pixels. Much like setting values in our screen-list above, blitting assigns the color of pixels in our image.

以及screen的参数
Screen CoordinatesTo position an object on the screen, we need to tell the blit() function where to put the image. In pygame we always pass positions as an (X,Y) coordinate. This represents the number of pixels to the right, and the number of pixels down to place the image. The top-left corner of a Surface is coordinate (0, 0). Moving to the right a little would be (10, 0), and then moving down just as much would be (10, 10). When blitting, the position argument represents where the topleft corner of the source should be placed on the destination.
所以这个坐标值 应该是以左上角为像素原点
回复

使用道具 举报

1

主题

0

好友

145

积分

注册会员

Rank: 2

8#
发表于 2017-3-5 14:16:28 |只看该作者
好吧 也有pygame.draw。
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

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-4-25 20:46 , Processed in 0.026810 second(s), 23 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部