Python遊戲編程筆記_BGDwPaP_0302

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章