# PyGame小遊戲-馬保國的奇幻冒險 ==這是小弟的第一篇筆記,內容不夠完整,還請包涵(*^ー^)== # 1.啟發 ## 動機 <font size=3>每當看到遊戲,都會令我們的眼睛為之一亮,每個人的電腦或手機裡,或許都存有一款能夠消磨時間的遊戲,然而無論手機或是電腦遊戲,背後都是由一行行的程式碼組成。隨著科技的進步,現在遊戲的規模和精緻程度已經與以往有很大的差距,像是傳說對決、英雄聯盟、絕地求生、神魔之塔等遊戲。回到以前的經典遊戲 1942,縱然經過了很多年,仍然有許多玩家熱衷於這款遊戲,操控主角的戰機,一邊迴避敵人的子彈,一邊射擊攻擊敵人,這種軸射擊遊戲到了現在也有人設計加上一些改版,可以說是歷久不衰的經典遊戲。 於是,我們便抱著這份熱忱,著手設計了這款遊戲。 搜索資料後,發現 Pygame 是一種適合初學者的遊戲程式引擎,可以透過 Python 的語法撰寫遊戲。因此我們決定要用 Python 配合 Pygame ,再搭配馬保國在 YouTube 上的閃電五連鞭影片的內容,製作出一款彈幕遊戲。我們打算使用 Python 配合 Pygame 製作出一個打隕石的遊戲,目的為進一步熟練 Python 語法,了解 Python 如何應用,以及嘗試製作出一款遊戲。 </font><br> # 2.遊戲架構 ## 遊戲流程圖 ![](https://i.imgur.com/QmIyLg9.png) ## 遊戲內容 ==接下來會介紹我們的遊戲內容與畫面== ![](https://i.imgur.com/plxguDM.png) ▲遊戲進場畫面,字幕閃爍、用滑鼠點擊畫面可以產生粒子效果,按下空白鍵開始遊戲。 --- ![](https://i.imgur.com/tc3WrDA.png) ▲第一關畫面,玩家使用方向鍵控制戰機,在閃避的同時以空白鍵射擊隕石。 --- ![](https://i.imgur.com/f6xNofe.png) ▲第二關畫面,玩家使用方向鍵控制馬保國,在閃避的同時以閃電鞭攻擊隕石。 --- ![](https://i.imgur.com/W61wZ4f.png) ▲第三關畫面,玩家使用方向鍵控制戰機,無法攻擊隕石,須持續閃避直到航空母艦出現並降落。 --- ![](https://i.imgur.com/dcbOc4I.png) ▲結束畫面,會有煙火不斷釋放出來,以及迎接新年的字。 ## 程式 ==這裡將會介紹我們遊戲裡面較為困難的程式部份== ### <font size=4>效果</font><br> ![](https://i.imgur.com/aLJjOL7.png) 不論是進場畫面或是第二關角色的粒子效果,原理實際上是在視窗上畫會移動的圓形,利用二維陣列 (Two-dimensional list)儲存各個圖形的位置、速度、和圖形的半徑大小,然後再把所有圖形的陣列堆疊成一個三維陣列,用 for 迴圈個別移動並變換大小的數據,最後再把它顯示在視窗上,當圖形超出視窗外面,就會把它刪除。 ![](https://i.imgur.com/PSLEV8Y.png) --- ![](https://i.imgur.com/MatWbSe.png) 要判斷滑鼠是否有按下,由於 Pygame 只能判斷按下的和放開的那一刻,設定一個變數 left_clicking ,偵測到按下就指定為 True,偵測到放開就設定為 False,每當執行一次程式時,如果 left_clicking 為 True,就新增一項。 --- ![](https://i.imgur.com/UEjNpMh.png) 粒子效果分為本體和光芒,基本上原理都是一樣的,而且同一個圖形的位置和速度都是一樣的,所以不用另外設定陣列,但光芒本體的大小較大,顏色也不一樣,在Pygame 裡面,可以設定 special_flag 變數為 BLEND_RGB_ADD,產生顏色疊加的變化。 ### 繪製角色與物品 ![](https://i.imgur.com/hZBIP8z.png) 主角的子彈和敵機的子彈都是我們運用 Krita 這個繪圖軟體繪製, Krita 是一個功能非常廣的自由繪圖軟體,無論是筆刷的大小、透明度、顏色、圖層,還有裁剪功能,除了繪製單張的圖像,它也可以製作動畫。 ![](https://i.imgur.com/SvXonQB.png) ### 血條顯示 ![](https://i.imgur.com/QDP3SsD.png) 我們想要做一個動畫顯示的血條,需要一個白色外框,紅色是真實血量,黃色是動畫的血量。 ![](https://i.imgur.com/IprWxNx.png) health_ratio 是真實血量與所要呈現血量的比值,當主角受到傷害時,就把目標血量減掉傷害,如果目前血量小於或等於 0,主角就會死掉。反之,如果目前血量如果還沒達到目標血量,就把目前血量減掉血量變化速度,這樣看起來就會有動畫的效果。最後要呈現在螢幕上,用目標血量除以 health_ratio 就是紅色血條的長度,目前血量減掉目標血量再除以 health_ratio 就是黃色動畫血條的長度。 ### 碰撞判斷 在 Pygame 裡面,一般兩個物件的碰撞 (collision) 是以 Rectangle(長方形)判斷。 ![](https://i.imgur.com/cw6Ixs0.png) ==▲更改前的碰撞判斷程式== 但這種方式可能會產生一種問題,當兩個物件形狀並非長方形時,就會產生誤判,為了解決這個問題,我們查了很久的資料,發現可以使用遮罩 (mask) 作為判斷的依據,只要在判斷碰撞的程式後面加上一個變數 Pygame.sprite.collide_mask 就可以達到像素級別的判斷。 ![](https://i.imgur.com/0wlwYEd.png) ==▲長方形碰撞的示意圖== ![](https://i.imgur.com/XQPYnTT.png) ==▲更改後的碰撞判斷程式== # 3.未來展望 ▶加入更難以擊敗的敵人:目前敵人只要受到攻擊就會死亡,我們希望能增加不同難度 的敵人,增加遊戲難度。 ▶將網路圖片更換為自行繪製:遊戲中部份影像來自網路,期望日後能自行設計角色和背景,讓遊戲更具獨特性。 ▶讓地圖更有互動性:遊戲中的背景是固定的,讓背景可以轉換或有特殊作用,增加遊戲互動性。 ▶加入不同的道具,豐富遊戲性:遊戲中沒有增益道具,設計一些道具,讓遊戲玩法更豐富。 ▶製作 Apk,方便以手機遊玩:我們希望遊戲不要只侷限在電腦,可以開發多平台版本,讓遊戲更普及。 # 4.參考文獻 1. GrandmaCan -我阿嬤都會(2021 年 7 月 8 日)。Pygame 3 小時製作一個遊戲[影片]。 YouTube。 https://www.youtube.com/watch?v=61eX0bFAsYs&t=175s 2. Pygame(2020 年 10 月 28 日)。Pygame documentation。 https://www.Pygame.org/docs/ 3. Clear Code(2021 年 7 月 11 日)。The ultimate introduction to Pygame[影片]。 YouTube。 https://www.youtube.com/watch?v=AY9MnQ4x3zk 4. Clear Code(2021 年 12 月 4 日)。Understanding Pygame masks[影片]。YouTube。 https://www.youtube.com/watch?v=uW3Fhe-Vkx4 5. Clear Code(2020 年 10 月 2 日)。Creating a health bar in Pygame [Dark Souls style] [影 片]。YouTube。 https://www.youtube.com/watch?v=pUEZbUAMZYA 6. Clear Code(2020 年 4 月 23 日)。Python / Pygame Tutorial: Creating multiple stages. ingame [影片]。YouTube。 https://www.youtube.com/watch?v=j9yMFG3D7fg 7. DafluffyPotato(2020 年 3 月 27 日)。Particles - Pygame Tutorial[影片]。YouTube。 https://www.youtube.com/watch?v=F69-t33e8tk 8. DafluffyPotato(2020 年 8 月 19 日)。Lighting in Pygame (Tutorial)[影片]。 YouTube。 https://www.youtube.com/watch?v=NGFk44fY0O4 9. DafluffyPotato(2020 年 1 月 27 日)。Menus - Pygame Tutorial[影片]。YouTube。 https://www.youtube.com/watch?v=0RryiSjpJn0 10. Tech With Tim(2018 年 3 月 14 日)。How to Fade Your Screen in Pygame [CODE IN. DESCRIPTION][影片]。YouTube。 https://www.youtube.com/watch?v=H2r2N7D56Uw 11. Clear Code(2020 年 4 月 22 日)。Python / Pygame Tutorial: An introduction to sprites [ 影片]。YouTube。https://www.youtube.com/watch?v=hDu8mcAlY4E 12. Aditya Bhandari(2021 年 1 月 5 日)。New Year Fireworks using PYGAME | 2021|.#Python#Pygame[影片]。YouTube。https://www.youtube.com/watch?v=76a4bn14fP4 13. Pete Shinners(2016 年 12 月 14 日)。Python Pygame Introduction。 http://www.Pygame.org/docs/tut/PygameIntro.html 14. 文淵閣工作室。 Python 零基礎入門班(第三版)。(台北市:碁峰,民國 110)。 15. 廣瀨豪。Python 遊戲開發講座。(台北市:碁峰,民國 110)。 16. 洪錦魁。Python 邁向領航者之路:超零基礎。(台北市:深智,民國 109)。 17. Capcom (1942 年) 。Acrade History 。 https://www.arcade- history.com/?n=1942&page=detail&id=6