本文中的程序來源於《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()