作者 | marble_xu
责编 | 毛中政
出品 | CSDN博客
最近一直在给这个植物大战僵尸游戏添加新的植物和僵尸, 因为网上的图片资源有限,能加的植物和僵尸比较少, 目前进展如下。
功能实现如下:
-
支持的植物类型:太阳花,豌豆射手,寒冰射手,坚果,樱桃炸弹。新增加植物:双重豌豆射手,三重豌豆射手,食人花 ,小喷菇,土豆地雷,倭瓜。
-
支持的僵尸类型:普通僵尸,棋子僵尸,路障僵尸,铁桶僵尸。新增加读报僵尸。
-
使用json文件保存关卡信息,设置僵尸出现的时间和位置。
-
增加每关开始时选择上场植物。
-
增加除草机。
下面是游戏的截图:
图1:新增的植物和僵尸
图2:每关开始选择上场植物卡片
图3:选择植物在哪里种植
如图3所示,游戏中可以种植物的方格一共有45个(有5行,每行9列)。
这篇文章要介绍的是:
-
上方植物卡片栏的实现。
-
点击植物卡片,鼠标切换为植物图片。
-
鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
游戏实现代码的github链接:
https://github.com/marblexu/PythonPlantsVsZombies
这边是csdn的下载链接:
https://download.csdn.net/download/marble_xu/11982275
代码实现
所有的植物卡片的名称和属性都保存在单独的list中,每个list index都对应一种植物。
比如list index 0 就是太阳花:
-
card_name_list[0] 是太阳花卡片的名字,用来获取太阳花卡片的图片。
-
plant_name_list[0] 是太阳花的名字,用来获取太阳花卡片的图片。
-
plant_sun_list[0] 是种植太阳花需要花费的太阳点数。
-
plant_frozen_time_list[0] 是太阳花的冷却时间。
代码在source\component\menubar.py中:
card_name_list = [c.CARD_SUNFLOWER, c.CARD_PEASHOOTER, c.CARD_SNOWPEASHOOTER, c.CARD_WALLNUT,
c.CARD_CHERRYBOMB, c.CARD_THREEPEASHOOTER, c.CARD_REPEATERPEA, c.CARD_CHOMPER,
c.CARD_PUFFMUSHROOM, c.CARD_POTATOMINE, c.CARD_SQUASH]
plant_name_list = [c.SUNFLOWER, c.PEASHOOTER, c.SNOWPEASHOOTER, c.WALLNUT,
c.CHERRYBOMB, c.THREEPEASHOOTER, c.REPEATERPEA, c.CHOMPER,
c.PUFFMUSHROOM, c.POTATOMINE, c.SQUASH]
plant_sun_list = [50, 100, 175, 50, 150, 325, 200, 150, 0, 25, 50]
plant_frozen_time_list = [0, 5000, 5000, 10000, 5000, 5000, 5000, 5000, 8000, 8000, 8000]
all_card_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
代码在source\component\menubar.py中,每个植物卡片是一个单独的Card类,用来显示这个植物。
-
checkMouseClick函数:判断鼠标是否点击到这个卡片;
-
canClick:判断这个卡片是否能种植(有没有足够的点数,是否还在冷却时间内);
-
update 函数:通过设置图片的透明度来表示这个卡片是否能选择。
class Card():
def __init__(self, x, y, name_index, scale=0.78):
self.loadFrame(card_name_list[name_index], scale)
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
self.name_index = name_index
self.sun_cost = plant_sun_list[name_index]
self.frozen_time = plant_frozen_time_list[name_index]
self.frozen_timer = -self.frozen_time
self.select = True
def loadFrame(self, name, scale):
frame = tool.GFX[name]
rect = frame.get_rect()
width, height = rect.w, rect.h
self.image = tool.get_image(frame, 0, 0, width, height, c.BLACK, scale)
def checkMouseClick(self, mouse_pos):
x, y = mouse_pos
if(x >= self.rect.x and x = self.rect.y and y sun_value or
(current_time - self.frozen_timer) = self.rect.x and x = self.rect.y and y
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?


微信扫码登录