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

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


从本篇开始我们一次介绍一下游戏中敌人的制作过程.看过第一篇的小伙伴都知道,在炸弹人游戏中一共准备实现4种敌人.不同的怪物要有不同的特点,否则如果只是外形发生变化其余行为都一样的话,也就没有什么意思了.

我们本篇先介绍第一种,也是最普通的火焰精灵FireSprite.

首先需要找到火焰精灵对应的素材:

用TexturePacker制作成Cocos2D可以使用的纹理.

打开Xcode,新建FireSprite类,将其头文件替换为如下内容:

#import "CCSprite.h"
#import "Comm.h"

@class MainScene;
//敌人FireSprite类
@interface FireSprite : CCSprite <RoleAcross>{
@protected
    MainScene *_mainScene;
    //以下2个变量防止精灵在前一个移动未完成时再次点击屏幕后发生的诡异漂移行为.
    //当前的步进动作
    CCAction *_currentStepAction;
    //挂起的移动动作
    NSValue *_pendingMove;
    NSInteger _maxHScore;
}

@property (nonatomic,assign) NSInteger score;

@property (nonatomic,assign) BOOL canAcrossBrick;
@property (nonatomic,assign) BOOL canAcrossBomb;
@property (nonatomic,assign) BOOL isHarmless;

@property (nonatomic,assign) CGFloat speedPerStep;

-(id)initWithMainScene:(MainScene*)mainScene;

-(void)autoMoveScopeWithMaxHScore:(NSInteger)maxHScore;

-(void)fade;

-(BOOL)moveTowardByAStarSingleCall:(CGPoint)targetLocation;

+(void)initClassNames;
+(FireSprite*)randomFS:(MainScene*)mainScene;
+(Class)randomFSClass;

@end

注意该类接口的定义表示该类遵守RoleAcross协议,其在Comm.h中定义:

//角色的穿越协议
@protocol RoleAcross

-(BOOL)canAcrossBrick;          //是否可以穿过砖块
-(BOOL)canAcrossBomb;           //是否可以穿过炸弹
-(BOOL)isHarmless;              //是否是无害的(暂时只用在敌人角色上)
@optional
-(void)otherMovingWay;          //可选方法,用来实现敌人角色的特殊移动行为
@end

FireSprite类头文件和游戏主角中定义的类似,因为准备让该类成为其他所有怪物类的基类,所以我们将一些子类可能用到的实例变量放到接口声明中,并用@protected伪指令修饰.其他实例变量名称我都做了注释标明.

游戏中敌人和主角的行为是类似的,也可以移动也可以死亡等.但它们之间最主要的不同是游戏主角的移动是我们手动控制的,而游戏中怪物是靠AI自己移动的.针对这种不同我们需要修改其移动的方法,下面我么就来看看如何完成该功能.

首先因为不用考虑目标在移动时再次发生移动操作,所以我们只需要考虑一个不可重入的移动方法:

//不可以重入的AStar移动算法
-(BOOL)moveTowardByAStarSingleCall:(CGPoint)targetLocation{
    if (_currentStepAction) {
        _pendingMove = [NSValue valueWithCGPoint:targetLocation];
        return NO;
    }

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

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

//省略和游戏主角移动方法相同的代码...   

//如果fs被关在一个tile中就会发生周围没有一个邻居可达方块的死锁情况,这里只是简单让其过5秒再试一次.
        if (adjSteps.count == 0) {
            [self performSelector:@selector(autoMoveScopeWithMaxHScoreInside) withObject:nil
                       afterDelay:5.0f];
            return YES;
        }
//省略和游戏主角移动方法相同的代码...
    return YES;
}

以上代码和游戏主角的移动代码非常类似,但是做了一些小的调整,比如方法返回YES表示移动行为完成了,否则表示没有.其中处理了当怪物被关在封闭空间中会发生寻路死锁的情况.

我们知道以上代码只是A*寻路的前半部分,在下一篇中我们就来看看后半部分的编码. 下篇见.

(NO.00005)iOS实现炸弹人游戏(十一):怪物之火精灵的更多相关文章

  1. (NO.00005)iOS实现炸弹人游戏(八):游戏主角(一)

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

  2. (NO.00005)iOS实现炸弹人游戏(七):游戏数据的序列化表示

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

  3. (NO.00005)iOS实现炸弹人游戏(一):游戏的整体规划设计

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

  4. (NO.00005)iOS实现炸弹人游戏(二):素材选择的取舍

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

  5. (NO.00005)iOS实现炸弹人游戏(十):游戏主角(三)

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

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

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 上篇介绍了游戏主角的初始化方法,下面我们一次来实现主角的其他方 ...

  7. (NO.00005)iOS实现炸弹人游戏(五):游戏数据的初始化(二)

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

  8. (NO.00005)iOS实现炸弹人游戏(四):游戏数据的初始化(一)

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

  9. (NO.00005)iOS实现炸弹人游戏(三):从主场景类谈起

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

随机推荐

  1. bzoj 4033: [HAOI2015]树上染色

    Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距 ...

  2. 基于Android的高校饮水宝app

     这是一个高校饮用水配送项目,是一个毕业设计,去年的,包括了服务端和客户端,是一个不错的项目,分享一下: 随着通讯行业的迅猛发展,我国的手机用户也在不断的增加.据信息部的统计数据显示,我国已有接近7. ...

  3. inline使用

    二八法则: 1.将inline限定在最小的,最频繁调用的函数上面.这会使你的调试,二进制升级变得容易,并能将潜在的代码膨胀问题最小化,提高程序运行速度可能性最大化. 2.不要仅仅因为函数模板出现在头文 ...

  4. 文本分类学习 (五) 机器学习SVM的前奏-特征提取(卡方检验续集)

    前言: 上一篇比较详细的介绍了卡方检验和卡方分布.这篇我们就实际操刀,找到一些训练集,正所谓纸上得来终觉浅,绝知此事要躬行.然而我在躬行的时候,发现了卡方检验对于文本分类来说应该把公式再变形一般,那样 ...

  5. Python的IO编程

    原文传送门:请点击 原文传送门:请点击

  6. 转载:使用Math.floor和Math.random取随机整数

    Math.random():获取0~1随机数 Math.floor() method rounds a number DOWNWARDS to the nearest integer, and ret ...

  7. TCP 通信

    一.TCP与UDP的区别 二.ServerSocket与Socket 1 ServerSocket 以上介绍的几个构造方法中,第二个构造方法最常用. 2.Socket import java.io.* ...

  8. JVM基础

    1.基础 JDK  将java文件编译成class文件 JRE   包含JVM JVM可以进行内存管理 利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(j ...

  9. MySQL中UTF8编码的数据在cmd下乱码

    MySQL中UTF8编码的数据在cmd下乱,在数据库ide中看到的却是中文. 其实,原因是cmd用gbk的格式来显示数据,那么我们只需要将utf-8存储的数据用gbk的格式输出到cmd即可. 解决方法 ...

  10. AsyncLocal 与 async await

    大家来看一张图 先猜猜看为什么会这样 关于async await的原理 建议查看 https://blog.csdn.net/brook_shi/article/details/50803957 这篇 ...