堅持,不是說,不能有中斷,而是現在仍在做
正在學習一些數據分析有關的統計學及相關庫知識,以爲需要有點儲備知識才能更好的應用,所以下週繼續學習,然後實踐
本週嘗試pygame遊戲編程,有些思路和之前tkinter類似,pygame、tkinter都是Python最常用的遊戲編程
一、安裝pygame
1、介紹
pygame基於SDL(Simple DirectMedia Layer,建議直控媒體層)。SDL是一套C語言架構,可用於多種包括win、linux、mac OS X操作系統,可訪問圖形、聲音、鍵盤及其他輸入設備實現遊戲
2、下載安裝
根據操作系統,選擇pygame安裝方式
- linux,可在Debian軟件庫中找到相應版本
https://packages.qa.debian.org/p/pygame.html - Windows 可以根據Python版本,從pygame官網上下載合適的安裝包
http://www.pygame.org/download.shtml - mac也可以選擇在官網上下載安裝 http://www.pygame.org/download.shtml
3、Anaconda 安裝
我使用的是Anaconda,直接終端安裝,很方便
直接在終端輸入
pip install pygame
可完成安裝
二、簡單實踐
1、怎麼少得了 hello world
#導入模塊、常用的函數和常量
import pygame,sys
from pygame.locals import *
#初始化pygame,爲使用硬件做準備
pygame.init()
#創建一個500*500的窗口
screen = pygame.display.set_mode((500,500))
#設置窗口標題
pygame.display.set_caption("Hello world")
#遊戲主循環
while True:
sysFont = pygame.font.SysFont("None",19)
rendered = sysFont.render('hello world',0,(255,100,100))
screen.blit(rendered,(100,100))
for event in pygame.event.get():
#接收到退出事件則退出程序
if event.type ==QUIT:
pygame.quit()
sys.exit()
#刷新畫面
pygame.display.update()
結果
三、動畫
使用numpy 製作動畫對象
1、創建pygame的clock對象
clock = pygame.time.Clock()
說明:函數pygame.time.Clock()可以創建一個遊戲中的時鐘對象
2、載入圖像,圖片地址也可用絕對路徑表示,注意目錄與目錄間使用雙斜槓\
img = pygame.image.load('2.jpg')
3、定義一些數組儲存動畫中的圖片位置座標,讓對象在上下左右方向進行移動,產生動畫效果,每一個方向上有40個等距步長,上下左右的值全部初始化爲零
steps = np.linspace(20,360,40).astype(int)
right = np.zeros((2,len(steps)))
down = np.zeros((2,len(steps)))
left = np.zeros((2,len(steps)))
up = np.zeros((2,len(steps)))
4、設置圖片的位置座標,[::-1]可獲得倒序的數組元素
right[0] = steps
right[1] = 20
down[0] = 360
down[1] =steps
left[0] = steps[::-1]
left[1] = 360
up[0] = 20
up[1] = steps[::-1]
5、將四個方向的路徑連接起來,動畫產生連貫,需要使用T對數組進行轉置,使得四個方向以正確的方式對齊
pos = np.concatenate((right.T,down.T,left.T,up.T))
6、實現:
7、完整代碼
#numpy製作動畫
import pygame,sys
from pygame.locals import *
import numpy as np
pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode((500,500))
pygame.display.set_caption("play numpy")
img = pygame.image.load('2.jpg')
steps = np.linspace(20,360,40).astype(int)
right = np.zeros((2,len(steps)))
down = np.zeros((2,len(steps)))
left = np.zeros((2,len(steps)))
up = np.zeros((2,len(steps)))
right[0] = steps
right[1] = 20
down[0] = 360
down[1] =steps
left[0] = steps[::-1]
left[1] = 360
up[0] = 20
up[1] = steps[::-1]
pos = np.concatenate((right.T,down.T,left.T,up.T))
i = 0
#遊戲主循環
while True:
#清屏
screen.fill((255,255,255))
if i >= len(pos):
i = 0
screen.blit(img, pos[i])
i += 1
for event in pygame.event.get():
#接收到退出事件則退出程序
if event.type ==QUIT:
pygame.quit()
sys.exit()
#刷新畫面
pygame.display.update()
#函數設置時鐘週期,30幀/s
clock.tick(30)
四、pygame與tkinter
1、Tkinter
主要是進行GUI的繪製,畫面繪製要通過創建窗口,Tk.canvas進行繪圖,另外,tk窗口只能載入動圖
其中tkinter的主循環比較簡單,不過顯示畫面需要再通過mainloop主循環,讓窗口進入事件循環,即如果不執行mainloop循環,Tkinter窗口會關閉
相比pygame,tkinter中必不可少mainloop函數,mainloop循環主要功能即:讓窗口進入事件處理的循環和Tkinter窗口生命週期的控制
2、pygame
pygame的主循環比較有意思,它的事件處理主要通過事件隊列進行事件處理
下面是第一個helloworld的主循環,while整體是一個死循環,在死循環中通過update函數進行不斷的跟新畫面,並且在獲取事件時,通過for循環遍歷事件隊列,這裏使用了get函數,除此之外還有wait函數,wait會有等待時間,有卡頓,二者具體區分還不太清楚
因此,pygame顯示畫面主要通過while死循環進行進行畫面更新與事件處理
#遊戲主循環
while True:
sysFont = pygame.font.SysFont("None",19)
rendered = sysFont.render('hello world',0,(255,100,100))
screen.blit(rendered,(100,100))
for event in pygame.event.get():
#接收到退出事件則退出程序
if event.type ==QUIT:
pygame.quit()
sys.exit()
#刷新畫面
pygame.display.update()