【版本介绍】
继上篇内容开发,该版本为ver1.1,后续版本欢迎查看博客主页😊
本篇主要讲述如何绘制种子栏、添加点击与按键事件
参考文章
本版本源码:点击跳转
一、种子栏类 SeedBank.py
自定义函数,用于构造字体
def DrawText(content, size, color):
pygame.font.init()
font = pygame.font.SysFont('kaiti', size)
text = font.render(content, True, color)
return text
1.成员变量
class SeedBank:
flame = 0 # 控制gif动画(选中植物后出现的箭头动态图)
gifList = [] # 存放单帧图片
def __init__(self):
self.img_SeedBank = pygame.image.load("Imgs/SeedBank.png")
for i in range(3+1): # 初始化gifList数组(加载帧图片)
img = pygame.image.load("Imgs/Cards/arrow/{}.png".format(i))
self.gifList.append(img)
# 三种基本的植物卡片:向日葵、豌豆射手、坚果墙
self.img_card_sunflr = pygame.image.load("Imgs/Cards/card_sunflr.png")
self.img_card_pshoot = pygame.image.load("Imgs/Cards/card_pshoot.png")
self.img_card_nut = pygame.image.load("Imgs/Cards/card_nut.png")
2.方法:展示种子栏
该方法中应用了很多特殊数字,这些是像素坐标,为了在图片上相契合
def display_SeedBank(self, MainGame):
# 显示卡槽背景
MainGame.Window.blit(self.img_SeedBank, [0, 0])
# 显示植物卡片
MainGame.Window.blit(self.img_card_sunflr, [80, 8])
MainGame.Window.blit(self.img_card_pshoot, [130, 8])
MainGame.Window.blit(self.img_card_nut, [180, 8])
# 显示选中箭头
if MainGame.Choice != -1:
f = int(self.flame)
MainGame.Window.blit(self.gifList[f % len(self.gifList)], [89 + MainGame.Choice * 50, 75])
self.flame += 0.05
# 显示阳光数
text_Money = DrawText('{}'.format(MainGame.Money), 15, 0)
w = text_Money.get_width() / 2
MainGame.Window.blit(text_Money, (39 - w, 64)) # 为了居中显示
# 显示帮助信息(可以不加)
text_help = DrawText("按1、2、3来选择植物", 26, 0)
MainGame.Window.blit(text_help, (400, 20))
其中的重点方法是加载GIF图片:
在pygame中,没有专门的API能够加载gif类型的图片,于是本人经过研究,可以将gif图片拆分成单帧图片,如下:
然后在初始化时,将所有图片添加入数组,此时相当于已经保存了gif图片在内存中了
class SeedBank:
flame = 0 # 控制gif动画(选中植物后出现的箭头动态图)
gifList = [] # 存放单帧图片
def __init__(self):
for i in range(3 + 1): # 初始化gifList数组(加载帧图片)
img = pygame.image.load("Imgs/Cards/arrow/{}.png".format(i))
self.gifList.append(img)
之后在展示种子栏中,逐帧显示每张图片,从而在视觉上表现出动图的效果
def display_SeedBank(self, MainGame):
# 显示选中箭头
if MainGame.Choice != -1:
f = int(self.flame)
MainGame.Window.blit(self.gifList[f % len(self.gifList)], [89 + MainGame.Choice * 50, 75])
self.flame += 0.05
效果如图:
二、主游戏类 MainGame.py
简述本版本添加的变量和函数
1.成员变量
mainBank = SeedBank.SeedBank()
Money = 1500 # 阳光
Choice = -1 # 选择植物
2.加载项
# 种子栏
def load_SeedBank(self):
self.mainBank.display_SeedBank(self)
3.主事件项
增加两个事件:点击卡槽选择植物 & 按下“1”、“2”、“3”选择植物
注意必须在[运行游戏]中添加 load()方法以加载种子栏
# 事件处理 ---------------------------------------
def DealEvent(self):
eventList = pygame.event.get() # 获取所有事件
for e in eventList: # 遍历事件列表,判断
# 退出游戏
if e.type == pygame.QUIT:
self.EndGame()
# 种下植物 or 选择植物
elif e.type == pygame.MOUSEBUTTONDOWN:
if e.button == 1: # 左击,进入选择
if 8 <= e.pos[1] <= 79: # 点击的是植物卡槽
if 80 <= e.pos[0] <= 80 + 50 * 3: # 只有点击在有效范围内才生效
self.Choice = (e.pos[0] - 80) // 50
# 选择植物
elif e.type == pygame.KEYDOWN:
if 49 <= e.key <= 51: # 表示按下的是“1”~“3”
self.Choice = e.key - 49
# 运行游戏 -------------------------------------
def RunGame(self):
self.init_Window()
while not self.Gameover:
self.load_Window()
self.load_Map()
self.load_SeedBank()
self.DealEvent()
pygame.display.update()
三、最终效果
如图,鼠标没点击时,是在按键控制选择植物