如何在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*寻路算法! ;)

(本系列还没有完哦,后面还有精彩的内容 ;)

时间: 2024-12-21 20:00:49

如何在Cocos2D游戏中实现A*寻路算法(六)的相关文章

如何在Cocos2D游戏中实现A*寻路算法(一)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 该篇博客由iOS课程团队的Johann Fradj发布,他现在是一个全职开发iOS的开发者.他是Hot Apps Factory(其是App Cooker的创造者)的共同创建

如何在Cocos2D游戏中实现A*寻路算法(八)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 就拿上图中左上角的情况举个栗子. 这只猫咪想要从原点(O)到左下角的对角线方块中去.如果在左边或底下(或全部都有)有墙壁并且测试穿过对角线将会切入一个墙角(或2个).所以左下

如何在Cocos2D游戏中实现A*寻路算法(四)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 检查我们的起点和终点 现在前奏已经结束了,让我们用新的实现替换moveToward方法. 我们将从瓦片坐标系中取得现有开始位置(点A)和目标位置(点B)开始.然后我们将检查是

如何在Cocos2D游戏中实现A*寻路算法(二)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 猫咪迷宫和A*概述 正如你所看到的,现在当你在地图某处触摸的时候,猫咪将会跳到你触摸方向的相邻瓦格中去. 我们想要修改为猫咪连续移动直到你点击的位置,就像一些RPG或者点击的

如何在Cocos2D游戏中实现A*寻路算法(三)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 创建开放和闭合列表 接下来我们将使用2个NSMutableArray来跟踪保存我们的开放和闭合列表. 你可能奇怪为什么不用NSMutableSet代替.好吧,这里有2个原因:

如何在Cocos2D游戏中实现A*寻路算法(七)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 那么关于对角线移动呢? 如果你想要在A*算法中允许对角线移动真是太容易了. 你只要更新如下2个函数: walkableAdjacentTilesCoordForTileCoo

如何在Cocos2D游戏中实现A*寻路算法(五)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 跟随着黄色砖块前进 现在我们已经找到了我们的路径,我们只需要让猫咪跟随它. 我们接下来要做的是记住整个路径,并且使得猫咪根据路径一步一步的移动. 在CatSprite.h中建

Flash游戏中导弹追踪的算法

算法 先看下效果吧: 代码如下: /*  请教大家一个关于势函数用到追踪和拦截的算法 有研究过的能不能指点一下! Powered By Sunday Email:happyclub@163.com */ var stepAngle:Number = 3; //角度最大增量 var tempNum:Number = 0; var radius:Number = 100; //导弹飞行半径 var M_speed:Number = 3; //导弹速度(非常量) var P_speed:Number 

如何在Cocos2D 1.0 中掩饰一个精灵(一)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 原帖来自Ray Wunderlich写的精彩的文章 How To Mask a Sprite with Cocos2D 1.0,地址在: http://www.raywenderlich.com/4421/how-to-mask-a-sprite-with-cocos2d-1-0 有时在你的游戏中,你可能需要找到便利的方法去显示精灵的一部分. 一种办法是使用第二