【Python】植物大战僵尸-基于pygame模块-part2

【版本介绍】

继上篇内容开发,该版本为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()

三、最终效果

如图,鼠标没点击时,是在按键控制选择植物
在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值