0
点赞
收藏
分享

微信扫一扫

python小游戏设计入门5-捡金币游戏(下)

JakietYu 2022-03-24 阅读 67



前言

本系列课程是针对无基础的,争取用简单明了的语言来讲解,学习前需要具备基本的电脑操作能力,准备一个已安装python环境的电脑。如果觉得好可以分享转发,有问题的地方也欢迎指出,在此先行谢过。

开始界面

创建一个开始界面函数,用来显示开始界面,因为要一直停在开始界面,在showstartscreen函数里需要有一个死循环,直到按下任意按键(除了ESC键或者退出游戏)进入游戏,在while循环里一直检测按键按下,按下后就return退出循环。

python小游戏设计入门5-捡金币游戏(下)_初始化

python小游戏设计入门5-捡金币游戏(下)_python_02

下面我们在添加一个提示信息文字,按下按键开始。

python小游戏设计入门5-捡金币游戏(下)_python_03

python小游戏设计入门5-捡金币游戏(下)_python_04

游戏暂停

添加一个游戏暂停界面,放在游戏主循环中的事件检测中,当按下s键后,游戏进入暂停界面,再按下s键回到游戏中。

python小游戏设计入门5-捡金币游戏(下)_初始化_05

python小游戏设计入门5-捡金币游戏(下)_初始化_06

python小游戏设计入门5-捡金币游戏(下)_初始化_07

游戏结束

新添加一个结束界面的方法 ,在游戏主循环中进行调用,收集完所有金币就进入游戏结束画面,按下任意按键就退出程序。

python小游戏设计入门5-捡金币游戏(下)_python_08

python小游戏设计入门5-捡金币游戏(下)_游戏设计_09

python小游戏设计入门5-捡金币游戏(下)_初始化_10

最终代码:

# 导入两个库

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() # 更新

总结:

捡金币游戏到这里就结束了,当然还有很多可以完善的地方,比如有很多重复的显示文本的代码,除了内容不一样,其它都一样;可以新建一个游戏类,会更方便管理代码,还有游戏音效,再来一轮,限时功能,关卡等也没有去深入,感兴趣的可以自己去研究。

(全文完)


欢迎转载,转载请注明出处!

欢迎关注公众微信号:叶子陪你玩编程 分享自己的python学习之路






长按二维码,

加关注!

叶子陪你玩

python小游戏设计入门5-捡金币游戏(下)_游戏设计_11



举报

相关推荐

0 条评论