注:这个系列文章的全部内容里面包含自己写的一些思路,难免会有时候同一个文章中需要多次修改代码的情况,但是编程就是这样(个人觉得)在修改中不断的完善代码,慢慢解决bug,最后的效果我虽然不清楚能不能完全做出来,但是不试试怎么知道 !
最近研究pygame,在这里,使用到csdn来记录一下自己开发的过程,方便后续的bug修复,在本项目中,使用的python是3.11.2,那么开始进入到框架的搭建
主要思路:因为植物大战僵尸这个项目还是挺大的,涉及到方方面面的功能,也要考虑到后期的升级和修改,所以在这个项目当中,每一个单独的功能需要使用一个py文件进行创建
下面是我暂时想到的框架内容,可能后续会再次加入新的功能
到这里就是我的全部文件就完成了布局,暂时没有去考虑菜单功能,先做到可以战斗吧,菜单功能后续有机会会进行添加
在进行游戏布局之前,需要先确定一些数据,我这里使用json文件来控制卡牌数据,下面的内容是现阶段写在Card.json文件的内容
{
"SunFlower": {
"id": 1,
"EnglishName": "SunFlower",
"name": "向日葵",
"CardImage": "File/Card/",
"image": "File/Plant/",
"introduce": "",
"sun": 50,
"cd": 5,
"life": 100,
"attack": 0,
"attack_interval": 15,
"can_attack": true,
"start": true
},
"PeaShooter": {
"id": 2,
"EnglishName": "PeaShooter",
"name": "豌豆射手",
"CardImage": "File/Card/",
"image": "File/Plant/",
"introduce": "",
"sun": 100,
"cd": 5,
"life": 100,
"attack": 20,
"attack_interval": 1.5,
"can_attack": true,
"start": true
},
"PotatoMine": {
"id": 3,
"EnglishName": "PotatoMine",
"name": "土豆雷",
"CardImage": "File/Card/",
"image": "File/Plant/",
"introduce": "",
"sun": 25,
"cd": 15,
"life": 100,
"attack": 500,
"attack_interval": 10,
"can_attack": true,
"start": false
},
"IceArcher": {
"id": 4,
"EnglishName": "IceArcher",
"name": "寒冰射手",
"CardImage": "File/Card/",
"image": "File/Plant/",
"introduce": "",
"sun": 175,
"cd": 10,
"life": 150,
"attack": 20,
"attack_interval": 1.5,
"can_attack": true,
"start": false
},
"WallNut": {
"id": 5,
"EnglishName": "WallNut",
"name": "坚果墙",
"CardImage": "File/Card/",
"image": "File/Plant/",
"introduce": "",
"sun": 50,
"cd": 20,
"life": 400,
"attack": 0,
"attack_interval": 0,
"can_attack": false,
"start": false
},
"CherryBomb": {
"id": 6,
"EnglishName": "CherryBomb",
"name": "樱桃炸弹",
"CardImage": "File/Card/",
"image": "File/Plant/",
"introduce": "",
"sun": 150,
"cd": 25,
"life": 150,
"attack": 400,
"attack_interval": 0,
"can_attack": true,
"start": false
}
}
上面的一些数据的解释是这样的
id | 植物的唯一代码,用来确定植物的选择 |
EnglishName | 植物的英文名字 |
name | 植物的中文名字 |
CardImage | 卡片状态下,植物图片的内存地址 |
iamge | 选择卡片后,植物跟随鼠标的图片内存地址 |
introduce | 简单的植物介绍 |
sun | 种植需要消耗的阳光 |
cd | 冷却时间 |
life | 植物的生命值 |
attack | 植物的攻击力 |
attack_interval | 攻击间隔,如果为0表示是消耗品,攻击结束后消失 |
can_attack | 植物是否会攻击,如果会并且攻击力>0,那么僵尸出现后或者触碰到后会自动攻击(因为植物的特性会有些差异) |
start | 开局进入冷却,true表示不进入,false表示开局冷却 |
准备工作就绪,下面就开始进入main函数的主逻辑,先让窗口可以创建出来,下图为main.py的代码,到这里,准备工作完成,接下来就是进入到一些场景布置的功能了!
import pygame
import Setting
from pygame.locals import *
pygame.init()
window = pygame.display.set_mode((Setting.WIDTH, Setting.HEIGHT)) # 窗口
def mouse_click():
"""鼠标的点击事件,用于处理卡片选择和植物种植,以及铲子的功能"""
def mouse_right():
"""右键事件,点击后取消卡片选择和铲子的功能"""
def other_event():
"""一些其他事件,如点击了关闭按钮"""
for event in pygame.event.get():
if event.type == QUIT:
return True
def draw():
"""绘制函数,控制绘制内容的主逻辑"""
def run():
"""控制整个程序的主逻辑"""
clock = pygame.time.Clock() # 开启游戏时钟
clock.tick(60) # 设置游戏帧率
pygame.display.set_caption("植物大战僵尸 - Pygame") # 设置窗口标题
while True:
if other_event(): # 如点击了退出,那么程序结束
break
draw() # 运行绘制函数
pygame.display.update() # 更新屏幕
if __name__ == '__main__':
run()
持续更新中……