本文中的程序来源于《Beginning Game Development with Python and Pygame》一书第70页,注释部分为PosPro原创(PosPro正在尝试通过注释来理解程序和进行教学),本程序的设计目标是建立一个(没有滑动条的)窗口,窗口中的文本显示所有接受到的事件(如鼠标移动、键盘输入等),可以直观地给出关于Event的全部信息。
对于pygame中具体函数的定义,可以参考在线文档:http://www.pygame.org/docs/
#-*- coding=utf-8 -*-
# 若无上句,即便是在注释中有中文,也会报错,且这一句必须放在第一句!!
#本程序来源于《Beginning Game Development with Python and Pygame》 P70
#注释 by PosPro
#### 程序目标:####
#建立一个窗口,窗口以一屏面积显示所有接受到的事件:鼠标移动、键盘输入等
#可以发现鼠标将提供相当丰富(啰嗦)的信息,若只需要位置信息还是用pygame.mouse_get_pos()比较好
#
#### 程序框架:####
#1 引入所需模块
#2 初始化
#3 字体设置
#4 一个循环构成程序核心
#** 收集所有产生的event
#** 若累计的信息超过一屏所能显示的范围,则去除较早的event信息
#** 设置退出条件
#** 利用Surface对象对屏幕进行绘制
### 代码重复部分未做详细注释,详情可参考前一篇博客
#1 引入所需模块
import pygame
from pygame.locals import *
from sys import exit
#2 初始化
pygame.init()
SCREEN_SIZE=(800,600)
screen=pygame.display.set_mode(SCREEN_SIZE,0,32)
#通过一个元组tuple定义了屏幕尺寸,而且这个元组可能很方便地在后面被调用
#3 字体设置
font=pygame.font.SysFont("arial",16)
font_height=font.get_linesize()
MAX_LINES=SCREEN_SIZE[1]/font_height
event_text=[]
### 通过pygame.font.SysFont()设置字体(并得到一个返回值)
### 获取字体高度(也即行高度)
### MAX_LINES是一屏最多显示的行数,多出的部分将被忽略
#4 一个循环构成程序核心
while True:
#** 收集所有产生的event
event=pygame.event.wait()
event_text.append(str(event))
### 程序停滞,等待新event产生,event产生后即把事件信息保存在list:event_text中
#** 若累计的信息超过一屏所能显示的范围,则去除较早的event信息
event_text=event_text[-MAX_LINES:]
###如果一屏最多显示20行,则只有在list中最后20个event信息有机会显示
###[-20:]就是截取倒数20个至最后一个event信息
###方法很巧妙,注意冒号不能丢
###### 书中原句为:########
### event_text=event_text[-SCREEN_SIZE[1]/font_height:]
### 虽然巧妙,却造成理解上的困难
### 本着 “直观就是美”的原则,我将此句拆成两句
### MAX_LINES=SCREEN_SIZE[1]/font_height 并放在循环体之外
### event_text=event_text[-MAX_LINES:]
### 采用这种方式MAX_LINES设置后就无法改变,不适合窗口大小可变的情况
##########################
### 对于不易理解的部分,可以考虑打印至txt文件,然后仔细分析
#** 设置退出条件
if event.type==QUIT:
exit()
#** 利用Surface对象对屏幕进行绘制
screen.fill((0,0,0)) #设成黑底色,下面设字体为绿色——Matrix的既视感
y=SCREEN_SIZE[1]-font_height #最靠近窗口底边的那一行起始位置
for text in reversed(event_text):
screen.blit(font.render(text, True, (0,255,0)),(0,y))
y-=font_height #窗口左上角作为左边原点,向下向右为增大方向
###因为y的起始值是最靠近底边那一行的位置,所以要从list中最后一条记录开始写
###render()函数的用法:
###render(text, antialias, color, background=None) -> Surface
###pygame无法把字符直接写在某个Surface上,只能通过先通过render产生一个Surface
###在通过blit涂抹到对应位置
###第一个参数:字符串,只能有一行,换行符将被忽略
###第二个参数:是否柔化字体边沿
###三四参数分别为字体颜色和底色
###font.render中的这个font是指在前文中,自己定义的那个font(即"16号Arial")
pygame.display.update()