天天看點

《八貓關聯初體驗》_來自遊戲海龜子產品的問候

《八貓關聯初體驗》是用Python的遊戲海龜子產品制作的一個小程式。

在這個作品中使用了遊戲海龜子產品!英文名是gameturtle,話說什麼是遊戲海龜子產品呢?原來,這個子產品是一個“秘密”的子產品。是筆者全新開發的一個用于制作遊戲的子產品。它支援像素級碰撞檢測,使用簡單,主要配合tkinter子產品來開發制作有趣的遊戲。

這個子產品在《Python海龜寶典》下冊原理篇中有詳細的使用說明。如果你讀懂了《Python海龜寶典》下冊原理篇,那麼就能自己開發一個gameturtle子產品了。

《八貓關聯初體驗》_來自遊戲海龜子產品的問候

讀者可能又會問《Python海龜寶典》又是什麼?《Python海龜寶典》也是筆者編寫的。它分為上下兩冊,上冊是超過200例的用原生的turtle子產品制作的各種小案例,如動畫,小遊戲,繪畫藝術等。

《八貓關聯初體驗》_來自遊戲海龜子產品的問候

下冊則深入剖析了turtle子產品内部,并且推出了自己的一個叫gameturtle的子產品。隻要你順着作者的思路,相信你也能成為Python創意程式設計大師。

《八貓關聯初體驗》_來自遊戲海龜子產品的問候

我們這裡講的《八貓關聯初體驗》這個作品,

就是用gameturtle子產品編寫的。如果你的電腦沒有安裝gameturtle子產品,是無法運作的。可喜的是,這個子產品的源代碼已經開源。任何人都能安裝下載下傳它,檢視并閱讀它的源代碼以便學習。安裝它很簡單,用cmd打開管理者視窗,然後輸入 pip install gameturtle 即可。

《八貓關聯初體驗》_來自遊戲海龜子產品的問候

在gameturtle子產品中,定義了一個叫GameTurtle的類,别名叫Sprite。使用Sprite類至少要帶上畫布參數,是以要建視窗和畫布。

下面是一個簡單的示例代碼。

from gameturtle import *

root = Tk()
cv =Canvas(width=480,height=360)
cv.pack()

a = Sprite(cv)
      

程式最後一句沒有寫root.mainloop()這行代碼,是以還可以直接在IDLE Shell中輸入測試代碼。

讀者可以輸入a.fd(100,a.forward(100),a.bk(100,a.rt(90),a.lt(90)等進行測試。這些和turtle子產品基本一緻。

不過最大不同是坐标系的不同。是以如果輸入a.distance(100,100),傳回的是161.24515496597098時不要驚訝。

《八貓關聯初體驗》_來自遊戲海龜子產品的問候

tkinter canvas coordinate system

因為tkinter畫布坐标系以左上角為原點,而海龜誕生時預設在畫布中央,是以這個時候它的坐标并不是(0,0)。在本例中,由于畫布寬度是480,高度是360,是以海龜的坐标是(240,180)。

可能有人會問,上面的程式并沒有導入tkinter子產品的Tk和Canvas指令,但在程式中卻可以直接使用,這是怎麼回事呢?

這是由于在gameturtle子產品中已經導入了!而在本程式第一行代碼又是使用了*号,是以它會一股腦兒把所有在gameturtle曾經導入過的指令都導進來。

更好的辦法是寫from gameturtle import Sprite。這個時候,讀者就要手工導入Tk和Canvas這兩個指令(類)了。

為了顯示多幀動畫,下面的程式告訴了你,如何給Sprite指令傳遞多幀圖像,進而生成具有多幀造型角色。

《八貓關聯初體驗》_來自遊戲海龜子產品的問候

python multi frame costumes

首先,有一個叫res的檔案夾,它下面存儲了從0.png到15.png的圖像。

然後我們要把它們的相對路徑(程式和res目錄同一個檔案夾)全部加載進來,用下面的代碼:

frames = [f"res/{i}.png" for i in range(16)]
           

這是一行清單推導式,運作它就能把圖像的相對路徑全部放在清單中。

接着,用Image.open打開每張圖(在gameturtle已經導入的pillow子產品)。

代碼就像下面這樣:

ims = [Image.open(im) for im in frames]
           

由于我們要建8個角色,并且把它們全部放在cats清單中,是以用下面的代碼:

cats = [Sprite(cvs[i],ims) for i in range(8)]      

在Sprite類中,第一個參數是畫布,其它參數的名字依次是:

frames,pos,visible,heading=0,tag。

frames表示造型幀圖,可以傳遞一個圖形,也能傳遞一個清單或元組。這些圖形要是pillow子產品中的圖形對象。也就是要用Image.open或者Image.new或者Image.fromarray這幾個指令加載的圖表對象。

pos參數表示坐标,visible參數表示可見性,heading參數表示預設的方向。

tag參數表示角色的标簽,這是為了便于分組。

最後為了讓每隻貓不斷地原地踏步,讓它們在無限循環中不斷切換造型即可。

所有代碼示例如下所示:

"""
八貓關聯初體驗.py
這個程式使用gameturtle子產品,生成8塊畫布,在每塊畫布上生成一隻小貓。

"""
try:
    from gameturtle import *
except:
    import subprocess
    p = subprocess.Popen(["pip","install","gameturtle"],shell=True)
    from tkinter import messagebox
    t ='風火輪程式設計提示:'
    p = '''沒有找到gameturtle子產品,程式無法運作。\n
程式會自動進行安裝,如果重新啟動程式後還無法運作。\n
請手動安裝gameturtle子產品,方法:\n用cmd指令打開管理者視窗,\n然後輸入pip install gameturtle\n
如果還是不知道操作,請加李興球微信pythonxia提供技術支援。\n
gameturtle子產品詳細說明,請見《Python海龜寶典》下冊原理篇。'''
    messagebox.showwarning(t,p)

root = Tk()
root.title('八貓關聯初體驗by李興球')
colors = ['red','orange','yellow','green',
          'cyan','blue','purple','pink']

cvs = []
for counter in range(len(colors)):
    i = counter // 4                                     # 行号
    j = counter % 4                                      # 列号
    cv = Canvas(width=120,height=120,bg=colors[counter]) # 建畫布
    cv.grid(row=i,column=j)                              # 布局  
    cvs.append(cv)                                       # 放表中
    

frames = [f"res/{i}.png" for i in range(16)]   # 貓的每幀造型圖
ims = [Image.open(im) for im in frames]        # 用Image.open加載到記憶體
cats = [Sprite(cvs[i],ims) for i in range(8)]  # 生成8個角色
[cat.setrotmode(1) for cat in cats[4:] ]       # 後4個設定旋轉模式為左右翻轉
[cat.right(180) for cat in cats[4:] ]          # 後4個向後轉

while True:
    [c.nextshape() for c in cats ]             # 每隻貓切換造型         
    root.update()                              # 更新顯示
    time.sleep(0.01)                           # 等待0.01秒
           

需要本程式所有源代碼和素材,請關注公衆号:李興球Python,回複8catrun,即可得到下載下傳網址。

繼續閱讀