如何在Cocos2D游戏中实现A*寻路算法(六)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;)
免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途。同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该翻译稿之人无任何关系。谢谢合作!
然而,就像你在玩时发现的那样,你将看到一堆的问题:
- 这只猫咪看起来有点僵硬
- 这只猫咪并没有将骨头拿走
- 这只猫咪可以直接穿过狗狗(即使没有任何骨头)而不被咬
- 如果你在前一个移动还未完成时点击屏幕(从而生成了一新的移动,猫猪注),你将看到猫咪有一个奇怪的行为.
所以注意到这些有问题的部分,我们逐步将游戏逻辑(输/赢,狗狗们,骨头等等)从第一次实现的旧的逻辑中重新添加回来,让我们接下来修复这些问题.
再次添加游戏逻辑
为了修复这些问题,按如下代码替换popStepAndAnimate方法中的内容:
- (void)popStepAndAnimate
{
// Check if there is still shortestPath
if (self.shortestPath == nil) {
return;
}
// Game Logic (Win / Lose, dogs, bones, etc...)
CGPoint currentPosition = [_layer tileCoordForPosition:self.position];
if ([_layer isBoneAtTilecoord:currentPosition]) {
[[SimpleAudioEngine sharedEngine] playEffect:@"pickup.wav"];
_numBones++;
[_layer showNumBones:_numBones];
[_layer removeObjectAtTileCoord:currentPosition];
}
else if ([_layer isDogAtTilecoord:currentPosition]) {
if (_numBones == 0) {
[_layer loseGame];
self.shortestPath = nil;
return;
}
else {
_numBones--;
[_layer showNumBones:_numBones];
[_layer removeObjectAtTileCoord:currentPosition];
[[SimpleAudioEngine sharedEngine] playEffect:@"catAttack.wav"];
}
}
else if ([_layer isExitAtTilecoord:currentPosition]) {
[_layer winGame];
self.shortestPath = nil;
return;
}
else {
[[SimpleAudioEngine sharedEngine] playEffect:@"step.wav"];
}
// Check if there remains path steps to go trough
if ([self.shortestPath count] == 0) {
self.shortestPath = nil;
return;
}
// Get the next step to move to
ShortestPathStep *s = [self.shortestPath objectAtIndex:0];
CGPoint futurePosition = s.position;
CGPoint diff = ccpSub(futurePosition, currentPosition);
if (abs(diff.x) > abs(diff.y)) {
if (diff.x > 0) {
[self runAnimation:_facingRightAnimation];
}
else {
[self runAnimation:_facingLeftAnimation];
}
}
else {
if (diff.y > 0) {
[self runAnimation:_facingForwardAnimation];
}
else {
[self runAnimation:_facingBackAnimation];
}
}
// 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]];
}
没什么神奇的地方,仅仅是原来代码的一点点重构.
编译运行,你将注意到一切都正常了,除了当前一次移动未结束时再次点击屏幕后猫咪奇怪的行为.
因为这个问题和本课程主题没有真正的关系,我不会详细讲述(其实非常简单)实际的实现,但是如果你在意的话,你可以自己下载最终的 Cat Maze project 去看看到底是如何修复的.(其实原因如原作者所说的很简单,就是动画播放依赖性的问题,大家可以直接看源代码. 猫猪注)
恭喜,你已经在一个简单的Cocos2D游戏中从基础开始实现了A*寻路算法! ;)
(本系列还没有完哦,后面还有精彩的内容 ;)
如何在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游戏里操控人物点到地图某个点,然后人物自动寻路走过去)都需要用到自动寻路的功能. 本文将介绍一个经常被使用且效率理想的寻路方 ...
随机推荐
- C语言程序设计第六次作业——循环结构(2)
C语言程序设计第六次作业--循环结构(2) 之前的博客园图片没处理好,对大家说一声抱歉.希望大家能够多多指出我的错误,我来认真修改 ^ - ^ !. (1)改错题 序列求和:输入一个正实数eps,计算 ...
- 谈谈Python中的decorator装饰器,如何更优雅的重用代码
众所周知,Python本身有很多优雅的语法,让你能用一行代码写出其他语言很多行代码才能做的事情,比如: 最常用的迭代(eg: for i in range(1,10)), 列表生成式(eg: [ x* ...
- typeAliases别名
<configuration> <typeAliases> <!-- 通过package, 可以直接指定package的名字, mybatis会自动扫描你指定包下面的ja ...
- CSS中的ul与li样式详解 list-type
转自新浪博客http://blog.sina.com.cn/u/2539885750 ul和li列表是使用CSS布局页面时常用的元素.在CSS中,有专门控制列表表现的属性,常用的有list-style ...
- Safari 3D transform变换z-index层级渲染异常
(猛戳来源:http://www.zhangxinxu.com/wordpress/?p=5569)
- request.url 端口 错误
今天遇到一个很奇怪的事情,用request.url.port来获取一个请求的端口,返回是80 ,很纳闷啊我的请求上面是http://www.XX.com:8088 啊,怎么会是80啊,太不可思议了! ...
- IO复制多级目录 控制台输入文件目录然后把目录下java文件复制到 D: 并统计java个数
package cn.itcast_05; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; impor ...
- 游戏流程&游戏规则
- 3-学习GPRS_Air202(需要知道的关于Lua的一些基本的知识)
http://www.cnblogs.com/yangfengwu/p/8948935.html 学东西一定是打破沙锅学到底,有问题就解决问题,不要试图去回避或者放弃解决当前的问题,如果总是回避或 ...
- ubuntu 修改计算机名
ubuntu装好系统之后打开终端,命令行前边会有一长串名字,看起来好烦(格式为:用户名@计算机名:~$),所以改计算机名: 需要改两个文件: sudo gedit /etc/hostname sudo ...