Pygame游戲開發(fā)之太空射擊實(shí)戰(zhàn)精靈的使用上篇
視頻
使用精靈
這是我們“使用 Pygame 進(jìn)行游戲開發(fā)”教程系列的第 2 部分。您應(yīng)該從第 1 部分開始:入門
什么是精靈
sprite 是一個計算機(jī)圖形術(shù)語,指屏幕上可以移動的任何對象。當(dāng)您玩任何2D游戲時,您在屏幕上看到的所有對象都是精靈。精靈可以是動畫的,它們可以由玩家控制,甚至可以相互交互。
我們將在游戲循環(huán)的更新和繪制部分中負(fù)責(zé)更新和繪制精靈。但您可能可以想象,如果您的游戲具有大量精靈,那么游戲循環(huán)的這些部分可能會變得非常長且復(fù)雜。幸運(yùn)的是,Pygame對此有一個很好的解決方案:精靈組。
精靈組只是一個精靈的集合,您可以同時對它們執(zhí)行所有操作。讓我們創(chuàng)建一個精靈組來保存游戲中的所有精靈:
clock = pygame.time.Clock() all_sprites = pygame.sprite.Group()
現(xiàn)在,我們可以通過在循環(huán)中添加以下內(nèi)容來利用該組:
# Update all_sprites.update() # Draw / render screen.fill(BLACK) all_sprites.draw(screen)
現(xiàn)在,對于我們創(chuàng)建的每個精靈,我們只需確保將其添加到all_sprites
精靈組中,它就會自動繪制在屏幕上,并且每次通過循環(huán)進(jìn)行更新。
創(chuàng)建一個精靈
現(xiàn)在我們準(zhǔn)備制作我們的第一個精靈。在Pygame中,精靈是對象。它是將數(shù)據(jù)和代碼分組到單個實(shí)體中的便捷方法。起初可能有點(diǎn)令人困惑,但幸運(yùn)的是,Pygame精靈是練習(xí)對象并習(xí)慣它們工作方式的好方法。
我們首先定義我們的新精靈:
class Player(pygame.sprite.Sprite):
class
告訴Python我們正在定義一個新類,它將是玩家精靈,其類型是pygame.sprite.Sprite
,這意味著它將基于Pygame的預(yù)定義Sprite
類
我們在class
定義中第一位代碼是__init__()
特殊函數(shù),它定義了每當(dāng)創(chuàng)建此類型的新對象時將運(yùn)行哪些代碼。每個 Pygame Sprite
必須具有兩個屬性:一個image
和一個rect
:
關(guān)于Surface對象的介紹可以參考這里的介紹:網(wǎng)址
class Player(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = pygame.Surface((50, 50)) self.image.fill(GREEN) self.rect = self.image.get_rect()
第一行pygame.sprite.Sprite.__init__(self)
是 Pygame 所必需的 ,它運(yùn)行內(nèi)置的Sprint
類初始值設(shè)定項。接下來,我們定義 image
屬性,在這里,我們只是創(chuàng)建一個Surface,它是50 x 50
正方形并用GREEN顏色填充它。稍后,我們將學(xué)習(xí)如何用 image
創(chuàng)建精靈,例如角色或宇宙飛船,但現(xiàn)在一個固定大小的正方形已經(jīng)足夠了。
接下來,我們必須定義精靈的rect
,它是“矩形”的縮寫。在 Pygame 中,矩形無處不在,以跟蹤對象的坐標(biāo)。get_rect()
命令計算image
的矩形。
我們可以使用rect
將精靈放在屏幕上的任何位置。讓精靈開始就出現(xiàn)在屏幕中間:
class Player(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = pygame.Surface((50, 50)) self.image.fill(GREEN) self.rect = self.image.get_rect() self.rect.center = (WIDTH / 2, HEIGHT / 2)
現(xiàn)在我們已經(jīng)定義了 Player 精靈,我們需要通過創(chuàng)建 Player
類的實(shí)例來“生成”它。我們還需要確保將 sprite
添加到all_sprites
組中:
all_sprites = pygame.sprite.Group() player = Player() all_sprites.add(player)
現(xiàn)在,如果您運(yùn)行程序,您將在屏幕中心看到綠色方塊。繼續(xù)并增加WIDTH
和HEIGHT
的設(shè)置,以便您將有足夠的空間讓精靈在下一步中移動。
精靈運(yùn)動
請記住,在游戲循環(huán)中,我們有all_sprites.update()
.這意味著對于組中的每個精靈,Pygame將查找一個update()
函數(shù)并運(yùn)行它。因此,要讓我們的精靈移動,我們只需要定義它的更新規(guī)則:
class Player(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = pygame.Surface((50, 50)) self.image.fill(GREEN) self.rect = self.image.get_rect() self.rect.center = (WIDTH / 2, HEIGHT / 2) def update(self): self.rect.x += 5
這意味著每次通過游戲循環(huán)時,我們都會將精靈的 x 坐標(biāo)增加 5 個像素。繼續(xù)運(yùn)行它,你會看到精靈消失在屏幕右側(cè):
讓我們通過使精靈環(huán)繞運(yùn)動來解決這個問題 - 每當(dāng)它到達(dá)屏幕的右側(cè)時,我們都會將其移動到左側(cè)。我們可以通過在精靈的rect
上使用一個方便的“句柄”來輕松完成此操作:
因此,如果rect
的左邊緣離開屏幕,我們將右邊緣設(shè)置為 0:
class Player(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = pygame.Surface((50, 50)) self.image.fill(GREEN) self.rect = self.image.get_rect() self.rect.center = (WIDTH / 2, HEIGHT / 2) def update(self): self.rect.x += 5 if self.rect.left > WIDTH: self.rect.right = 0
現(xiàn)在我們可以看到精靈將出現(xiàn)在屏幕周圍:
這將在本課中完成。繼續(xù)嘗試 - 請注意,您在精靈update()
方法中放入的任何內(nèi)容都會在每一幀發(fā)生。嘗試讓精靈上下移動(更改y坐標(biāo))或讓它從墻上反彈(當(dāng)矩形到達(dá)邊緣時反轉(zhuǎn)方向)。
在下一教程中,我們將向您展示如何為精靈使用藝術(shù) - 將其從普通正方形更改為動畫角色。
到此這篇關(guān)于Pygame游戲開發(fā)之太空射擊實(shí)戰(zhàn)精靈的使用篇的文章就介紹到這了,更多相關(guān)Pygame太空射擊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pandas數(shù)據(jù)聚合與分組運(yùn)算的實(shí)現(xiàn)
本文主要介紹了pandas數(shù)據(jù)聚合與分組運(yùn)算的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01Python socket.error: [Errno 98] Address already in use的原因和解決
這篇文章主要介紹了Python socket.error: [Errno 98] Address already in use的原因和解決方法,在Python的socket編程中可能會經(jīng)常遇到這個問題,需要的朋友可以參考下2014-08-08python將字母轉(zhuǎn)化為數(shù)字實(shí)例方法
在本篇文章里小編給大家整理的是關(guān)于python如何將字母轉(zhuǎn)化為數(shù)字的相關(guān)實(shí)例內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2019-10-10python 實(shí)現(xiàn)tar文件壓縮解壓的實(shí)例詳解
這篇文章主要介紹了python 實(shí)現(xiàn)tar文件壓縮解壓的實(shí)例詳解的相關(guān)資料,這里提供實(shí)現(xiàn)方法,幫助大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下2017-08-08Python實(shí)現(xiàn)登錄人人網(wǎng)并抓取新鮮事的方法
這篇文章主要介紹了Python實(shí)現(xiàn)登錄人人網(wǎng)并抓取新鮮事的方法,可實(shí)現(xiàn)Python模擬登陸并抓取新鮮事的功能,需要的朋友可以參考下2015-05-05