(NO.00005)iOS实现炸弹人游戏(九):游戏主角(二)

时间:2022-08-28 21:18:54

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.

如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)


上篇介绍了游戏主角的初始化方法,下面我们一次来实现主角的其他方法,首先来看看runAnimation方法,我们使用这个方法来播放主角的动画:

-(void)runAnimation:(CCAnimation*)animation{
    if (_curAnimation == animation) {
        return;
    }

    _curAnimation = animation;
    if (_curAnimate) {
        [self stopAction:_curAnimate];
    }

    _curAnimate = [CCActionRepeatForever actionWithAction:
                   [CCActionAnimate actionWithAnimation:animation]];
    [self runAction:_curAnimate];
}

代码首先检查将要播放的动画是否和当前正在播放的动画相同,如果相同则直接退出.然后如果当前正在播放动画动作,则将其停止.

接下来为需要播放的动画创建一个永久循环的动作,然后运行该动作.

(NO.00005)iOS实现炸弹人游戏(九):游戏主角(二)

上图是玩家控制游戏主角在场景中*行走所播放的各种动画,最后主角碰上怪物挂掉的动画也是如此.

主角类中还有一个重要的方法,应该还包括该游戏中所有怪物都需要这么一个方法,就是A*的移动算法.不熟悉A*算法的小伙伴可以到我翻译和原创的A*系列博文中观赏:

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

翻译:A*寻路算法入门(一)

该方法就是moveTowardByAStar方法:

//使用A*寻路算法移动至目标坐标
-(void)moveTowardByAStar:(CGPoint)targetLocation{
    if (_currentStepAction) {
        _pendingMove = [NSValue valueWithCGPoint:targetLocation];
        return;
    }

    CGPoint fromTileCoord = [_mainScene tileCoordForPosition:self.position];
    CGPoint toTileCoord = [_mainScene tileCoordForPosition:targetLocation];

    if (CGPointEqualToPoint(fromTileCoord, toTileCoord)) {      return;
    }

    if (![_mainScene isWalkableTile:toTileCoord forRole:self]) {
        return;
    }

    _spOpenSteps = [NSMutableArray array];
    _spClosedSteps = [NSMutableArray array];
    _shortestPath = nil;

    [StarA insertStep:[[ShortestPathStep alloc] initWithPosition:fromTileCoord]
                                                                    toOpenList:_spOpenSteps];
    do{
        ShortestPathStep *currentStep = _spOpenSteps[0];
        [_spClosedSteps addObject:currentStep];
        [_spOpenSteps removeObjectAtIndex:0];
        if (CGPointEqualToPoint(currentStep.position, toTileCoord)) {
            //如果已经找到最短路径则完成该最短路径的移动动作
            [self constructPathAndStartAnimationFromStep:currentStep];
            _spOpenSteps = nil;
            _spClosedSteps = nil;
            break;
        }

        NSArray *adjSteps = [_mainScene walkableAdjacentTilesCoordDiagonallyForTileCoord:
                                                                currentStep.position forRole:self];

        for (NSValue *v in adjSteps) {
            ShortestPathStep *step = [[ShortestPathStep alloc]initWithPosition:[v CGPointValue]];
            if ([_spClosedSteps containsObject:step]) {
                continue;
            }

            int moveCost = [StarA costToMoveDiagonallyFromStep:currentStep toAdjacentStep:step];
            NSUInteger index = [_spOpenSteps indexOfObject:step];
            if (index == NSNotFound) {
                step.parent = currentStep;
                step.gScore = currentStep.gScore + moveCost;
                step.hScore = [StarA computeHScoreFromCoord:step.position toCoord:toTileCoord];
                [StarA insertStep:step toOpenList:_spOpenSteps];
            }else{//已经存在于开放列表
                step = _spOpenSteps[index];
                if ((currentStep.gScore + moveCost) < step.gScore) {
                    step.gScore = currentStep.gScore + moveCost;
                    step.parent = currentStep;
                    [_spOpenSteps removeObjectAtIndex:index];
                    [StarA insertStep:step toOpenList:_spOpenSteps];
                }
            }
        }
    }while (_spOpenSteps.count > 0);
}

其中比较长,这里就不详细说明了,大家需要的信息上面2个系列的博文完全涵盖了.有一点要指出的是,因为我也才开始写这类代码,所以一开始对类元素的把握也不是太强,按理说这个方法是所有游戏角色都需要的,所以应该放在它们的父类中.的确是这样,我在另一个RPG游戏<<熊猫之魂>>中正是这样做的,我们有机会再叙.

(NO.00005)iOS实现炸弹人游戏(九):游戏主角(二)的更多相关文章

  1. &lpar;NO&period;00005&rpar;iOS实现炸弹人游戏&lpar;八&rpar;&colon;游戏主角&lpar;一&rpar;

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 最近一直在做另一个RPG游戏,所以本系列迟迟没有更新,上一篇博 ...

  2. &lpar;NO&period;00005&rpar;iOS实现炸弹人游戏&lpar;三&rpar;&colon;从主场景类谈起

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我又粗粗看了下整个项目的代码,比较多: 不少类都与其他类有着千丝 ...

  3. &lpar;NO&period;00005&rpar;iOS实现炸弹人游戏&lpar;十一&rpar;&colon;怪物之火精灵

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 从本篇开始我们一次介绍一下游戏中敌人的制作过程.看过第一篇的小 ...

  4. &lpar;NO&period;00005&rpar;iOS实现炸弹人游戏&lpar;七&rpar;&colon;游戏数据的序列化表示

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 用plist列表文件来表示游戏数据 因为在这个炸弹人游戏中有很多 ...

  5. &lpar;NO&period;00005&rpar;iOS实现炸弹人游戏&lpar;五&rpar;&colon;游戏数据的初始化&lpar;二&rpar;

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们现在来依次看一下上篇中提到的各个方法,首先介绍的是updat ...

  6. &lpar;NO&period;00005&rpar;iOS实现炸弹人游戏&lpar;四&rpar;&colon;游戏数据的初始化&lpar;一&rpar;

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 上一篇我们初步看了一下MainScene类的初始化方法里都做了神 ...

  7. &lpar;NO&period;00005&rpar;iOS实现炸弹人游戏&lpar;二&rpar;&colon;素材选择的取舍

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 前面一篇里我们基本明确了游戏的大致玩法和特点.下面就游戏中会用到 ...

  8. &lpar;NO&period;00005&rpar;iOS实现炸弹人游戏&lpar;一&rpar;&colon;游戏的整体规划设计

    在这新的系列中,我们来尝试完成一款经典的游戏:炸弹人 这是以前红白机上的炸弹人,由于游戏可玩性强,玩法又简单,在后面的机型上陆续推出了很多款续作. 在随后的触屏设备上也出现了炸弹人的模拟版,用的是模拟 ...

  9. &lpar;NO&period;00005&rpar;iOS实现炸弹人游戏&lpar;十&rpar;&colon;游戏主角&lpar;三&rpar;

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 下面我们来看游戏主角类里面几个播放特殊动画的方法,首先从run ...

随机推荐

  1. Node&period;js:fs文件系统模块

    fs文件系统模块,这是一个非常重要的模块,对文件的操作都基于它.该模块的所有方法都有同步和异步两种方式,下面便介绍一下该模块的使用. 1.检测当前进程对文件的权限 使用fs.access(path[, ...

  2. maven依赖本地非repository中的jar包

    依赖项的作用域 在定义项目的依赖项的时候,我们可以通过scope来指定该依赖项的作用范围.scope的取值有compile.runtime.test.provided.system和import. c ...

  3. winform实现自动更新并动态调用form实现

    winform实现自动更新并动态调用form实现 标签: winform作业dllbytenull服务器 2008-08-04 17:36 1102人阅读 评论(0) 收藏 举报  分类: c#200 ...

  4. java随机生成字符串并排序

    package com.Imooc; import java.util.ArrayList; import java.util.Collections; import java.util.List; ...

  5. c&num; switch case语句

    switch是一个控制语句,用于选择一个要执行的语句块. 一个switch语句包括一个或多个执行的语句块.每个语句块包括一个或多个case标签,case后接要执行的语句. 如下面的代码 Codeint ...

  6. Java异常处理机制以及try-catch-finally-return执行顺序

    一,简单描述: 当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用...)时,JAVA就会用异常对象来描述. 二,JAVA中用2种方法处理异常: 1.在发生异常的地方直接 ...

  7. IP路由及静态路由配置

    IP路由及静态路由配置 qianghaohao(CodingNutter) 链接来源:http://www.cnblogs.com/codingnutter/p/5654271.html 一.IP路由 ...

  8. AngularJS 1&period;x系列:AngularJS服务-Service、Factory、Provider、Value及Constant(5)

    1. AngularJS服务 AngularJS可注入类型包括:Service.Factory.Provider.Value及Constant. 2. Service AngularJS Servic ...

  9. M2贡献分分配方案

    1.初始分每个人都为0. 2.每周分配任务,按任务计分. 3.每周每个人有12.5分. 4.次周完成本周任务计6分. 5.未全部完成本周任务计6分. 6.12月29日统计分数,多出来的分数按完成任务数 ...

  10. selenium捕捉视频

    捕捉视频 有时候我们未必能够分析故障只需用日志文件或截图的帮助.有时捕获完整的执行视频帮助.让我们了解如何捕捉视频. 我们将利用Monte媒体库的执行相同. 配置 第1步:导航到URL - http: ...