继续上次的话题,上次我们做了封面,这次我们先要精细化封面。也就是绘制点文字到上面,顺便加个背景音乐。
我们先做一个绘制文字的方法,然后用这个方法绘制。方法是这样的
'''
draw_text: 绘制文字的方法
surf:(pygame里面每个画面都当作surface,譬如之前的main_pic,screen这些),
这里是待传入要绘制的画面
text: 要绘制的文本
size: 要绘制的尺寸
x,y: 要绘制的位置
'''
def draw_text(surf, text, size, x, y):
# 字体设置
font = pygame.font.Font(pygame.font.match_font('FangSong'), size)
# 将要绘制的文本处理成surface,参数:文本,抗锯齿(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)
有了这个方法,我们就可以在封面上绘制文字了,需要注意的是如果要绘制中文的话,字体的格式就要是支持中文的。譬如我们用到的FangSong。
然后我们绘制两行文字:
draw_text(screen, "按 [ENTER] 键开始游戏", 30, WIDTH/2, HEIGHT/2)
draw_text(screen, "或按 [Q] 键退出游戏", 30, WIDTH/2, (HEIGHT/2)+40)
这样以后运行一次,效果是下面这样的:
绘制文字后.png
接下来,我们不着急去实现这两行文字的具体功能,在我们声音的素材库里面,有封面的声音,我们可以先把声音加上,做到绘声绘色。
这里要用到的是mixer,是一个用来处理声音的模块,其含义为“混音器”,可以用来制造声音和播放声音
# 初始化声音模块
pygame.mixer.init()
然后加载播放音乐
# 加载目录声音
pygame.mixer.music.load(path.join(sound_folder, "menu.ogg"))
# 设置为循环播放并进行播放
pygame.mixer.music.play(-1)
然后试着运行就会发现声音出现了,有点大,也可以设置的小一点。
我们现在去处理那两行的文字的内容
同样是基于昨天的话题,我们认识到要捕获事件然后去处理,所以我们要处理[Enter]和[Q]两个事件,就把它放在之前的循环里面
while running:
# 刷新屏幕
pygame.display.update()
# 得到并遍历程序的事件
for event in pygame.event.get():
# 如果是退出事件,结束循环
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN:
print("进入下一个界面")
break
elif event.key == pygame.K_q:
pygame.quit()
quit()
这里要考量一个问题,就是打印“进入下一个界面”具体要怎么去实现,我们可以在打印后面加上
# 用黑色填充界面,用以清屏
screen.fill((0, 0, 0))
# 绘制文字
draw_text(screen, "GET READY!", 40, WIDTH / 2, HEIGHT / 2)
这样看似在回车以后可以进入下一个页面,可这两个语句在for里面,也在if里面,也就是说enter和q依旧是有效的,我们试着按q键,依旧退出了游戏,所以说这两个语句应该是没问题的,但是添加的位置有问题。
我们这样去想,我们要什么是在刚才的while循环里面一直有效的1.画面刷新,2.右上角的x键的退出。但是Enter和q就不是。但是他们属于事件驱动,如果不是enter和q或退出,它也是持久在那个画面的,所以我们很自然的想到可以再添加一个循环,将退出条件设置一下就好。那么我们的代码就变成:
while True:
# poll和之前的get还是有区别的,它会根据当前的实际事件立即返回,
# #如果没有事件,就会返回NoEvent
event = pygame.event.poll()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN:
print("进入下一个界面")
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)
我们看下回车之后的效果,是下面这样的,当然这个其实没什么必要,也纯粹是个过渡效果,加上我们的素材里面刚好有这段语音,所以做了。
Get Ready.png
像之前一样添加一下语音
# 另一种加载音乐的方式,这样返回的对象带有play,stop...这类的方法
ready=pygame.mixer.Sound(path.join(sound_folder,'getready.ogg'))
#播放声音
ready.play()
然后我们在等待一段时间后,自动开始正式的游戏。代码是这样的:
# 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'))
# 循环播放游戏音乐
pygame.mixer.music.play(-1)
效果是下面这样的(当然声音是不能这样展示的):
游戏正式画面.png
然后后续我们就会在这个画面上面添加各种元素,效果。当然在这个过程中间,会夹杂一些对代码的整理,因为这是一个很重要的过程,也是一个很不错的习惯。
代码放在:https://pan.baidu.com/s/1YB7bhJndyfAlzC67t5AC7g
网友评论