中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

濟(jì)南做外貿(mào)網(wǎng)站新冠咳嗽怎么辦

濟(jì)南做外貿(mào)網(wǎng)站,新冠咳嗽怎么辦,基于html5的購(gòu)物網(wǎng)站開(kāi)發(fā),徐州網(wǎng)站制作方法更新日期:2024年7月4日。 項(xiàng)目源碼:第五章發(fā)布(正式開(kāi)始游戲邏輯的章節(jié)) 索引 簡(jiǎn)介一、尋路系統(tǒng)二、尋路規(guī)則(角色移動(dòng))三、尋路規(guī)則(角色攻擊)四、角色移動(dòng)尋路1.自定義尋路規(guī)則2.尋…

更新日期:2024年7月4日。
項(xiàng)目源碼:第五章發(fā)布(正式開(kāi)始游戲邏輯的章節(jié))

索引

  • 簡(jiǎn)介
    • 一、尋路系統(tǒng)
    • 二、尋路規(guī)則(角色移動(dòng))
    • 三、尋路規(guī)則(角色攻擊)
    • 四、角色移動(dòng)尋路
      • 1.自定義尋路規(guī)則
      • 2.尋角色的所有可行走地塊
      • 3.尋角色到達(dá)指定地塊的路徑
    • 五、角色攻擊尋路
      • 1.自定義尋路規(guī)則
      • 2.尋找角色的攻擊范圍內(nèi)的地塊
    • 六、角色登場(chǎng)尋路
    • 七、整合

簡(jiǎn)介

尋路系統(tǒng)是整個(gè)游戲最核心的功能之一,角色的移動(dòng)戰(zhàn)斗都是基于尋路系統(tǒng)來(lái)進(jìn)行的,畢竟我們的游戲有三分之一的戰(zhàn)棋血統(tǒng)。

一、尋路系統(tǒng)

由于HTFrameworkAI模塊正好支持如下我們游戲需要的尋路核心功能:

  • 1.兩點(diǎn)間尋路;
  • 2.尋可行走節(jié)點(diǎn)。

所以首先就是引入該模塊,更多信息請(qǐng)參閱:【Unity】 HTFramework框架(二十七)A*尋路。

二、尋路規(guī)則(角色移動(dòng))

對(duì)于我們角色的移動(dòng)和攻擊而言,移動(dòng)速度攻擊距離便是其尋路計(jì)算時(shí)的最大依據(jù)。

比如移動(dòng)速度=10,則角色初始移動(dòng)能力=10,每移動(dòng)一格(地塊),移動(dòng)能力-1,當(dāng)移動(dòng)能力減至0時(shí),角色無(wú)法再繼續(xù)移動(dòng)。

同時(shí),不同類(lèi)型的地塊對(duì)移動(dòng)能力還會(huì)產(chǎn)生額外的削減:

  • 1.地面:-0;
  • 2.山體:-1;
  • 3.森林:-1;
  • 4.湖泊:-1;
  • 5.雪地:-2;
  • 6.障礙:不可通行;
  • 7.敵方占領(lǐng)地塊:不可通行。

這也是角色行走到山體上會(huì)被減速的功能點(diǎn)的實(shí)現(xiàn)方式。

不過(guò),一些特殊加成型要訣能夠抵消地塊的額外削減,但是,在我們的進(jìn)程中,特殊加成型要訣尚在構(gòu)思階段,所以,具體的實(shí)現(xiàn)我們后續(xù)一步步來(lái)。

三、尋路規(guī)則(角色攻擊)

角色攻擊是同理的,不過(guò)角色攻擊尋路規(guī)則跟地塊類(lèi)型的關(guān)系有所不同:

  • 1.地面:可以跨越攻擊;
  • 2.山體:可以跨越攻擊;
  • 3.森林:可以跨越攻擊;
  • 4.湖泊:可以跨越攻擊;
  • 5.雪地:可以跨越攻擊;
  • 6.障礙:不可跨越攻擊;
  • 7.敵方占領(lǐng)地塊:可以跨越攻擊。

由于角色攻擊尋路幾乎只針對(duì)遠(yuǎn)程攻擊近程攻擊只能攻擊身邊的4格,用不著尋路),所以這里的可以跨越攻擊不可跨越攻擊也即是指攻擊時(shí)是否能夠跨越該地塊攻擊敵人。

同理,一些特殊加成型要訣能夠改變?nèi)缟系囊?guī)則。

四、角色移動(dòng)尋路

1.自定義尋路規(guī)則

要做到如上這么多自由的想法,自定義尋路規(guī)則是必須的,所幸HTFrameworkAIA*尋路支持自定義尋路規(guī)則,那么我們便立即開(kāi)始吧(繼承至AStarRule即可):

    /// <summary>/// 尋路規(guī)則(角色移動(dòng))/// </summary>public class MoveRule : AStarRule{/// <summary>/// 當(dāng)前的關(guān)卡/// </summary>public Level CurrentLevel;/// <summary>/// 當(dāng)前尋路的角色/// </summary>public Role CurrentRole;/// <summary>/// 目標(biāo)地塊/// </summary>public Block TargetBlock;//尋路前,對(duì)所有A*節(jié)點(diǎn)應(yīng)用自定義規(guī)則public override void Apply(AStarNode node){//通過(guò)節(jié)點(diǎn)索引找到其對(duì)應(yīng)的地塊Block block = CurrentLevel.Blocks[node.XIndex, node.YIndex];//如果地塊上存在敵人(陣營(yíng)不同)if (block.StayRole != null && block.StayRole.Camp != CurrentRole.Camp){//則該地塊不可行走node.IsCanWalk = false;return;}switch (block.Type){case BlockType.Ground:// OCost 為該節(jié)點(diǎn)的額外估價(jià),尋路計(jì)算時(shí)將造成【移動(dòng)能力】的額外削減// 此處 = 0,則表明無(wú)額外削減node.OCost = 0;node.IsCanWalk = true;break;case BlockType.Moutain://山體:將造成【移動(dòng)能力】額外 -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;}}}

如上的代碼應(yīng)該很好理解了,足以可見(jiàn),自定義尋路規(guī)則是何其的簡(jiǎn)單。

2.尋角色的所有可行走地塊

角色移動(dòng)前,能夠根據(jù)角色自身移動(dòng)速度周?chē)貕K屬性等,尋找出所有可以移動(dòng)的地塊以供玩家選擇:

			private static MoveRule _moveRule;private static List<Block> _resultBlocks = new List<Block>();/// <summary>/// 尋路規(guī)則(移動(dòng))/// </summary>private static MoveRule CurrentMoveRule{get{if (_moveRule == null){_moveRule = new MoveRule();}return _moveRule;}}/// <summary>/// 尋找角色的可行走地塊/// </summary>/// <param name="level">關(guān)卡</param>/// <param name="role">角色</param>public static List<Block> 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//參數(shù)1:role.StayBlock.Pos 尋路起點(diǎn)//參數(shù)2:role.Speed 移動(dòng)速度//參數(shù)3:傳入自定義尋路規(guī)則List<AStarNode> nodes = level.Map.WalkableNodefinding(role.StayBlock.Pos, role.Speed, CurrentMoveRule);//尋路結(jié)果為A*節(jié)點(diǎn)集合,通過(guò)節(jié)點(diǎn)索引獲取對(duì)應(yīng)的地塊即可_resultBlocks.Clear();for (int i = 0; i < nodes.Count; i++){_resultBlocks.Add(level.Blocks[nodes[i].XIndex, nodes[i].YIndex]);}return _resultBlocks;}

尋找到所有可行走地塊后,接下來(lái)只需要高亮這些地塊即可,同時(shí)讓玩家可以點(diǎn)擊選擇(高亮方式就取決于自己了,當(dāng)然這塊邏輯也有涉及,不過(guò)在最后的實(shí)現(xiàn)UI界面時(shí)講解):

在這里插入圖片描述

比如這里的角色絡(luò)英俊,移動(dòng)速度為7,周?chē)吡恋亩际强尚凶叩牡貕K,其他在移動(dòng)范圍內(nèi)的便是不可行走的地塊。

3.尋角色到達(dá)指定地塊的路徑

上一步已經(jīng)尋找到了所有可移動(dòng)地塊,如果玩家點(diǎn)擊了其中的一個(gè),則表明期望角色移動(dòng)到該地塊,所以需要尋角色到達(dá)該地塊的路徑:

            /// <summary>/// 尋找角色到達(dá)指定地塊的路徑/// </summary>/// <param name="level">關(guān)卡</param>/// <param name="role">角色</param>/// <param name="block">目標(biāo)地塊</param>public static List<Block> 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//參數(shù)1:role.StayBlock.Pos 尋路起點(diǎn)//參數(shù)2:block.Pos 尋路終點(diǎn)//參數(shù)3:傳入自定義尋路規(guī)則List<AStarNode> 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;}

請(qǐng)?zhí)砑訄D片描述

當(dāng)然,這里的角色移動(dòng)動(dòng)畫(huà)涉及到戰(zhàn)斗系統(tǒng)中的內(nèi)容了,在我們的進(jìn)程中它還不存在,我們先忽略。

五、角色攻擊尋路

1.自定義尋路規(guī)則

同樣的,角色攻擊尋路也必須單獨(dú)自定義一個(gè)尋路規(guī)則

    /// <summary>/// 尋路規(guī)則(角色攻擊)/// </summary>public class AttackRule : AStarRule{/// <summary>/// 當(dāng)前的關(guān)卡/// </summary>public Level CurrentLevel;/// <summary>/// 當(dāng)前尋路的角色/// </summary>public Role CurrentRole;public override void Apply(AStarNode node){Block block = CurrentLevel.Blocks[node.XIndex, node.YIndex];switch (block.Type){case BlockType.Obstacle://遵循我們一開(kāi)始制定的規(guī)則,只有【障礙】是不可跨越攻擊的,其他的都可//且攻擊尋路時(shí),任何類(lèi)型的地塊均不會(huì)產(chǎn)生額外的削減(OCost = 0)node.OCost = 0;node.IsCanWalk = false;break;default:node.OCost = 0;node.IsCanWalk = true;break;}}}

2.尋找角色的攻擊范圍內(nèi)的地塊

角色攻擊前,能夠根據(jù)所選要訣的攻擊距離周?chē)貕K屬性等,尋找出所有在攻擊范圍內(nèi)的地塊:

			private static AttackRule _attackRule;/// <summary>/// 尋路規(guī)則(攻擊)/// </summary>private static AttackRule CurrentAttackRule{get{if (_attackRule == null){_attackRule = new AttackRule();}return _attackRule;}}/// <summary>/// 尋找角色的攻擊范圍內(nèi)的地塊/// </summary>/// <param name="level">關(guān)卡</param>/// <param name="role">角色</param>/// <param name="ability">使用的要訣</param>public static List<Block> FindAttackableBlocks(Level level, Role role, Ability ability){if (level == null || role == null || ability == null){_resultBlocks.Clear();return _resultBlocks;}CurrentAttackRule.CurrentLevel = level;CurrentAttackRule.CurrentRole = role;//參數(shù)1:role.StayBlock.Pos 尋路起點(diǎn)//參數(shù)2:ability.AttackDistance 攻擊距離//參數(shù)3:傳入自定義尋路規(guī)則List<AStarNode> 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;}

當(dāng)然,如此尋找出來(lái)的是所有在攻擊距離內(nèi)的地塊,我們只需要判斷上面是否站有敵人,就能搜羅出周?chē)心軌虮还舻臄橙?#xff0c;以供玩家選擇了。

六、角色登場(chǎng)尋路

此處有一個(gè)難點(diǎn),那就是我們?cè)O(shè)定為延后登場(chǎng)的角色,如果他的登場(chǎng)地塊在特殊情況下被占用了(一個(gè)地塊只能站一個(gè)角色),那么就需要基于其登場(chǎng)地塊尋找四周的最近的空地塊,以便于完成登場(chǎng)任務(wù):

            /// <summary>/// 以當(dāng)前地塊為起點(diǎn),尋找周?chē)罱臎](méi)有停留角色的地塊/// </summary>/// <param name="level">關(guān)卡</param>/// <param name="block">當(dāng)前地塊</param>public static Block FindNullBlock(Level level, Block block){if (level == null || block == null || block.StayRole == null)return block;//開(kāi)啟列表:存放所有【未知地塊】,需檢測(cè)其是否【合格】(合格:沒(méi)有停留角色的【地面】類(lèi)型地塊)List<Block> openList = new List<Block>();//關(guān)閉列表:存放所有【已知地塊】HashSet<Block> closeList = new HashSet<Block>();//相鄰列表HashSet<Block> neighborList = new HashSet<Block>();//從當(dāng)前地塊開(kāi)始openList.Add(block);//如果存在【未知地塊】while (openList.Count > 0){//獲取該【未知地塊】,同時(shí)該地塊轉(zhuǎn)為【已知地塊】Block b = openList[0];openList.RemoveAt(0);closeList.Add(b);//發(fā)現(xiàn)合格地塊,直接返回if (b.Type == BlockType.Ground && b.StayRole == null){return b;}else{//否則,獲取其周?chē)艑m格范圍內(nèi)的地塊neighborList.Clear();GetNeighborBlock(level, b, neighborList);//檢測(cè)這些地塊foreach (var item in neighborList){//如果該地塊不是【已知地塊】,將其添加到【未知地塊】if (!closeList.Contains(item) && !openList.Contains(b)){openList.Add(item);}}}}//如果整個(gè)關(guān)卡都搜完了還是沒(méi)有空地塊,那......return null;}/// <summary>/// 獲取一個(gè)地塊的相鄰地塊(九宮格)/// </summary>/// <param name="level">關(guān)卡</param>/// <param name="block">地塊</param>/// <param name="blocks">緩存列表</param>private static void GetNeighborBlock(Level level, Block block, HashSet<Block> 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]);}}}}

七、整合

如上我們的尋路系統(tǒng)功能也完成得七七八八了,我決定將其整合到一個(gè)靜態(tài)類(lèi)中:

    /// <summary>/// RPG2D實(shí)用工具/// </summary>public static class RPG2DUtility{/// <summary>/// 尋路系統(tǒng)/// </summary>public static class FindSystem{//我們前面編寫(xiě)的各種方法........}}

這樣的話,后續(xù)調(diào)用就十分簡(jiǎn)單明了:

         //求得所有能夠移動(dòng)的地塊List<Block> blocks = RPG2DUtility.FindSystem.FindWalkableBlocks(_level, player);
http://www.risenshineclean.com/news/30510.html

相關(guān)文章:

  • 網(wǎng)站怎樣做友情鏈接佛山本地網(wǎng)站建設(shè)
  • 網(wǎng)站開(kāi)發(fā)看書(shū)湖北網(wǎng)站seo
  • 做動(dòng)漫網(wǎng)站侵權(quán)嗎揚(yáng)州網(wǎng)絡(luò)優(yōu)化推廣
  • 怎么通過(guò)微博做網(wǎng)站外鏈百度seo外包
  • wordpress游戲網(wǎng)站百度優(yōu)化推廣
  • 做網(wǎng)站賭博的推廣是不是犯罪的上海全網(wǎng)推廣
  • 公司網(wǎng)站 域名網(wǎng)絡(luò)營(yíng)銷(xiāo)成功案例有哪些
  • 商業(yè)網(wǎng)站建設(shè)的方法外國(guó)網(wǎng)站怎么進(jìn)入
  • 做圖素材網(wǎng)站開(kāi)哪個(gè)vip好熱搜榜上2023年熱門(mén)話題
  • 怎么在外管局的網(wǎng)站做延期seo服務(wù)價(jià)格表
  • 怎樣做_網(wǎng)站做seo百度網(wǎng)站的域名地址
  • 3d做號(hào)網(wǎng)站每日精選12條新聞
  • 設(shè)計(jì)前沿的網(wǎng)站東莞網(wǎng)站關(guān)鍵詞優(yōu)化公司
  • 做社群的網(wǎng)站有哪些西安百度推廣怎么做
  • wordpress html插件優(yōu)化網(wǎng)站做什么的
  • 哪家公司做網(wǎng)站最好網(wǎng)絡(luò)營(yíng)銷(xiāo)專(zhuān)業(yè)技能
  • 明年做那些網(wǎng)站致富網(wǎng)站優(yōu)化包括哪些
  • 無(wú)極網(wǎng)站站怎么有的下不了如何讓百度收錄自己信息
  • 新都網(wǎng)站開(kāi)發(fā)鄭州百度網(wǎng)站優(yōu)化排名
  • 營(yíng)銷(xiāo)網(wǎng)站的搭建磁力兔子
  • 類(lèi)似非小號(hào)的網(wǎng)站怎么做軟文推廣一般發(fā)布在哪些平臺(tái)
  • 上城網(wǎng)站建設(shè)百度快照推廣是什么意思
  • 網(wǎng)站添加視頻代碼網(wǎng)絡(luò)建站流程
  • 亞馬遜做deal的網(wǎng)站淘寶指數(shù)網(wǎng)址
  • 網(wǎng)站建設(shè)怎樣上傳程序企業(yè)網(wǎng)站營(yíng)銷(xiāo)的實(shí)現(xiàn)方式
  • 做網(wǎng)站的畢設(shè)開(kāi)題依據(jù)在線注冊(cè)網(wǎng)站
  • 如何在office做網(wǎng)站360站長(zhǎng)平臺(tái)
  • 公司網(wǎng)站維護(hù)好做嗎百度移動(dòng)端排名軟件
  • 網(wǎng)站建設(shè)外包流程網(wǎng)站排名優(yōu)化怎樣做
  • 萊蕪亓家網(wǎng)站優(yōu)化神馬網(wǎng)站關(guān)鍵詞排名價(jià)格