前言
本系列课程是针对无基础的,争取用简单明了的语言来讲解,学习前需要具备基本的电脑操作能力,准备一个已安装python环境的电脑。如果觉得好可以分享转发,有问题的地方也欢迎指出,在此先行谢过。
创建一个开始界面函数,用来显示开始界面,因为要一直停在开始界面,在showstartscreen函数里需要有一个死循环,直到按下任意按键(除了ESC键或者退出游戏)进入游戏,在while循环里一直检测按键按下,按下后就return退出循环。
下面我们在添加一个提示信息文字,按下按键开始。
添加一个游戏暂停界面,放在游戏主循环中的事件检测中,当按下s键后,游戏进入暂停界面,再按下s键回到游戏中。
新添加一个结束界面的方法 ,在游戏主循环中进行调用,收集完所有金币就进入游戏结束画面,按下任意按键就退出程序。
# 导入两个库
import sys,pygame
import random
from pygame.locals import *
# 使用前先需要初始化,初始化所有被导入的pygame子模块,固定用法
pygame.init() # 初始化pygame
# 游戏肯定是在一个窗口中,那我们先来创建一个窗口
size = width, height = 600, 480 # 设置窗口大小
screen = pygame.display.set_mode(size) # 显示窗口
pygame.display.set_caption("捡金币游戏") #设置游戏窗口标题
# 创建玩家角色类
class Player(pygame.sprite.Sprite):
def __init__(self,player_image):
pygame.sprite.Sprite.__init__(self)
self.image=pygame.image.load(player_image)
# 获得精灵对象矩形区域,为碰撞做准备
self.rect=self.image.get_rect()
# 创建金币角色类
class Coin(pygame.sprite.Sprite):
def __init__(self,gold_image):
pygame.sprite.Sprite.__init__(self)
origin_gold = pygame.image.load(gold_image)
# 缩放大小
self.image=pygame.transform.scale(origin_gold, (32, 32))
# 获得精灵对象矩形区域,为碰撞做准备
self.rect=self.image.get_rect()
def checkfor_keypress():
if len(pygame.event.get(QUIT)) > 0:
pygame.quit()
sys.exit()
keyUpEvents = pygame.event.get(KEYUP)
if len(keyUpEvents) == 0:
return None
elif keyUpEvents[0].key == K_ESCAPE:
pygame.quit()
sys.exit()
else:
return keyUpEvents[0].key
def draw_press_key_msg():
basicfont=pygame.font.Font("anna.ttf",30)
pressKeySurf = basicfont.render('Press a key to play.', True,( 40, 40, 40))
presstext_width,presstext_height = pressKeySurf.get_size()
screen.blit(pressKeySurf, ((width-presstext_width)/2,(height-presstext_height)/2+150))
def showstartscreen():
font=pygame.font.Font("anna.ttf",100)
start_text=font.render("捡金币游戏",True,(255,0,0))
text_width,text_height=start_text.get_size()
while True:
screen.fill((124,205,124)) # 绘制背景
screen.blit(start_text,((width-text_width)/2,(height-text_height)/2))
draw_press_key_msg()
if checkfor_keypress():
pygame.event.get() # clear event queue
return
pygame.display.update()
def showwaitscreen():
font=pygame.font.Font("anna.ttf",100)
wait_text=font.render("游戏暂停",True,(255,0,0))
text_width,text_height=wait_text.get_size()
while True:
screen.fill((124,205,124)) # 绘制背景
screen.blit(wait_text,((width-text_width)/2,(height-text_height)/2))
if checkfor_keypress()==K_s:
pygame.event.get() # clear event queue
return
pygame.display.update()
def showgameoverscreen():
font=pygame.font.Font("anna.ttf",100)
over_text=font.render("game over",True,(255,0,0))
text_width,text_height=over_text.get_size()
while True:
screen.fill((124,205,124)) # 绘制背景
screen.blit(over_text,((width-text_width)/2,(height-text_height)/2))
draw_press_key_msg()
if checkfor_keypress():
pygame.event.get() # clear event queue
return
pygame.display.update()
# 创建精灵组,便于管理所有精灵类对象
allsprites=pygame.sprite.Group()
# 用于管理所有的金币精灵对象
coin_sprites=pygame.sprite.Group()
# 实例化游戏对象
player=Player('Person_walk1.png')
# 创建多个金币 20
for i in range(20):
gold = Coin("gold_1.png")
# 将金币的显示位置设置为一个随机范围
gold.rect.x = random.randrange(32,600)
gold.rect.y = random.randrange(32,400)
coin_sprites.add(gold) # 添加进精灵组
# 添加玩家角色 和 所有金币角色
allsprites.add(player,coin_sprites)
# 添加分数变量
score = 0
# 字体设置
font=pygame.font.Font("anna.ttf",24) # 自己下载的字体,可以显示中文
showstartscreen()
while True: # 死循环确保窗口一直显示
for event in pygame.event.get(): # 遍历所有事件
if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
sys.exit()
elif event.type ==pygame.KEYUP:
if event.key ==K_s:
showwaitscreen()
pos=pygame.mouse.get_pos()
# 碰撞检测 一个是玩家 一个是金币精灵组 True表示碰撞就删除碰撞的角色金币
coins=pygame.sprite.spritecollide(player, coin_sprites, True)
# 统计返回的碰撞金币精灵列表数量
for coin in coins:
score=score+1 # 每次加 1
if score==20:
showgameoverscreen()
break
# 将玩家的坐标设置为鼠标的位置
player.rect.x=pos[0]
player.rect.y=pos[1]
screen.fill((124,205,124)) # 绘制背景
allsprites.draw(screen) # 将玩家和金币绘制到屏幕上
# 显示计分
text=font.render("分数:{}".format(score),True,(255,0,0))
screen.blit(text,(10,10))
pygame.display.flip() # 更新
捡金币游戏到这里就结束了,当然还有很多可以完善的地方,比如有很多重复的显示文本的代码,除了内容不一样,其它都一样;可以新建一个游戏类,会更方便管理代码,还有游戏音效,再来一轮,限时功能,关卡等也没有去深入,感兴趣的可以自己去研究。
(全文完)