python及pygame雷霆戰(zhàn)機(jī)游戲項(xiàng)目實(shí)戰(zhàn)10 爆炸效果

項(xiàng)目詳細(xì)介紹

項(xiàng)目詳細(xì)介紹

在這個(gè)系列中梧油,將制作一個(gè)雷霆戰(zhàn)機(jī)游戲。

GIF.gif

自動(dòng)開(kāi)火

首先州邢,讓對(duì)玩家射擊方式做一點(diǎn)改動(dòng)儡陨。只要空格鍵被按下,讓自動(dòng)發(fā)射子彈量淌。

為此骗村,將向Player添加兩個(gè)新屬性:

self.shoot_delay = 250
self.last_shot = pygame.time.get_ticks()

shoot_delay將測(cè)量飛船在發(fā)射另一顆子彈之前應(yīng)該等待的時(shí)間長(zhǎng)度(以毫秒為單位)。last_shot將跟蹤最后一顆子彈射擊的時(shí)間呀枢,以便知道何時(shí)有足夠的時(shí)間再次射擊胚股。

現(xiàn)在將把開(kāi)火key(space空格鍵)添加到鍵盤(pán)檢查player的更新中:

def update(self):
    self.speedx = 0
    keystate = pygame.key.get_pressed()
    if keystate[pygame.K_LEFT]:
        self.speedx = -8
    if keystate[pygame.K_RIGHT]:
        self.speedx = 8
    if keystate[pygame.K_SPACE]:
        self.shoot()

將所有射擊邏輯放在一個(gè)新方法中:

def shoot(self):
now = pygame.time.get_ticks()
if now - self.last_shot > self.shoot_delay:
    self.last_shot = now
    bullet = Bullet(self.rect.centerx, self.rect.top)
    all_sprites.add(bullet)
    bullets.add(bullet)

現(xiàn)在當(dāng)空格鍵被按下時(shí),游戲?qū)z查自最后一個(gè)子彈創(chuàng)建以來(lái)已經(jīng)過(guò)了多少時(shí)間裙秋。如果它大于shoot_delay毫秒琅拌,則會(huì)觸發(fā)另一個(gè)子彈,并使得last_shot進(jìn)行更新摘刑。最后进宝,可以從游戲循環(huán)中刪除以下幾行:

elif event.type == pygame.KEYDOWN:
    if event.key == pygame.K_SPACE:
        player.shoot()

動(dòng)畫(huà)爆炸

對(duì)于下一個(gè)補(bǔ)充,希望通過(guò)使敵機(jī)爆炸而不僅僅是消失枷恕,來(lái)使敵機(jī)的破壞更具視覺(jué)吸引力党晋。為了實(shí)現(xiàn)這一點(diǎn),需要一組爆炸圖形的動(dòng)畫(huà)幀徐块,需要在被破壞的敵機(jī)的位置創(chuàng)建一個(gè)精靈未玻,它將在動(dòng)畫(huà)幀序列中循環(huán)。這是要使用的動(dòng)畫(huà)序列:

首先胡控,需要將這些圖形加載到游戲中并將它們存儲(chǔ)在列表中扳剿。與玩家精靈一樣,需要調(diào)整圖像大小铜犬,當(dāng)這樣做時(shí)舞终,會(huì)創(chuàng)建兩個(gè)不同大小的爆炸:一個(gè)大爆炸---當(dāng)流星被摧毀時(shí); 還有一個(gè)小爆炸---當(dāng)一顆流星擊中玩家時(shí)。所以將設(shè)計(jì)一個(gè)字典explosion_anim癣猾,包含兩個(gè)列表敛劝,lgsm。由于文件都是相同的纷宇,使用00-08中的數(shù)字夸盟,可以使用循環(huán)來(lái)加載它們,調(diào)整大小并將它們附加到列表中:

explosion_anim = {}
explosion_anim['lg'] = []
explosion_anim['sm'] = []
for i in range(9):
    filename = 'regularExplosion0{}.png'.format(i)
    img = pygame.image.load(path.join(img_dir, filename)).convert()
    img.set_colorkey(BLACK)
    img_lg = pygame.transform.scale(img, (75, 75))
    explosion_anim['lg'].append(img_lg)
    img_sm = pygame.transform.scale(img, (32, 32))
    explosion_anim['sm'].append(img_sm)

爆炸精靈

接下來(lái)像捶,將定義一個(gè)新的精靈上陕,它將是屏幕上的實(shí)際爆炸對(duì)象桩砰。這個(gè)精靈的圖像會(huì)在動(dòng)畫(huà)幀列表中從一個(gè)圖像快速變換到下一個(gè)圖像。當(dāng)它到達(dá)最后一幀時(shí)释簿,精靈將被刪除亚隅。當(dāng)產(chǎn)生精靈時(shí),會(huì)告訴它出生的位置(流星的位置)庶溶,以及要使用的大小煮纵。有一個(gè)frame_rate屬性,這將讓控制如何快速運(yùn)行動(dòng)畫(huà)---如果要改變圖像的每一個(gè)更新占用(1 / 60 )秒偏螺,那么整個(gè)爆炸將僅持續(xù)約1 / 10秒行疏。這是Explosion精靈的代碼:

class Explosion(pygame.sprite.Sprite):
    def __init__(self, center, size):
        pygame.sprite.Sprite.__init__(self)
        self.size = size
        self.image = explosion_anim[self.size][0]
        self.rect = self.image.get_rect()
        self.rect.center = center
        self.frame = 0
        self.last_update = pygame.time.get_ticks()
        self.frame_rate = 50

    def update(self):
        now = pygame.time.get_ticks()
        if now - self.last_update > self.frame_rate:
            self.last_update = now
            self.frame += 1
            if self.frame == len(explosion_anim[self.size]):
                self.kill()
            else:
                center = self.rect.center
                self.image = explosion_anim[self.size][self.frame]
                self.rect = self.image.get_rect()
                self.rect.center = center

現(xiàn)在需要在銷(xiāo)毀一個(gè)敵機(jī)時(shí)產(chǎn)生其中一個(gè):

# check to see if a bullet hit a mob
hits = pygame.sprite.groupcollide(mobs, bullets, True, True)
for hit in hits:
    score += 50 - hit.radius
    random.choice(expl_sounds).play()
    expl = Explosion(hit.rect.center, 'lg')
    all_sprites.add(expl)
    newmob()

當(dāng)玩家被擊中時(shí):

# check to see if a mob hit the player
hits = pygame.sprite.spritecollide(player, mobs, True, pygame.sprite.collide_circle)
for hit in hits:
    player.shield -= hit.radius * 2
    expl = Explosion(hit.rect.center, 'sm')
    all_sprites.add(expl)
    newmob()
    if player.shield <= 0:
        running = False

現(xiàn)在可以看到最終結(jié)果:


GIF10.gif

在下一部分中,將通過(guò)向玩家添加生命來(lái)使游戲持續(xù)一段時(shí)間套像。

項(xiàng)目源碼及資源

獲取地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末酿联,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子夺巩,更是在濱河造成了極大的恐慌贞让,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劲够,死亡現(xiàn)場(chǎng)離奇詭異震桶,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)征绎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)蹲姐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人人柿,你說(shuō)我怎么就攤上這事柴墩。” “怎么了凫岖?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵江咳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我哥放,道長(zhǎng)歼指,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任甥雕,我火速辦了婚禮踩身,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘社露。我一直安慰自己挟阻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著附鸽,像睡著了一般脱拼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坷备,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天熄浓,我揣著相機(jī)與錄音,去河邊找鬼省撑。 笑死玉组,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丁侄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼朝巫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鸿摇!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起劈猿,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拙吉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后揪荣,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體筷黔,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年仗颈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了佛舱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挨决,死狀恐怖请祖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脖祈,我是刑警寧澤肆捕,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站盖高,受9級(jí)特大地震影響慎陵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喻奥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一席纽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧映凳,春花似錦胆筒、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)抒和。三九已至,卻和暖如春彤蔽,著一層夾襖步出監(jiān)牢的瞬間摧莽,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工顿痪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留镊辕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓蚁袭,卻偏偏與公主長(zhǎng)得像征懈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子揩悄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容