如何在Cocos2D游戏中实现A*寻路算法(五)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;)
免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途。同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该翻译稿之人无任何关系。谢谢合作!
跟随着黄色砖块前进
现在我们已经找到了我们的路径,我们只需要让猫咪跟随它.
我们接下来要做的是记住整个路径,并且使得猫咪根据路径一步一步的移动.
在CatSprite.h中建立一个存储路径的数组,在CatSprite的@interface的私有段内添加:
NSMutableArray *shortestPath;
然后完成CatSprite.m中的如下修改:
// Add inside the CatSprite private properties and methods section
@property (nonatomic, retain) NSMutableArray *shortestPath;
// After the CatSprite @implementation
@synthesize shortestPath;
// Inside initWithLayer
self.shortestPath = nil;
// Inside dealloc
[shortestPath release]; shortestPath = nil;
现在我们将创建一个存储整个路径并且管理开始动画的方法,在CatSprite.m中完成如下修改:
// Add inside the CatSprite private properties and methods section
- (void)constructPathAndStartAnimationFromStep:(ShortestPathStep *)step;
// Inside moveToward, comment out the pathFound BOOL
//BOOL pathFound = NO;
// Inside moveToward, replace pathFound = YES with this:
[self constructPathAndStartAnimationFromStep:currentStep];
// Also comment all of the debugging statements below that.
// Inside moveToward, replace if (!pathFound) with this:
if (self.shortestPath == nil) { // No path found
// Add this new method:
// Go backward from a step (the final one) to reconstruct the shortest computed path
- (void)constructPathAndStartAnimationFromStep:(ShortestPathStep *)step
{
self.shortestPath = [NSMutableArray array];
do {
if (step.parent != nil) { // Don't add the last step which is the start position (remember we go backward, so the last one is the origin position ;-)
[self.shortestPath insertObject:step atIndex:0]; // Always insert at index 0 to reverse the path
}
step = step.parent; // Go backward
} while (step != nil); // Until there is no more parents
for (ShortestPathStep *s in self.shortestPath) {
NSLog(@"%@", s);
}
}
注意在moveToward方法中,我们调用了一个新的方法替换了原来的在控制台中打印结果的代码,并且我们删除了pathFound变量.像往常一样,constructPathAndStartAnimationFromStep方法中的注释详细解释了实际发生了什么.
现在编译运行,如果你触摸和我们之前说过的相同的瓦块,你应该看到如下日志:
<ShortestPathStep: 0x6b37160> pos=[24;1] g=1 h=4 f=5
<ShortestPathStep: 0x6b37340> pos=[23;1] g=2 h=3 f=5
<ShortestPathStep: 0x6b37590> pos=[22;1] g=3 h=2 f=5
<ShortestPathStep: 0x6b395c0> pos=[21;1] g=4 h=3 f=7
<ShortestPathStep: 0x6b37ae0> pos=[20;1] g=5 h=4 f=9
<ShortestPathStep: 0x6b38c60> pos=[20;2] g=6 h=3 f=9
<ShortestPathStep: 0x6b36510> pos=[20;3] g=7 h=2 f=9
<ShortestPathStep: 0x6b3b850> pos=[21;3] g=8 h=1 f=9
<ShortestPathStep: 0x6b3cf30> pos=[22;3] g=9 h=0 f=9
注意它和以前是相似的,除了现在它是从开始到结束(反转以前的结果)并且存放在数组中的数据更便于我们去使用.
最后要做的事情是通过遍历shortestPath数组并且动画显示猫咪跟随的路径.为了实现这个目的,我们将创建一个方法从数组中弹出每一步的数据,使得猫咪可以移动到该位置,并且添加一个回调方法去重复调用这个方法直到路径完成.
在CatSprite.m中完成以下修改:
// Add inside the CatSprite private properties and methods section
- (void)popStepAndAnimate;
// Add to bottom of constructPathAndStartAnimationFromStep
[self popStepAndAnimate];
// Add new method
- (void)popStepAndAnimate
{
// Check if there remains path steps to go through
if ([self.shortestPath count] == 0) {
self.shortestPath = nil;
return;
}
// Get the next step to move to
ShortestPathStep *s = [self.shortestPath objectAtIndex:0];
// Prepare the action and the callback
id moveAction = [CCMoveTo actionWithDuration:0.4 position:[_layer positionForTileCoord:s.position]];
id moveCallback = [CCCallFunc actionWithTarget:self selector:@selector(popStepAndAnimate)]; // set the method itself as the callback
// Remove the step
[self.shortestPath removeObjectAtIndex:0];
// Play actions
[self runAction:[CCSequence actions:moveAction, moveCallback, nil]];
}
编译然后运行…
我们的猫咪自动移动到你点击的位置上了 :-)
如何在Cocos2D游戏中实现A*寻路算法(五)的更多相关文章
- 如何在Cocos2D游戏中实现A*寻路算法(一)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- 如何在Cocos2D游戏中实现A*寻路算法(六)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- 如何在Cocos2D游戏中实现A*寻路算法(八)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- 如何在Cocos2D游戏中实现A*寻路算法(四)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- 如何在Cocos2D游戏中实现A*寻路算法(二)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- 如何在Cocos2D游戏中实现A*寻路算法(七)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- 如何在Cocos2D游戏中实现A*寻路算法(三)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- 如何在cocos2d项目中enable ARC
如何在cocos2d项目中enable ARC 基本思想就是不支持ARC的代码用和支持ARC的分开,通过xcode中设置编译选项,让支持和不支持ARC的代码共存. cocos2d是ios app开发中 ...
- 游戏AI之A*寻路算法(3)
前言:寻路是游戏比较重要的一个组成部分.因为不仅AI还有很多地方(例如RTS游戏里操控人物点到地图某个点,然后人物自动寻路走过去)都需要用到自动寻路的功能. 本文将介绍一个经常被使用且效率理想的寻路方 ...
随机推荐
- Python3玩转儿 机器学习(4)
jupyternotebook 的使用方法¶ 最基本的使用¶ In [1]: 1+2 Out[1]: 3 菜单树¶ File¶ |------> New Notebook --- ...
- js登录,回车登录
$(document).ready(function(){ $("#loginBtn").click(doLoginEvent); loadCookies(); //回车登录 do ...
- ubuntu14.04+sublime3+latex配置
目的:用题目所说的三个东西写论文. 配置方法:参考 http://blog.csdn.net/bleedingfight/article/details/72810606, 但该博客所提的texliv ...
- js模拟form表单提交数据, js模拟a标签点击跳转,避开使用window.open引起来的浏览器阻止问题
js模拟form表单提交数据, js模拟a标签点击跳转,避开使用window.open引起来的浏览器阻止问题 js模拟form表单提交数据源码: /** * js模拟form表单提交 * @param ...
- 剑指架构师系列-Redis安装与使用
1.安装Redis 我们在VMware中安装CentOS 64位系统后,在用户目录下下载安装Redis. 下载redis目前最稳定版本也是功能最完善,集群支持最好并加入了sentinel(哨兵-高可用 ...
- 初始化mysql数据库——Activiti BPM
package com.initialize; import org.activiti.engine.ProcessEngine; import org.activiti.engine.Process ...
- C stat函数的用法举例(转载)
stat函数讲解表头文件: #include <sys/stat.h> #include <unistd.h>定义函数: int stat( ...
- Python3 输入和输出
输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数.(第三种方式是使用文件对象的 write() 方法; 标准输出文件可以用 sys.stdout 引用.) 如果你希望输 ...
- comtypes加word 2013批量将pdf转换为doc
office 2013很强大. import os import sys import re import comtypes.client wdFormatPDF = 17 def covx_to_p ...
- Nginx之(二)Nginx安装
首先从官网上http://nginx.org/下载最新的stable version源码,当前最新版本为nginx-1.10.2.tar.gz. 2.1 configure 解压之后,会发现里面有一个 ...