在前面的文章《python小欢喜(六)动画 (1) pygame的安装与初步使用》中介绍了如何安装pygame。
《python小欢喜(七)游戏编程 (1) 挡球》实现了一个小游戏。接下来对这个小游戏做两方面的改进
1 使用中文提示
2 添加上碰撞时的声音效果
游戏界面如下:
可以看到,窗口上方的提示变成了中文,如果戴上耳机或使用音箱,可以听到足球碰到挡板或下边界时发出的声音。
# -*- coding:utf-8 -*-
# 挡球游戏
import pygame #导入pygame模块
pygame.init()
screen = pygame.display.set_mode([800,600]) #设置图形窗口大小为800*600
pygame.display.set_caption("挡球") #设置图形窗口标题
BLACK = (0,0,0) # 用RGB值定义黑色
WHITE = (255,255,255) # 用RGB值定义白色
BROWN = (166,134,95) # 用RGB值定义棕色
ball = pygame.image.load("ball.png") # 加载足球图片
picx = 0 #图片的x坐标的初始值设为0
picy = 0 #图片的y坐标的初始值设为0
picw = 100 #图片的宽度
pich = 100 #图片的高度
speedx = 5 #足球的水平速度值
speedy = 5 #足球的垂直速度值
paddlex = 300 #挡板的x坐标的初始值设为300
paddley = 550 #挡板的y坐标的初始值设为550 ,窗口高度为600,档板靠近窗口底部
paddlew = 200 #挡板的宽度
paddleh = 25 #挡板的高度
points = 0 #游戏得分
lives = 5 #玩家生命值
font = pygame.font.Font("C:\Windows\Fonts\STSONG.TTF", 24) #设置输出文本所用的字体
pygame.mixer.init() # 初始化混音器
pop = pygame.mixer.Sound("pop.wav") #加载声音文件
blip = pygame.mixer.Sound("blip.wav") #加载声音文件
timer = pygame.time.Clock() #生成一个定时器对象
keepGoing = True
while keepGoing: # 事件处理循环
for event in pygame.event.get():
if event.type == pygame.QUIT:
keepGoing = False
#根据速度值修正足球图片的当前位置,如果碰到边缘,则将速度值取反,得到回弹的效果
picx += speedx
picy += speedy
if picx <= 0 or picx + ball.get_width() >= 800:
speedx = -speedx
if picy <= 0:
speedy = -speedy
if picy >= 500:
lives -= 1 #碰到底边,生命值减1
speedy = -speedy
blip.play() #播放声音
screen.fill(BLACK)
screen.blit(ball, (picx, picy))
# 根据鼠标的当前位置绘制挡板,只使用的鼠标当前位置的x坐标
paddlex = pygame.mouse.get_pos()[0]
paddlex -= paddlew/2
pygame.draw.rect(screen, BROWN, (paddlex, paddley, paddlew, paddleh))
# 检查足球是否与档板发生了碰撞,如果是,则得分数加1,并使足球回弹
if picy + pich >= paddley and picy + pich <= paddley + paddleh \
and speedy > 0:
if picx + picw / 2 >= paddlex and picx + picw / 2 <= paddlex + \
paddlew:
points += 1
speedy = -speedy
pop.play() #播放声音
# 输出提示信息
tip = "生命值: " + str(lives) + ", 得分: " + str(points)
text = font.render(tip, True, WHITE)
text_rect = text.get_rect()
text_rect.centerx = screen.get_rect().centerx
text_rect.y = 10
screen.blit(text, text_rect)
pygame.display.update() #刷新窗口
timer.tick(60) #设置帧率不超过60
pygame.quit() # 退出pygame
font = pygame.font.SysFont("Times", 24) #设置输出文本所用的字体
改为:
font = pygame.font.Font("C:\Windows\Fonts\STSONG.TTF", 24) #设置输出文本所用的字体
其中 “C:\Windows\Fonts\STSONG.TTF” 是中文宋体的字体文件,24 是字号
tip = "Lives: " + str(lives) + " Points: " + str(points)
改为:
tip = "生命值: " + str(lives) + ", 得分: " + str(points)
值得注意的是,如果前面不设置中文字体,直接修改 tip = "生命值: " + str(lives) + ", 得分: " + str(points) ,会导致中文输出的内容为乱码
添加下面三行,加载声音文件
pygame.mixer.init() # 初始化混音器
pop = pygame.mixer.Sound("pop.wav") #加载声音文件
blip = pygame.mixer.Sound("blip.wav") #加载声音文件
然后在发生碰撞时执行
blip.play() #播放声音
或者:
pop.play() #播放声音
可见有了pygame.mixer之后,播放声音变得相当的简单。
程序中用到的两个声音文件可在此处下载
提取码:34yu