大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)


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

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

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

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

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

#import "CCSprite.h"
#import "Comm.h"@class MainScene;
//敌人FireSprite类
@interface FireSprite : CCSprite <RoleAcross>{@protectedMainScene *_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:nilafterDelay: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 ;) 下面我们来看游戏主角类里面几个播放特殊动画的方法,首先从run ...

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

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

  6. (NO.00005)iOS实现炸弹人游戏(六):游戏数据的初始化(三)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 现在我们来看看实际初始化地图的randomCreateMap方法 ...

  7. 炸弹人游戏开发系列(6):实现碰撞检测,设置移动步长

    前言 上文中我们实现了"玩家控制炸弹人"的功能,本文将实现碰撞检测,让炸弹人不能穿过墙.在实现的过程中会发现炸弹人移动的问题,然后会通过设置移动步长来解决. 说明 名词解释 具体状 ...

  8. [air for ios] 三小时开发一个iOS飞行射击游戏

    [air for ios] 三小时开发一个iOS飞行射击游戏 http://www.badyoo.com/index.php/2012/07/04/158/index.html 2012-07-04 ...

  9. 初学者开发iOS游戏的入门必备用书——iOS 5 cocos2d游戏开发实战(第2版)

    如果想接触iOS游戏开发,今天笔者就推荐一本"大杀器"--<iOS 5 cocos2d游戏开发实战(第2版)>(当当链接) 为零基础的"设想过自己写个电脑游戏 ...

最新文章

  1. 只能在微信浏览器打开的链接,如何查看源码
  2. Ajax中文乱码问题解决方法(服务器端用servlet)
  3. 推荐一篇讲解各种debug技术的文章,相当不错!
  4. coreData mapView #include
  5. ORA-01861: 文字与格式字符串不匹配
  6. python写入文件代码_从文件读取并写入StringIO – Python
  7. Spring WS Consume Soap Service From WSDL
  8. 计算机基础win7桌面操作,windows7基本操作方法(零基础的人教学)-win7教程
  9. Paip.最佳实践-- Buildin variale 内建变量 ,魔术变量,预定义变量,系统常量,系统变量 1
  10. android底部显示不出来,Android studio 底部的状态栏不见了如何显示
  11. 利用深度学习生成医疗报告
  12. 西安电子科技大学-随机信号分析大作业
  13. 短视频APP管理系统源码 直播系统源码
  14. java垃圾回收的方法_java垃圾回收的方法都有哪些
  15. 软件测试bug文章,软件测试技术之说一个让你印象最深的bug?
  16. 老泪纵横!伴随数代人成长的中国经典动画
  17. 全球与中国前置式翻斗车市场深度研究分析报告
  18. CSAPP拆弹实验/炸弹实验
  19. python中对数字降序和升序_该程序查找在Python中按升序或降序排列数字的最低成本...
  20. vue项目storage本地存储

热门文章

  1. C#中协变和逆变的基本概念、List和List.Select方法的命名空间
  2. codeplex网站翻译
  3. jquery.desktop.js 代码分析
  4. Wannafly挑战赛22
  5. *Codeforces587E. Duff as a Queen
  6. 灰帽黑客:正义黑客的道德规范、渗透测试、攻击方法和漏洞分析技术(第3版)
  7. [推荐]SharePoint开发WebCast
  8. 【转载】说说大型高并发高负载网站的系统架构
  9. 3. 回归的线性模型(2)
  10. linux暂停线程和恢复,是否有可能在Linux [暂停]中检测到线程已进行上下文切换?...