# pvz-haojie06 **Repository Path**: pythonzz/pvz-haojie06 ## Basic Information - **Project Name**: pvz-haojie06 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-09-02 - **Last Updated**: 2024-09-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 面向对象课程设计 ## 目录 - [项目介绍](#项目介绍) - [项目编写任务分配](#编写安排) - [游戏流程](#游戏流程) - [项目组成](#项目组成) - [项目类图](#项目类图) - [开发计划与每日任务 **请查看**](#开发计划与每日任务) - [每日总结 **每天更新**](#每日总结) + [十一月九日](#11.9) + [十一月十日](#11.10) + [十一月十二日](#11.12) + [十一月十三日](#11.13) + [十一月二十三日 *重启计划*](#11.23) + [十一月二十五日**最新**](#11.25) ## 项目介绍 - 项目名: 植物大战僵尸 英雄 (暂定) - 项目内容: 项目基于植物大战僵尸的基本规则,横板塔防游戏,植物方坚持到指定波数则胜利,僵尸方到达地图最左边则僵尸方获得胜 - 项目特色(不同与原本游戏的地方) + 玩家可使用两个阵营 植物/僵尸 + 引入**英雄**,玩家可以操控该英雄,英雄具有武器,技能,~~特殊贴图~~,僵尸的英雄可以由玩家控制移动,植物的英雄可以控制瞄准(是否可以瞄准还不确定) + 天气系统 不同的植物/僵尸在不同的天气会得到相应的加强/削弱 + 障碍系统 回合开始之前,玩家可以在地图上设置一些障碍 + 卡牌系统 植物/僵尸/功能性卡牌(强化,弱化,etc) ~~拖拽实施呵呵。。。~~ + 商店系统 英雄升级/植物升级/僵尸升级 + 普通植物/僵尸系统 除英雄外 普通植物/僵尸的生成采取原版的方式(放置) 使用ALT键切换放置模式与英雄模式 + 金钱系统 + ~~网络对战~~也许未来会有吧... + 游戏中的物理效果 抛物线,碰撞 ___ ## 项目编写 **分工 采用MVC** ### model数据操作部分 排行榜存取 游戏存档 地图读取 ### view图像部分 使用 swing 谭冲 吴浩杰 吴天哲 雷迪(动作图片) ### controller游戏逻辑部分 吴浩杰 谭冲 ### 写文档,准备相关资源(图片音乐) 吴天哲 ### 游戏系统设计策划 例如 游戏更加具体的规则 道具特性 ### WEB扩展 并未确定是否要做 ___ ## 游戏流程 1. 玩家进入游戏,显示片头动画,背景故事~~误~~ 2. 出现游戏菜单(新游戏,继续游戏,商店(重要!植物/僵尸/卡牌/强化),排行榜,制作人员) 3. 点击继续,从数据库中获得上一局游戏情况,并开始游戏流程 点击新游戏 出现界面要求玩家输入姓名 4. 开始游戏,显示游戏加载界面,操作说明 5. 回合开始之前,准备界面,选择阵营,选择关卡,选择英雄,选择植物/僵尸,选择卡牌,设置障碍 6. 从数据库中读取地图,初始化 7. 开始游戏 8. 判定失败,输出分数,提示玩家是否保存 判定成功,输出分数,是否继续闯关 true:继续 false:询问玩家是否保存并退出 ___ ## 项目组成 ### 项目中的类以及接口 **MVC** #### Model中的类/接口: ##### 类: ___ *是否使用数据库没有确定,先不用吧* ###### 数据~~库~~操作类(使用序列化接口或者直接按文本储存): - [ ] **ScoreFileOp()** *排行榜文件处理类-可采用序列化储存* field(字段): rank name score role(阵营) - [ ] **SaveDatabaseOp()** *存档数据~~库~~处理类--序列化储存,使用当前信息生成SaveData对象,其中保有当前游戏的所有数据信息,Stage要提供**loadData**方法* field: saveId(第几个存档) imgSrc(存档缩略图路径) playerName(玩家名) score(当前分数) money (当前金钱) plantKind plantXYZ zombieKind zombieXYZ (僵尸种类以及坐标 如何存入及格式化还有待商榷) *还有一些内容* - [ ] **RoundDatabaseOp()** *关卡数据处理类--序列化或者纯文本文件都可以 ps:想加入一个关卡编辑器功能* ___ ###### 游戏界面/功能类: - [ ] **Class Stage()** *舞台类,游戏发生在舞台上面,其中有计分器,判定器等等,还有关卡开始前的选择界面/障碍布置界面* - [ ] **Class GameUI()** *游戏UI类,负责汇总零散的信息* - [ ] **Class Map()** *地图类,记录背景图片,什么地方有什么对象,获得数据库中对象信息进行初始化* - [ ] **Class Place()** *放置类,处理向地图中放置的东西,如游戏开始前放置的障碍,游戏中放置的植物/僵尸* - [x] **Class Judger()** *逻辑判断类,处理伤害事件,卡牌事件等等* + 目前只实现了触线产生死亡事件 + 以下事件有待实现 + [ ] 是否属于攻击范围的判断 + [ ] 碰撞判断 + [ ] 伤害判断 + [ ] 有待加入 - [ ] **Class Counter()** *计数器类,统计分数/金钱* ___ ###### 游戏中的对象类: *所有对象的信息从数据库中读取出来后要在这里进行初始化 Map类中进行* - [ ] **abstract Class Weapon()** *武器/攻击方式抽象类* - [ ] **abstract Class Features()** *特性抽象类* - [ ] **abstract Class Card()** *卡牌类父类* - [ ] **abstract Class Obstacle** *障碍类父类* - [ ] **abstract Class Entity()** *实体类植物与僵尸的共同父类(抽象)* - [ ] **abstract Class Plant()** *植物类继承自role(抽象)* - [ ] **abstract Class Zombie()** *僵尸父类继承自role(抽象)* **实体类都应该有碰撞箱** *之后有植物僵尸卡牌子类* ___ ###### 英雄 - [ ] **abstract Class Heros()** *英雄父类* - [ ] **abstract Class PlantHeros()** *植物英雄父类* - [ ] **abstract Class ZombieHeros()** *僵尸英雄父类* - [ ] *添加具体英雄的实现类* - [ ] **abstract Class Skill()** *技能抽象类* ###### 事件类/事件处理类 *新增 使用监听器模式 所有的行为都会产生事件,例如:攻击事件,受到攻击事件,强化事件,这些事件可以传递行为的发起对象以及行为接受对象,在EventHandler(事件处理类)中实现时间的处理方法,如 UpgradeEventHandler(UpgradeEvent event)方法中 event传递了需要升级的对象,在方法中修改对象的属性,达成强化的目的 参考 https://my.oschina.net/u/923324/blog/792857 **Event** *事件抽象类 11/9更新* - [x] MoveEvent 移动事件 - [x] DeadEvent 死亡事件 - [ ] AttckEvent 发起攻击事件 - [ ] LaunchEvent 远程武器发射事件 - [ ] HitEvent 命中事件 **EventListener** *事件监听抽象类* - 对应所有的事件类实现eventHandle方法 **interface EventSource** *事件源接口,实现以下两个方法* 1. bindListener 2. notifyListener ___ #### 接口 ##### 数据处理接口: - [ ] **interface ScoreOperation()** *排行榜接口* - [ ] **interface SaveOperation()** *存档操作接口* - [ ] **interface MapOperation()** *地图读取接口* ##### 对象动作接口 - [ ] **interface Move()** *移动接口,僵尸需要实现* - [ ] **interface Damage()** *攻击接口,攻击属性,伤害,距离等等* - [ ] **interface Upgrade()** *升级接口,强化属性* - [ ] **interface Harm()** *受伤接口* - [ ] **interface Effect()** *效果接口 燃烧/冰冻...* - [ ] **interface Features()** *特性接口 飞行/毒* #### Controller中的类/接口 - [x] **Class GameController** *连接ModelView的控制器* - [ ] **Class ReactOpeartion()** *用户操作响应类* #### View中的类/接口 *负责绘制* - [x] **Class Canvas** *所有的绘制方法都在这里调用,Canvas的对象为绘制的画布* **参考:** https://blog.csdn.net/fanwenjieok/article/details/46757139 - [ ] **Class MapViews()** *绘制地图以及地图上的单位* - [ ] **Class UIViews()** *游戏UI绘制* - [ ] **Class EffectViews()** *效果绘制 特效,飞行轨迹...* - [ ] **Class MenuView** *绘制菜单* #### Utils 工具包: *各种小工具* ___ ## UML ### CLASS DIAGRAM ___ ## 开发计划 ### 11.8 全组学习 1. 负责Views 学习Swing Swing的动画 制作 移动的demo 2. 负责Model 准备好抽象类以及接口 ### 11.10 至 11.11 周末分工/任务 1. 雷迪 吴天哲(请向雷迪问清楚标准和要求): PS图片的准备 1. 普通僵尸的一套动作,死亡动作需要拼接,**都靠近png图片的左边缘**,建议使用PS的批量处理 动作:移动/攻击/死亡(掉头)/死亡(灰烬)/发呆,死亡图片需要先扩展画布再进行裁剪 2. 植物做一套机枪射手的动作 摇摆 3. 注意文件夹的分类方式以及命名方式**文件夹分类方式: 僵尸的动画放在ZombiePng中的以类名命名的文件夹中,一个动作创建一个文件夹例如 move(移动) die(死亡) attack(攻击) relax (发呆)... 图片的命名方式 动作+序号(从1开始).png,死亡图片比较特殊(掉头和变成灰)请用dieh 和 died 区分,例如dieh1.png died1.png** 4. 一个动作10-20张图片 3. 谭冲: 1. 实现游戏开始菜单 4. 吴浩杰: 1. 植物类,攻击接口,攻击碰撞判断,伤害判断,动画加载5. 罗冰倩: 1. 发射事件,攻击轨迹的计算方法 ___ ## 每日总结 ### 11.9日 1. 添加了事件类,事件监听类,事件源接口,所有的交互都以事件的形式传递 [点击查看](#事件) 2. 大致完成了views包下绘图类Canvas的方法,**如果要添加绘图方法请参考views包内Canvas是如何调用另外几个类的方法的** 3. 创建了游戏的主循环类Stage类,所有的Model方法都在这里被执行,并调用controller,controller再调用view中的方法绘制界面 4. 实现了游戏中动画的控制类AnimeControl,这个类中有两个方法分别控制动画的播放(通过PNG的轮流切换来实现),另一个方法用来切换对象的当前动画 例如从行走切换到死亡 ### 11.10日 1. 碰撞事件的处理:地图会以横向纵向分划出若干个单元格,创建类 单元格类,每一个单元格都是一个对象,在Stage中创建一个单元格列表(二维List),将处于格子内的僵尸或者子弹都添加到同一个对象中,最后遍历单元格,如果出现僵尸和子弹位于同一个格子内的情况再进行碰撞判断,这样减少判断的次数 (如果纯用遍历的方式,N个子弹,M个僵尸,将会判断MN次(可以通过子弹销毁来减少判断),而采取单元格的方式,处理次数会变成 M + N + 单元格数(有不有更好的处理方式?) 2. 在Map中的initial方法进行了单元格的初始化,如何能够使之后的**判断次数最少还值得思考** 3. 画线分割还有一个优势就是抛射弹药落地销毁便于判断(同一行触线 4. 添加了Cleaner 清洁工类,用来清除死亡的实体,例如僵尸死亡后死亡状态变为1,还会维持一段时间,每一次循环死亡时间都会增加,增加到一定值的时候就发出死亡事件,彻底删除该实体 5. 在Controller中添加了鼠标点击事件的demo,点击僵尸脚底下可以直接杀死僵尸,为了实现这个功能需要实现几个部分 1. 获得玩家点击的是哪一个单元格 **在Judgement类中的clickWhich方法已经实现** 2. 此单元格中包含哪些对象 **judgement中的clickKillZombie可以作为一个demo** ***上面实现的两个方法是之后要实现的碰撞判断与处理的前提*** 6. 准备修改的 1. 僵尸的生成方法,不要默认不采用指定坐标的方式生成,采用根据根据处于哪一行来生成(在具体的实现类中将行转换为纵坐标) 横坐标不需要管,因为在游戏中僵尸都是从屏幕外面走进来的 2. 规范化代码,添加更加详细的注释 **之后大家好好看一下代码吧** 3. 完善动画加载方法以及采用新动画图片 4. 实现植物类和子弹类的子类做到植物发射子弹(直线)攻击僵尸demo 5,主菜单UI 6,游戏内UI 植物选择,计分器,经济系统 ### 11.12日 ##### 已经实现: - 添加了注释 - 实现了植物类的一个子类 (机枪射手) - 实现了武器类及一个子类 ZombieBite - Bullet类 - 实现了获得一个单元格中所有实体的方法 - 实现了攻击的判断 - 实现了僵尸吃掉植物 - 待实现植物射击 ### 11.13日 ##### 实现: - 实现了植物的武器类 PeaShooter - 实现了武器类的子弹 Beans(由武器生成,作为实体存在) - 实现了子弹命中的判断 - 命中后的处理请在子弹类中实现 - 待完成: - 僵尸的生成,植物的点击放置 - 更多的植物/僵尸/子弹 - 游戏中的UI (计分,金钱,以及植物点击选择,铲子(点击后销毁植物)) - 请策划设计好植物/僵尸血量以及武器攻击速度/子弹飞行速度/伤害 ### 11.23重启计划 游戏基本框架已经完成,植物类,僵尸类等等都有实现,攻击、死亡等事件都有激发以及处理机制,近来事务繁多,项目停滞了一段时间,期间没有太大的变化,实现了点击卡片放置的功能,优化了动画的绘制以及攻击的判断,11.23日重启项目,也许原来构想的 **“英雄”** 并不会实现,但是基本的功能还是要实现的。 ##### 近期的任务: - 效果类: 此类用于在画面上绘制游戏的特效,如辣椒爆炸的火焰,毁灭菇的蘑菇云等等。 - 经济系统: 经济系统负责玩家游戏中的太阳(用于购买植物),骷髅(召唤僵尸),以及金钱(在界面中购买道具) - 分数系统: 用于储存游戏中的分数等信息,应该实现一个排行榜 - 储存系统: 使用序列化的方式储存游戏的任意时刻( **储存Stage的对象就可以了** 需要提供储存以及读取载入游戏的方法) - 关卡系统: 提供关卡的选择以及关卡的进度推进(例如什么时候生成多少僵尸,什么僵尸,什么时候过关,什么时候游戏失败等等) - 游戏准备系统: 游戏开始前的植物/僵尸选择界面,携带的道具等等,在这里应该实现选择植物卡牌并放入列表中,在游戏中只能选择这部分的植物等等 - 更多的植物/僵尸: 在已经实现的基本植物和僵尸的基础上扩展出更丰富的植物僵尸种类**大部分请采用继承实现,只改变贴图和属性(攻击力生命之类的)少数特殊植物/僵尸特殊实现** - 游戏的铲子系统:用于删除放置的僵尸或者植物,请在原来的点击死亡的方法上扩展 - 小推车😀 - 植物/僵尸/道具的卡片 卡片类(对应着对象) ###### 任务认领: 1. 吴浩杰 - 更丰富的植物/僵尸中的特殊植物/僵尸 - 小推车 - 效果类 --- ### 11.25日 #### 实现了: - 音乐播放器 可以较好的支持音效播放,但是背景音乐涉及切换功能,还需要修改 - 曲线投手植物: 卷心菜投手,之后若能找到更多的图片,还可加入其它的曲线射击植物 - 地图的滚动功能,现在地图可以左右滚动了*(为僵尸阵营做准备) - 卡片功能完善,制作了更多的卡片 #### 准备实现: - 实现地图滚动功能之后,地图的右边将作为僵尸的基地,草坪边缘会添加传送门,僵尸从传送门中被召唤出来,如果玩家选择的是僵尸阵营,玩家可以在右边放置墓碑(用于生产骷髅,召唤更多的僵尸),以及更多的僵尸增益植物... - 更丰富的植物(利用已经实现的类进行扩展) - 完善用户交互功能与界面 - 设计关卡 3关 难度 出现的僵尸/植物 - 游戏开始前准备界面 植物/僵尸选择系统 - 游戏储存功能