<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
這是我們教學系列“使用 Pygame 進行遊戲開發”的第 1 部分。它適用於對遊戲開發和提高Python編碼技能感興趣的初學者/中級程式設計師。
什麼是Pygame
Pygame是一個“遊戲庫” - 一套幫助程式設計師製作遊戲的工具。其中一些內容是:
每個遊戲的核心都是一個迴圈,我們稱之為“遊戲迴圈”。這個迴圈不斷執行,一遍又一遍,做所有使遊戲工作需要做的事情。每次遊戲經歷此迴圈時,稱為幀。
每個幀,可能會發生許多不同的事情,但它們可以組織成三個不同的類別:
遊戲需要響應的任何內容。這些可能是鍵盤按鍵,滑鼠移動等。
更改框架上需要更改的任何內容。如果一個角色在空中,重力需要把它拉下來。如果兩個物體相互碰撞,它們需要爆炸。
在此步驟中,我們將在螢幕上繪製所有內容。背景、角色、選單或玩家需要檢視的任何其他內容都必須在螢幕上的正確位置繪製。
迴圈的另一個重要方面是控制整個迴圈的執行速度。您可能聽說過術語FPS,它代表每秒幀數。這意味著此迴圈每秒應發生多少次。這很重要,因為您不希望遊戲執行得太快或太慢。你也不希望它在不同的計算機上以不同的速度執行 。
現在我們知道了使遊戲正常工作需要哪些部分,我們可以開始編寫一些程式碼了。首先,我們將製作一個簡單的pygame程式,除了開啟一個視窗並執行遊戲迴圈之外,什麼都不做。對於您想要製作的任何pygame專案來說,這都將是一個很好的起點。
在程式的頂部,我們將匯入所需的庫,併為遊戲選項設定一些變數:
# Pygame 模板 - 遊戲框架 import pygame import random WIDTH = 360 # 遊戲視窗寬度 HEIGHT = 480 # 遊戲視窗高度 FPS = 30 # 每秒幀數
接下來我們需要開啟遊戲視窗:
# 初始化pygame,建立視窗 pygame.init() pygame.mixer.init() # for sound screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("My Game") clock = pygame.time.Clock()
pygame.init()
是啟動pygame並“初始化”。 將以screen
建立遊戲螢幕。最後,我們建立了一個能夠確保遊戲以我們想要的FPS執行的 clock
接下來是遊戲迴圈了:
# 遊戲迴圈 running = True while running: # Process input (events) # Update # Render (draw)
這是我們的遊戲迴圈,它是一個由變數控制的迴圈。如果我們想讓遊戲結束,只需要設定running = False
就會結束迴圈。現在我們可以用一些基本程式碼填充每個部分。
我們將從*“繪製*”部分開始。我們還沒有任何程式碼,但我們可以用純色填充螢幕。為此,我們需要討論計算機如何處理顏色。
計算機螢幕由畫素組成,這些畫素有 3 個部分:紅色、綠色和藍色。每個部分被點亮的程度決定了該畫素是什麼顏色,如下所示:
三種原色中的每一種都可以具有介於 0(關閉)和 255(100% 開啟)之間的值,因此三種原色中的每一種都有 256 種不同的可能性。以下是您可以製作的一些顏色的一些範例:
您可以通過乘法找到計算機可以顯示的顏色總數:
>>> 256 * 256 * 256 = 16,777,216
現在我們已經瞭解了顏色,讓我們在程式的頂部定義一些:
# Colors (R, G, B) BLACK = (0, 0, 0) WHITE = (255, 255, 255) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255)
然後我們可以用黑色填充螢幕。
# 繪製、渲染 screen.fill(BLACK)
對於計算機顯示的工作方式,這還不夠。更改螢幕上的畫素意味著讓顯示卡告訴監視器更改實際畫素。在計算機方面,這是一個非常非常緩慢的過程。因此,如果您在螢幕上要繪製很多東西,則可能需要很長時間才能全部繪製出來。我們可以通過使用稱為雙緩衝的東西以一種聰明的方式解決這個問題。這聽起來很花哨,但它實際上只是意味著:
想象一下,我們有一個雙面白板,可以翻轉以顯示一面或另一面。正面將是顯示器(玩家看到的螢幕),而背面是隱藏的,只有計算機才能“看到”它。每一幀,我們所有的繪畫都在背面。然後,當我們完成後,我們將板翻轉過來並顯示新框架。這意味著我們只做一個緩慢的過程,每幀與顯示器交談一次,而不是螢幕上的每一件事都這樣做。
所有這些都在pygame中自動發生。你只需要告訴它當你完成繪圖時翻轉白板。實際上,該命令甚至被命名為:flip()
# 繪製、渲染 screen.fill(BLACK) # 繪製所有的事情後翻轉顯示 pygame.display.flip()
如果你在flip()
翻轉後嘗試畫一些東西,它們不會顯示在螢幕上!
我們還沒有遊戲,所以我們不能準確說出想要監聽的鍵盤或滑鼠按鈕或其他控制事件。
如果您現在嘗試執行該程式,您會發現自己遇到了問題:無法關閉視窗!單擊角落中的“X”不起作用。那是因為這是一個事件,我們需要告訴我們的程式監聽該事件並讓它退出遊戲。
事件可能隨時發生。如果玩家在更新或繪製迴圈部分時單擊“跳轉”按鈕,該怎麼辦?不要忽略這個輸入, 玩家會感到沮喪。因此,Pygame所做的就是儲存自上一幀以來發生的所有事件。這樣,即使玩家快速搗碎許多按鍵,也能記錄下來所有這些按鈕。所有事件存放在一個列表,因此我們執行一個for
迴圈來檢視所有事件:
for event in pygame.event.get(): # 檢查螢幕關閉事件 if event.type == pygame.QUIT: running = False
Pygame有很多事件。 pygame.QUIT
是單擊“X”時發生的事件,因此我們設定running=False
,遊戲迴圈將結束。
我們還沒有在“更新”部分中放入任何內容,但我們仍然需要使用FPS
的設定來控制速度。我們可以這樣做:
while running: # 保證以正常的速率迴圈 clock.tick(FPS)
'tick()'
命令告訴 pygame 每次迴圈需要多長時間,然後暫停多長時間,以使整個迴圈(即整個幀)持續正確的時間。如果我們設定FPS
為 30,則意味著我們希望幀持續 1 30 frac{1}{30} 301 或 0.03 秒。例如,如果我們的迴圈程式碼(更新,繪製等)只需要0.01秒,那麼pygame將等待0.02秒。
最後,讓我們確保當遊戲迴圈結束時,我們實際上會破壞遊戲視窗。通過將pygame.quit()
放在程式碼的最後來做到這一點。所以我們的最終pygame模板看起來像這樣:
# Pygame template - skeleton for a new pygame project import pygame import random WIDTH = 360 HEIGHT = 480 FPS = 30 # define colors WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) # initialize pygame and create window pygame.init() pygame.mixer.init() screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("My Game") clock = pygame.time.Clock() # Game loop running = True while running: # keep loop running at the right speed clock.tick(FPS) # Process input (events) for event in pygame.event.get(): # check for closing window if event.type == pygame.QUIT: running = False # Update # Draw / render screen.fill(BLACK) # *after* drawing everything, flip the display pygame.display.flip() pygame.quit()
祝賀!你有一個有效的Pygame模板。用一個pygame template.py
名字儲存這個檔案,這樣你就可以在每次開始一個新的Pygame專案時重複使用它。
import pygame import random # WIDTH, HEIGHT = 360, 480 # WIDTH, HEIGHT = (360, 480) # WIDTH = 360 # HEIGHT = 480 # SCREEN_SIZE = (WIDTH, HEIGHT) SCREEN_SIZE = WIDTH, HEIGHT = 360, 480 FPS = 30 # Colors (R, G, B) BLACK = (0, 0, 0) WHITE = (255, 255, 255) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) pygame.init() screen = pygame.display.set_mode(SCREEN_SIZE) pygame.display.set_caption("my game") clock = pygame.time.Clock() running = True while running: clock.tick(FPS) # 1. 事件 for e in pygame.event.get(): if e.type == pygame.QUIT: running = False # 2. 更新元件狀態 # 3. 繪製影象 screen.fill(BLACK) pygame.display.flip()
在下一教學中,我們將使用此模板作為學習如何在螢幕上繪製物件並使其移動。
到此這篇關於Pygame遊戲開發之太空射擊實戰入門篇的文章就介紹到這了,更多相關Pygame太空射擊內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45