(NO.00005)iOS实现炸弹人游戏(九):游戏主角(二)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! 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];
}
代码首先检查将要播放的动画是否和当前正在播放的动画相同,如果相同则直接退出.然后如果当前正在播放动画动作,则将其停止.
接下来为需要播放的动画创建一个永久循环的动作,然后运行该动作.
上图是玩家控制游戏主角在场景中自由行走所播放的各种动画,最后主角碰上怪物挂掉的动画也是如此.
主角类中还有一个重要的方法,应该还包括该游戏中所有怪物都需要这么一个方法,就是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实现炸弹人游戏(九):游戏主角(二)的更多相关文章
- (NO.00005)iOS实现炸弹人游戏(八):游戏主角(一)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 最近一直在做另一个RPG游戏,所以本系列迟迟没有更新,上一篇博 ...
- (NO.00005)iOS实现炸弹人游戏(三):从主场景类谈起
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我又粗粗看了下整个项目的代码,比较多: 不少类都与其他类有着千丝 ...
- (NO.00005)iOS实现炸弹人游戏(十一):怪物之火精灵
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 从本篇开始我们一次介绍一下游戏中敌人的制作过程.看过第一篇的小 ...
- (NO.00005)iOS实现炸弹人游戏(七):游戏数据的序列化表示
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 用plist列表文件来表示游戏数据 因为在这个炸弹人游戏中有很多 ...
- (NO.00005)iOS实现炸弹人游戏(五):游戏数据的初始化(二)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们现在来依次看一下上篇中提到的各个方法,首先介绍的是updat ...
- (NO.00005)iOS实现炸弹人游戏(四):游戏数据的初始化(一)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 上一篇我们初步看了一下MainScene类的初始化方法里都做了神 ...
- (NO.00005)iOS实现炸弹人游戏(二):素材选择的取舍
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 前面一篇里我们基本明确了游戏的大致玩法和特点.下面就游戏中会用到 ...
- (NO.00005)iOS实现炸弹人游戏(一):游戏的整体规划设计
在这新的系列中,我们来尝试完成一款经典的游戏:炸弹人 这是以前红白机上的炸弹人,由于游戏可玩性强,玩法又简单,在后面的机型上陆续推出了很多款续作. 在随后的触屏设备上也出现了炸弹人的模拟版,用的是模拟 ...
- (NO.00005)iOS实现炸弹人游戏(十):游戏主角(三)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 下面我们来看游戏主角类里面几个播放特殊动画的方法,首先从run ...
随机推荐
- 2015 多校联赛 ——HDU5301(技巧)
Your current task is to make a ground plan for a residential building located in HZXJHS. So you must ...
- [bzoj5015][Snoi2017]礼物
来自FallDream的博客,未经允许,请勿转载,谢谢. 热情好客的请森林中的朋友们吃饭,他的朋友被编号为 1-N,每个到来的朋友都会带给他一些礼物:.其中,第一个朋友会带给他 1 个,之后,每一个朋 ...
- [BZOJ]1052 覆盖问题(HAOI2007)
三矩形覆盖问题啊……不过听说FJOI还出过双圆覆盖问题? Description 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来, ...
- SPFA小总结
关于spfa 知识点 原始版 ---裸 应用: 一.判负环 两种方法 1.跑单源点bfs,如果某一个点入队了n-1次,存在 2.对于每个点dfs,如果此源点反被其他点更新,存在 证明:点i作为源点,d ...
- jqGrid 使用心得
参考: https://blog.csdn.net/u012411219/article/details/51315419 https://www.cnblogs.com/kissdodog/p/38 ...
- 日常实用css布局技巧汇总
1.单行完整显示,多行省略显示. .box { width: 100px; //必要 display: -webkit-box; //必要 font-size: 14px; line-heig ...
- 开源Spring解决方案--lm.solution
Github 项目地址: https://github.com/liumeng0403/lm.solution 一.说明 1.本项目未按java项目传统命名方式命名项目名,包名 如:org.xxxx. ...
- windows资源管理器中配置右键bash here
windows下安装了git后有git bash here 但是安装了cygwin没有bash here 我们可以通过修改注册表的方式自己做一个 Win10下在注册表内有一般有两个默认的 cmd 和 ...
- Node.js Smalloc
稳定性: 1 - 试验 类: smalloc 由简单内存分配器(处理扩展原始内存的分配)支持的缓存.Smalloc 有以下函数: smalloc.alloc(length[, receiver][, ...
- 纪念 参与GitHub上第一个组织
颇为起伏的一天. 今天大连的风, 甚是喧嚣. 不过,很高兴,小项目被fork了,也成功成为了一个开源贡献者. https://github.com/HostsTools 组织 上的那个Windows- ...