当前位置: 首页 > news >正文

教做家常菜的网站福田做网站福田网站建设福田建网站500

教做家常菜的网站,福田做网站福田网站建设福田建网站500,海口网约车资格证在哪里报名,岳阳建设银行网站更新日期#xff1a;2024年7月4日。 项目源码#xff1a;第五章发布#xff08;正式开始游戏逻辑的章节#xff09; 索引 简介一、寻路系统二、寻路规则#xff08;角色移动#xff09;三、寻路规则#xff08;角色攻击#xff09;四、角色移动寻路1.自定义寻路规则2.寻… 更新日期2024年7月4日。 项目源码第五章发布正式开始游戏逻辑的章节 索引 简介一、寻路系统二、寻路规则角色移动三、寻路规则角色攻击四、角色移动寻路1.自定义寻路规则2.寻角色的所有可行走地块3.寻角色到达指定地块的路径 五、角色攻击寻路1.自定义寻路规则2.寻找角色的攻击范围内的地块 六、角色登场寻路七、整合 简介 寻路系统是整个游戏最核心的功能之一角色的移动和战斗都是基于寻路系统来进行的毕竟我们的游戏有三分之一的战棋血统。 一、寻路系统 由于HTFrameworkAI模块正好支持如下我们游戏需要的寻路核心功能 1.两点间寻路2.寻可行走节点。 所以首先就是引入该模块更多信息请参阅【Unity】 HTFramework框架二十七A*寻路。 二、寻路规则角色移动 对于我们角色的移动和攻击而言移动速度和攻击距离便是其寻路计算时的最大依据。 比如移动速度10则角色初始移动能力10每移动一格地块移动能力-1当移动能力减至0时角色无法再继续移动。 同时不同类型的地块对移动能力还会产生额外的削减 1.地面-02.山体-13.森林-14.湖泊-15.雪地-26.障碍不可通行7.敌方占领地块不可通行。 这也是角色行走到山体上会被减速的功能点的实现方式。 不过一些特殊加成型要诀能够抵消地块的额外削减但是在我们的进程中特殊加成型要诀尚在构思阶段所以具体的实现我们后续一步步来。 三、寻路规则角色攻击 角色攻击是同理的不过角色攻击寻路规则跟地块类型的关系有所不同 1.地面可以跨越攻击2.山体可以跨越攻击3.森林可以跨越攻击4.湖泊可以跨越攻击5.雪地可以跨越攻击6.障碍不可跨越攻击7.敌方占领地块可以跨越攻击。 由于角色攻击寻路几乎只针对远程攻击近程攻击只能攻击身边的4格用不着寻路所以这里的可以跨越攻击及不可跨越攻击也即是指攻击时是否能够跨越该地块攻击敌人。 同理一些特殊加成型要诀能够改变如上的规则。 四、角色移动寻路 1.自定义寻路规则 要做到如上这么多自由的想法自定义寻路规则是必须的所幸HTFrameworkAI的A*寻路支持自定义寻路规则那么我们便立即开始吧继承至AStarRule即可 /// summary/// 寻路规则角色移动/// /summarypublic class MoveRule : AStarRule{/// summary/// 当前的关卡/// /summarypublic Level CurrentLevel;/// summary/// 当前寻路的角色/// /summarypublic Role CurrentRole;/// summary/// 目标地块/// /summarypublic Block TargetBlock;//寻路前对所有A*节点应用自定义规则public override void Apply(AStarNode node){//通过节点索引找到其对应的地块Block block CurrentLevel.Blocks[node.XIndex, node.YIndex];//如果地块上存在敌人阵营不同if (block.StayRole ! null block.StayRole.Camp ! CurrentRole.Camp){//则该地块不可行走node.IsCanWalk false;return;}switch (block.Type){case BlockType.Ground:// OCost 为该节点的额外估价寻路计算时将造成【移动能力】的额外削减// 此处 0则表明无额外削减node.OCost 0;node.IsCanWalk true;break;case BlockType.Moutain://山体将造成【移动能力】额外 -1node.OCost 1;node.IsCanWalk false;break;case BlockType.Forest:node.OCost 1;node.IsCanWalk true;break;case BlockType.Water:node.OCost 1;node.IsCanWalk false;break;case BlockType.Snow:node.OCost 2;node.IsCanWalk true;break;case BlockType.Obstacle://障碍将造成该地块不可行走node.IsCanWalk false;break;}}}如上的代码应该很好理解了足以可见自定义寻路规则是何其的简单。 2.寻角色的所有可行走地块 角色移动前能够根据角色自身移动速度周围地块属性等寻找出所有可以移动的地块以供玩家选择 private static MoveRule _moveRule;private static ListBlock _resultBlocks new ListBlock();/// summary/// 寻路规则移动/// /summaryprivate static MoveRule CurrentMoveRule{get{if (_moveRule null){_moveRule new MoveRule();}return _moveRule;}}/// summary/// 寻找角色的可行走地块/// /summary/// param namelevel关卡/param/// param namerole角色/parampublic static ListBlock FindWalkableBlocks(Level level, Role role){if (level null || role null || role.Speed 0){_resultBlocks.Clear();return _resultBlocks;}CurrentMoveRule.CurrentLevel level;CurrentMoveRule.CurrentRole role;//WalkableNodefinding 为 A* 寻路方法具体参阅 HTFrameworkAI//参数1role.StayBlock.Pos 寻路起点//参数2role.Speed 移动速度//参数3传入自定义寻路规则ListAStarNode nodes level.Map.WalkableNodefinding(role.StayBlock.Pos, role.Speed, CurrentMoveRule);//寻路结果为A*节点集合通过节点索引获取对应的地块即可_resultBlocks.Clear();for (int i 0; i nodes.Count; i){_resultBlocks.Add(level.Blocks[nodes[i].XIndex, nodes[i].YIndex]);}return _resultBlocks;}寻找到所有可行走地块后接下来只需要高亮这些地块即可同时让玩家可以点击选择高亮方式就取决于自己了当然这块逻辑也有涉及不过在最后的实现UI界面时讲解 比如这里的角色络英俊移动速度为7周围高亮的都是可行走的地块其他在移动范围内的便是不可行走的地块。 3.寻角色到达指定地块的路径 上一步已经寻找到了所有可移动地块如果玩家点击了其中的一个则表明期望角色移动到该地块所以需要寻角色到达该地块的路径 /// summary/// 寻找角色到达指定地块的路径/// /summary/// param namelevel关卡/param/// param namerole角色/param/// param nameblock目标地块/parampublic static ListBlock FindPathBlocks(Level level, Role role, Block block){if (level null || role null || block null){_resultBlocks.Clear();return _resultBlocks;}CurrentMoveRule.CurrentLevel level;CurrentMoveRule.CurrentRole role;//Pathfinding 为 A* 寻路方法具体参阅 HTFrameworkAI//参数1role.StayBlock.Pos 寻路起点//参数2block.Pos 寻路终点//参数3传入自定义寻路规则ListAStarNode nodes level.Map.Pathfinding(role.StayBlock.Pos, block.Pos, CurrentMoveRule);_resultBlocks.Clear();for (int i 0; i nodes.Count; i){_resultBlocks.Add(level.Blocks[nodes[i].XIndex, nodes[i].YIndex]);}return _resultBlocks;}当然这里的角色移动动画涉及到战斗系统中的内容了在我们的进程中它还不存在我们先忽略。 五、角色攻击寻路 1.自定义寻路规则 同样的角色攻击寻路也必须单独自定义一个寻路规则 /// summary/// 寻路规则角色攻击/// /summarypublic class AttackRule : AStarRule{/// summary/// 当前的关卡/// /summarypublic Level CurrentLevel;/// summary/// 当前寻路的角色/// /summarypublic Role CurrentRole;public override void Apply(AStarNode node){Block block CurrentLevel.Blocks[node.XIndex, node.YIndex];switch (block.Type){case BlockType.Obstacle://遵循我们一开始制定的规则只有【障碍】是不可跨越攻击的其他的都可//且攻击寻路时任何类型的地块均不会产生额外的削减OCost 0node.OCost 0;node.IsCanWalk false;break;default:node.OCost 0;node.IsCanWalk true;break;}}}2.寻找角色的攻击范围内的地块 角色攻击前能够根据所选要诀的攻击距离周围地块属性等寻找出所有在攻击范围内的地块 private static AttackRule _attackRule;/// summary/// 寻路规则攻击/// /summaryprivate static AttackRule CurrentAttackRule{get{if (_attackRule null){_attackRule new AttackRule();}return _attackRule;}}/// summary/// 寻找角色的攻击范围内的地块/// /summary/// param namelevel关卡/param/// param namerole角色/param/// param nameability使用的要诀/parampublic static ListBlock FindAttackableBlocks(Level level, Role role, Ability ability){if (level null || role null || ability null){_resultBlocks.Clear();return _resultBlocks;}CurrentAttackRule.CurrentLevel level;CurrentAttackRule.CurrentRole role;//参数1role.StayBlock.Pos 寻路起点//参数2ability.AttackDistance 攻击距离//参数3传入自定义寻路规则ListAStarNode nodes level.Map.WalkableNodefinding(role.StayBlock.Pos, ability.AttackDistance, CurrentAttackRule);_resultBlocks.Clear();for (int i 0; i nodes.Count; i){_resultBlocks.Add(level.Blocks[nodes[i].XIndex, nodes[i].YIndex]);}return _resultBlocks;}当然如此寻找出来的是所有在攻击距离内的地块我们只需要判断上面是否站有敌人就能搜罗出周围所有能够被攻击的敌人以供玩家选择了。 六、角色登场寻路 此处有一个难点那就是我们设定为延后登场的角色如果他的登场地块在特殊情况下被占用了一个地块只能站一个角色那么就需要基于其登场地块寻找四周的最近的空地块以便于完成登场任务 /// summary/// 以当前地块为起点寻找周围最近的没有停留角色的地块/// /summary/// param namelevel关卡/param/// param nameblock当前地块/parampublic static Block FindNullBlock(Level level, Block block){if (level null || block null || block.StayRole null)return block;//开启列表存放所有【未知地块】需检测其是否【合格】合格没有停留角色的【地面】类型地块ListBlock openList new ListBlock();//关闭列表存放所有【已知地块】HashSetBlock closeList new HashSetBlock();//相邻列表HashSetBlock neighborList new HashSetBlock();//从当前地块开始openList.Add(block);//如果存在【未知地块】while (openList.Count 0){//获取该【未知地块】同时该地块转为【已知地块】Block b openList[0];openList.RemoveAt(0);closeList.Add(b);//发现合格地块直接返回if (b.Type BlockType.Ground b.StayRole null){return b;}else{//否则获取其周围九宫格范围内的地块neighborList.Clear();GetNeighborBlock(level, b, neighborList);//检测这些地块foreach (var item in neighborList){//如果该地块不是【已知地块】将其添加到【未知地块】if (!closeList.Contains(item) !openList.Contains(b)){openList.Add(item);}}}}//如果整个关卡都搜完了还是没有空地块那......return null;}/// summary/// 获取一个地块的相邻地块九宫格/// /summary/// param namelevel关卡/param/// param nameblock地块/param/// param nameblocks缓存列表/paramprivate static void GetNeighborBlock(Level level, Block block, HashSetBlock blocks){if (level null || block null || blocks null)return;for (int i -1; i 1; i){for (int j -1; j 1; j){if (i 0 j 0)continue;Vector2Int index block.Pos new Vector2Int(i, j);if (index.x 0 index.x level.MapSize.x index.y 0 index.y level.MapSize.y){blocks.Add(level.Blocks[index.x, index.y]);}}}}七、整合 如上我们的寻路系统功能也完成得七七八八了我决定将其整合到一个静态类中 /// summary/// RPG2D实用工具/// /summarypublic static class RPG2DUtility{/// summary/// 寻路系统/// /summarypublic static class FindSystem{//我们前面编写的各种方法........}}这样的话后续调用就十分简单明了 //求得所有能够移动的地块ListBlock blocks RPG2DUtility.FindSystem.FindWalkableBlocks(_level, player);
http://www.w-s-a.com/news/135987/

相关文章:

  • 邓砚谷电子商务网站建设镇江网
  • 网站空间支持什么程序工作服款式
  • 网站单页品牌网站建设 蝌蚪5小
  • 怎么做外贸网站需注意哪些做电脑系统的网站
  • 网站建设介绍推广用语河南网站优化外包服务
  • 课程网站模板贵州省城乡与建设厅网站
  • 网站模板及源码谁家网站用户体验做的好
  • 做网站的技术要求搜索栏在wordpress菜单上位置
  • 如何给网站弄ftpwordpress怎么添加关键词描述
  • 成都工程建设信息网站金科网站建设
  • 传媒公司 网站开发厦门网站建设门户
  • 宿城区建设局网站做网站的绿色背景图
  • 网站空间托管合同 .doc网站开发团队 组建
  • 网站建设书本信息it运维服务
  • 四核网站建设设计网站流程
  • ui设计网站设计与网页制作视频教程wordpress插件漏洞利用
  • 网站建设公司排名前十做网站的最终目的
  • 选择网站开发公司的标准中国网站建设市场规模
  • 衣服网站建设策划书广州住房和城乡建设部网站
  • 微商城科技淄博网站建设优化seo
  • 杭州 网站设计制作东圃手机网站开发
  • 网站文章页内链结构不好可以改吗微信平台如何开发
  • 炫酷业务网站课程网站如何建设方案
  • 网站建设服务器可以租吗wordpress微信打赏
  • 网站制作的重要流程图大连网站优化快速排名
  • 河南省住房建设厅官方网站注册公司邮箱需要什么
  • 美橙网站注册华为手机网站建设策划方案论文
  • 河南省和建设厅网站首页在线图片翻译
  • 关于备案空壳网站清理通知去别人网站挂黑链
  • 做网站待遇世界购物平台排行榜