繼續(xù)上次的話題顽染,上次我們做了封面漾岳,這次我們先要精細(xì)化封面轰绵。也就是繪制點(diǎn)文字到上面,順便加個(gè)背景音樂尼荆。
我們先做一個(gè)繪制文字的方法左腔,然后用這個(gè)方法繪制。方法是這樣的
'''
draw_text: 繪制文字的方法
surf:(pygame里面每個(gè)畫面都當(dāng)作surface捅儒,譬如之前的main_pic,screen這些)液样,
這里是待傳入要繪制的畫面
text: 要繪制的文本
size: 要繪制的尺寸
x,y: 要繪制的位置
'''
def draw_text(surf, text, size, x, y):
# 字體設(shè)置
font = pygame.font.Font(pygame.font.match_font('FangSong'), size)
# 將要繪制的文本處理成surface,參數(shù):文本巧还,抗鋸齒(bool)鞭莽,顏色
text_surface = font.render(text, True, (255, 255, 255))
# 獲取文字畫面的尺寸
text_rect = text_surface.get_rect()
# 確定位置
text_rect.midtop = (x, y)
# 將文字畫面繪制到傳入的畫面上
surf.blit(text_surface, text_rect)
有了這個(gè)方法,我們就可以在封面上繪制文字了麸祷,需要注意的是如果要繪制中文的話澎怒,字體的格式就要是支持中文的。譬如我們用到的FangSong阶牍。
然后我們繪制兩行文字:
draw_text(screen, "按 [ENTER] 鍵開始游戲", 30, WIDTH/2, HEIGHT/2)
draw_text(screen, "或按 [Q] 鍵退出游戲", 30, WIDTH/2, (HEIGHT/2)+40)
這樣以后運(yùn)行一次喷面,效果是下面這樣的:
接下來,我們不著急去實(shí)現(xiàn)這兩行文字的具體功能走孽,在我們聲音的素材庫里面惧辈,有封面的聲音,我們可以先把聲音加上融求,做到繪聲繪色咬像。
這里要用到的是mixer算撮,是一個(gè)用來處理聲音的模塊生宛,其含義為“混音器”,可以用來制造聲音和播放聲音
# 初始化聲音模塊
pygame.mixer.init()
然后加載播放音樂
# 加載目錄聲音
pygame.mixer.music.load(path.join(sound_folder, "menu.ogg"))
# 設(shè)置為循環(huán)播放并進(jìn)行播放
pygame.mixer.music.play(-1)
然后試著運(yùn)行就會(huì)發(fā)現(xiàn)聲音出現(xiàn)了肮柜,有點(diǎn)大陷舅,也可以設(shè)置的小一點(diǎn)。
我們現(xiàn)在去處理那兩行的文字的內(nèi)容
同樣是基于昨天的話題审洞,我們認(rèn)識(shí)到要捕獲事件然后去處理莱睁,所以我們要處理[Enter]和[Q]兩個(gè)事件,就把它放在之前的循環(huán)里面
while running:
# 刷新屏幕
pygame.display.update()
# 得到并遍歷程序的事件
for event in pygame.event.get():
# 如果是退出事件芒澜,結(jié)束循環(huán)
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN:
print("進(jìn)入下一個(gè)界面")
break
elif event.key == pygame.K_q:
pygame.quit()
quit()
這里要考量一個(gè)問題仰剿,就是打印“進(jìn)入下一個(gè)界面”具體要怎么去實(shí)現(xiàn),我們可以在打印后面加上
# 用黑色填充界面痴晦,用以清屏
screen.fill((0, 0, 0))
# 繪制文字
draw_text(screen, "GET READY!", 40, WIDTH / 2, HEIGHT / 2)
這樣看似在回車以后可以進(jìn)入下一個(gè)頁面南吮,可這兩個(gè)語句在for里面,也在if里面誊酌,也就是說enter和q依舊是有效的部凑,我們?cè)囍磓鍵露乏,依舊退出了游戲,所以說這兩個(gè)語句應(yīng)該是沒問題的涂邀,但是添加的位置有問題瘟仿。
我們這樣去想,我們要什么是在剛才的while循環(huán)里面一直有效的1.畫面刷新比勉,2.右上角的x鍵的退出劳较。但是Enter和q就不是。但是他們屬于事件驅(qū)動(dòng)敷搪,如果不是enter和q或退出兴想,它也是持久在那個(gè)畫面的,所以我們很自然的想到可以再添加一個(gè)循環(huán)赡勘,將退出條件設(shè)置一下就好嫂便。那么我們的代碼就變成:
while True:
# poll和之前的get還是有區(qū)別的,它會(huì)根據(jù)當(dāng)前的實(shí)際事件立即返回闸与,
# #如果沒有事件毙替,就會(huì)返回NoEvent
event = pygame.event.poll()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN:
print("進(jìn)入下一個(gè)界面")
break
elif event.key == pygame.K_q:
pygame.quit()
quit()
elif event.type == pygame.QUIT:
pygame.quit()
quit()
# 用黑色填充界面,用以清屏
screen.fill((0, 0, 0))
# 繪制文字
draw_text(screen, "GET READY!", 40, WIDTH / 2, HEIGHT / 2)
我們看下回車之后的效果践樱,是下面這樣的厂画,當(dāng)然這個(gè)其實(shí)沒什么必要,也純粹是個(gè)過渡效果拷邢,加上我們的素材里面剛好有這段語音袱院,所以做了。
像之前一樣添加一下語音
# 另一種加載音樂的方式瞭稼,這樣返回的對(duì)象帶有play,stop...這類的方法
ready=pygame.mixer.Sound(path.join(sound_folder,'getready.ogg'))
#播放聲音
ready.play()
然后我們?cè)诘却欢螘r(shí)間后忽洛,自動(dòng)開始正式的游戲。代碼是這樣的:
# ready界面的更新
pygame.display.update()
# 等待2000毫秒
pygame.time.wait(2000)
# 停止之前的音樂
pygame.mixer.music.stop()
# 加載游戲界面的背景圖片
background = pygame.image.load(path.join(img_dir, 'starfield.png')).convert()
background_rect = background.get_rect()
# 繪制背景圖片
screen.blit(background, background_rect)
# 加載游戲音樂
pygame.mixer.music.load(path.join(sound_folder, 'tgfcoder-FrozenJam-SeamlessLoop.ogg'))
# 循環(huán)播放游戲音樂
pygame.mixer.music.play(-1)
效果是下面這樣的(當(dāng)然聲音是不能這樣展示的):
然后后續(xù)我們就會(huì)在這個(gè)畫面上面添加各種元素环肘,效果欲虚。當(dāng)然在這個(gè)過程中間,會(huì)夾雜一些對(duì)代碼的整理悔雹,因?yàn)檫@是一個(gè)很重要的過程复哆,也是一個(gè)很不錯(cuò)的習(xí)慣。
代碼放在:https://pan.baidu.com/s/1YB7bhJndyfAlzC67t5AC7g