項(xiàng)目詳細(xì)介紹
在這個(gè)系列中梧油,將制作一個(gè)雷霆戰(zhàn)機(jī)游戲。
自動(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è)列表敛劝,lg
和sm
。由于文件都是相同的纷宇,使用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é)果:
在下一部分中,將通過(guò)向玩家添加生命來(lái)使游戲持續(xù)一段時(shí)間套像。