python 3.x--pygame&numpy

堅持,不是說,不能有中斷,而是現在仍在做

正在學習一些數據分析有關的統計學及相關庫知識,以爲需要有點儲備知識才能更好的應用,所以下週繼續學習,然後實踐

本週嘗試pygame遊戲編程,有些思路和之前tkinter類似,pygame、tkinter都是Python最常用的遊戲編程

一、安裝pygame

1、介紹
pygame基於SDL(Simple DirectMedia Layer,建議直控媒體層)。SDL是一套C語言架構,可用於多種包括win、linux、mac OS X操作系統,可訪問圖形、聲音、鍵盤及其他輸入設備實現遊戲

2、下載安裝

根據操作系統,選擇pygame安裝方式

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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章